web-dev-qa-db-ja.com

どのフラグ-march = nativeがアクティブになるかを確認する方法は?

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

149
vartec

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

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

-vオプションも使用できます。

--helpオプションに関するドキュメントを参照できます here

136
thkala

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

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

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

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

-###-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'
18
42n4

非ネイティブクロスコンパイルの設定方法を知りたい場合、これが便利だと思いました。

ターゲットマシンで、

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

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

% gcc -march=core-avx-i ...
10
Mark Lakata

この質問に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/nullgcc -march=native -### -E - < /dev/nullの違いは、引用されているいくつかのパラメーターと、特殊文字を含まないパラメーターを除いて見当たらないため、どのような状況でこれが本当の違いをもたらすかはわかりません。

最後に、--march=nativeはgcc 4.2で導入されましたが、それ以前は認識されない引数でした。

7
Daniel Santos

gcc -march=native -mtune=native -Q --help=targetの出力からgccにフィードバックできるフラグリストを作成するスクリプトを作成しました。少しラフで効率的ではありませんが、うまくいくようです。

私が知っている1つの警告があります:等号(=)を持ち、値が意図的に削除されないオプション。

gcc -march=native -mtune=native -Q --help=target -v 2>&1 \
| grep -h "The following options" -A200 -B0 \
| tail -n +2 \
| grep -h "Known assembler" -A0 -B999 \
| head -n -2 \
| grep -v "disabled" \
| sed -r 's/\[(enabled|default)\]//g'\
| sed -r 's/\s*//g' \
| sed -r 's/\=$//g' \
| sed -r 's/<.*>//g' \
| xargs

末尾のxargsを削除して、行ごとにフラグを表示できます。

編集:出力例を含める。私のマシン(Intel(R)Core(TM)i5-4300U CPU @ 1.90GHz)で、これは私に与えます:

-m128bit-long-double -m64 -m80387 -mabi=sysv -mabm -maddress-mode=long -maes -malign-data=compat -malign-functions=0 -malign-jumps=0 -malign-loops=0 -malign-stringops -march=haswell -masm=att -mavx -mavx2 -mbmi -mbmi2 -mbranch-cost=3 -mcmodel -mcpu -mcx16 -mf16c -mfancy-math-387 -mfma -mfp-ret-in-387 -mfpmath=sse -mfsgsbase -mfunction-return=keep -mfused-madd -mfxsr -mglibc -mhard-float -mhle -mieee-fp
-mincoming-stack-boundary=0 -mindirect-branch=keep -mintel-syntax -mlarge-data-threshold=65536 -mlong-double-80 -mlzcnt -mmemcpy-strategy -mmemset-strategy -mmmx -mmovbe -mpclmul -mpopcnt -mprefer-avx128 -mprefer-vector-width=none -mpreferred-stack-boundary=0 -mpush-args -mrdrnd -mrecip -mred-zone -mregparm=6 -msahf -msse -msse2 -msse3 -msse4 -msse4.1 -msse4.2 -msse5 -mssse3 -mstack-protector-guard-offset -mstack-protector-guard-reg -mstack-protector-guard-symbol -mstack-protector-guard=tls -mstringop-strategy -mstv
-mtls-dialect=gnu -mtls-direct-seg-refs -mtune-ctrl -mtune=haswell -mveclibabi -mvzeroupper -mxsave -mxsaveopt
0
Xenhat