どのフラグ-march = nativeがアクティブになるかを確認するにはどうすればよいですか?


165

GCC 4.3を使用してC ++アプリをコンパイルしています。私が使用している最適化フラグを手動で選択する代わりに-march=native、理論上は、コンパイルしているハードウェアに適用可能なすべての最適化フラグを追加する必要があります。しかし、どのフラグを実際に使用しているかを確認するにはどうすればよいですか?

回答:


150

次の-Q --help=targetオプションを使用できます。

gcc -march=native -Q --help=target ...

この-vオプションも役立つ場合があります。

--helpオプションに関するドキュメントはこちらでご覧いただけます


10
これは次善策であることをお勧めします。--help = targetの出力には、CPUキャッシュ情報は表示されません。このうち、eliasと42n4の両方のメソッドがリストされています。具体的には、天才にはgcc 4.9.2で、出力はこれらの含まれています:--param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512
ダニエルサントス

@DanielSantos:私のシステムでは-vcc1コマンドラインの一部としてではありますが、オプションを使用してこれらのパラメーターを表示します...
thkala

完璧ではありません。gccバージョン5.4.0(Buildroot 2017.05-rc2-00016-gc7eaf50-dirty)では、エラーが返されます:アセンブラーメッセージ:エラー:不明なアーキテクチャーネイティブエラー:認識されないオプション-march = native。だから、ルーズ-march=nativeとそれはどこでもどこでも動作します:gcc -Q --help=target
Oleg Kokorin 2017

@Oleg - GCC 5のバグのような音の問題は、GCC 7に存在していないことを
JWW

111

コマンドラインフラグを表示するには、次のコマンドを使用します。

gcc -march=native -E -v - </dev/null 2>&1 | grep cc1

特定のパラメーターで設定されたコンパイラー/プリコンパイラー定義を確認する場合は、次のようにします。

echo | gcc -dM -E - -march=native

1
この回答は、特にnative実際に何に相当するかをリストするために、受け入れられた回答と同じくらい多くの投票に値します。
Iwillnotexist Idonotexist 2017

4
したがって、クロスネイティブコンパイルを行う場合は、両方のコンパイラに定義と引数の両方をフィードする必要がありますか?または、引数は十分ですか?
hanshenrik 2017

25

それは(-###に似ています-v):

echo | gcc -### -E - -march=native 

gccの「実際の」ネイティブフラグを表示します。

コマンドを使用して、それらをより「はっきり」表示させることができます。

gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )//g'

そして、あなたは-mno- *でフラグを取り除くことができます:

gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )|( -mno-[^\ ]+)//g'

10

非ネイティブクロスコンパイルを設定する方法を知りたい場合は、次のようにすると便利です。

ターゲットマシンで、

% gcc -march=native -Q --help=target | grep march
-march=                               core-avx-i

次に、ビルドマシンでこれを使用します。

% gcc -march=core-avx-i ...

残念ながら、これにはすべてのフラグは含まれません。
Baptiste Wicht 2014年

@BaptisteWicht -march = nativeに-march = core-avx-iが含まない、この場合、またはどのフラグを含めるフラグがありますか?ありがとう!
rogerdpack 2016年

2
@rogerdpackこのコンピューター(sandybridge)では、march = sandybridgeはAVX(理由は不明)を有効にしませんが、march = nativeは有効にします。もう1つの重要な違いは、キャッシュサイズがmarch = nativeでのみ抽出されるということです
Baptiste Wicht

1
奇妙な@BaptisteWichtはここで機能するようです(私は推測します)。echo | gcc-6 -dM -E - -march=sandybridge | grep AVX #define __AVX__ 1しかし、キャッシュサイズは存在しないようです。
rogerdpack 2016

7

私はこの質問に2セントを投入し、エリアスの回答をもう少し詳細に拡張することを提案します。gcc 4.6以降、を実行gcc -march=native -v -E - < /dev/nullすると、不要な-mno-*フラグの形でスパムの量が増加します。以下はこれらを取り除きます:

gcc -march=native -v -E - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-\S+//g; s/^.* - //g;'

ただし、これが正しいことを確認したのは2つの異なるCPU(Intel Core2とAMD Phenom)だけなので、次のスクリプトを実行して、これらの-mno-*フラグをすべて安全に削除できることを確認することをお勧めします。

#!/bin/bash

gcc_cmd="gcc"

# Optionally supply path to gcc as first argument
if (($#)); then
    gcc_cmd="$1"
fi

with_mno=$(
    "${gcc_cmd}" -march=native -mtune=native -v -E - < /dev/null 2>&1 |
    grep cc1 |
    perl -pe 's/^.* - //g;'
)
without_mno=$(echo "${with_mno}" | perl -pe 's/ -mno-\S+//g;')

"${gcc_cmd}" ${with_mno}    -dM -E - < /dev/null > /tmp/gcctest.a.$$
"${gcc_cmd}" ${without_mno} -dM -E - < /dev/null > /tmp/gcctest.b.$$

if diff -u /tmp/gcctest.{a,b}.$$; then
    echo "Safe to strip -mno-* options."
else
    echo
    echo "WARNING! Some -mno-* options are needed!"
    exit 1
fi

rm /tmp/gcctest.{a,b}.$$

私は違いを発見していないgcc -march=native -v -E - < /dev/nullと、gcc -march=native -### -E - < /dev/nullいくつかのパラメータが引用されている他よりも-と私は確信して、これは任意の本当の違いはどのような状況の下ではないよので、特殊文字を含まないパラメータ。

最後に、これ--march=nativeはgcc 4.2で導入されたもので、その前は単に認識されない引数でした。


ニース、このgleansは、同様にキャッシュサイズを持っている
rogerdpack

gccバージョン5.4.0(Buildroot 2017.05-rc2-00016-gc7eaf50-dirty)が返される:エラー:不明なアーキテクチャ「ネイティブ」
Oleg Kokorin

オレグ:どんなアーチを使っていますか?「ネイティブ」は一部のアーキテクチャでのみサポートされている可能性があります。
ダニエルサントス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.