如何查看哪些标志-march = native将激活?

时间:2011-03-29 09:14:56

标签: gcc g++ compiler-optimization compiler-flags

我正在使用GCC 4.3编译我的C ++应用程序。而不是手动选择优化标志我正在使用-march=native,理论上应该添加适用于我正在编译的硬件的所有优化标志。但是我如何检查它实际使用的是哪个标志?

6 个答案:

答案 0 :(得分:132)

您可以使用-Q --help=target选项:

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

-v选项也可能有用。

您可以在--help选项here上看到相关文档。

答案 1 :(得分:84)

要查看命令行标志,请使用:

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

如果要查看编译器/预编译器定义的某些参数设置,请执行以下操作:

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

答案 2 :(得分:18)

应该是(-###类似于-v):

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

显示&#34;真实&#34; gcc的原生标志。

你可以让它们更清楚地显示出来#34;用命令:

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'

答案 3 :(得分:10)

如果您想了解如何设置非本机交叉编译,我发现这很有用:

在目标计算机上,

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

然后在构建机器上使用它:

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

答案 4 :(得分:7)

我将把这两个问题扔进这个问题,并建议对伊莱亚斯的回答稍加冗长。从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;'

但是,我只在两个不同的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中引入的,在此之前它只是一个无法识别的参数。

答案 5 :(得分:0)

我编写了一个脚本,该脚本将生成一个标志列表,准备从gcc的输出反馈回gcc -march=native -mtune=native -Q --help=target。 这有点粗糙,效率不高,但似乎可以解决问题。

我知道一个警告:故意删除带有等号(=)且没有值的选项。

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来逐行查看标志。

编辑:包括示例输出。 在我的机器上(1.90GHz的Intel(R)Core(TM)i5-4300U CPU ),这给了我

-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