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

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

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

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

-v选项也可能有用。

你可以在这里看到关于--help选项的文档。

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

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

如果你想看到编译器/预编译器通过某些参数定义设置,请执行以下操作:

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

它应该是( -###-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' 

如果你想了解如何设置一个非本地的交叉编译,我发现这很有用:

在目标机器上,

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

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

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

我要把我的两分钱投入这个问题,并build议伊莱亚斯的答案稍微更详细的扩展。 从gcc 4.6开始, gcc -march=native -v -E - < /dev/null会以多余的-mno-*标志的forms发出越来越多的垃圾邮件。 以下将删除这些:

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

不过,我只是在两个不同的CPU(Intel Core2和AMD Phenom)上validation了这个正确性,所以我还build议运行以下脚本以确保所有这些-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中引入的,在这之前它只是一个无法识别的参数。