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

如何查看将激活哪些标志-march=native? 我正在使用GCC 4.3编译我的C++应用程序。我使用的不是手动选择优化标志,而是-march=native,理论上应该添加适用于我编译的硬件的所有优化标志。但是如何检查它实际使用的标志呢?,gcc,g++,compiler-optimization,compiler-flags,Gcc,G++,Compiler Optimization,Compiler Flags,您可以使用-Q--help=target选项: gcc -march=native -Q --help=target ... -v选项也可以使用 您可以查看有关--help选项的文档。您可以使用-Q--help=target选项: gcc -march=native -Q --help=target ... -v选项也可以使用 您可以查看--help选项上的文档。要查看命令行标志,请使用: gcc -march=native -E -v - </dev/null 2>&1

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

gcc -march=native -Q --help=target ...
-v
选项也可以使用

您可以查看有关
--help
选项的文档。

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

gcc -march=native -Q --help=target ...
-v
选项也可以使用


您可以查看
--help
选项上的文档。

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

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

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

gcc -march=native -E -v - </dev/null 2>&1 | grep cc1
它应该是(
-###
类似于
-v
):

显示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'
它应该是(
-###
类似于
-v
):

显示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
然后在生成计算机上使用此选项:

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

如果您想了解如何设置非本机交叉编译,我发现以下内容非常有用:

在目标机器上

% gcc -march=native -Q --help=target | grep march
-march=                               core-avx-i
然后在生成计算机上使用此选项:

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

我将在这个问题上投入我的两分钱,并建议对elias的答案进行更详细的扩展。从gcc 4.6开始,运行
gcc-march=native-v-E-
会以多余的
-mno-*
标志的形式发出越来越多的垃圾邮件。以下内容将删除这些内容:

gcc -march=native -v -E - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-\S+//g; s/^.* - //g;'
我没有发现
gcc-march=native-v-E-
gcc-march=native-####-E-
之间有什么区别,除了一些被引用的参数之外——以及不包含特殊字符的参数,所以我不确定这在什么情况下会产生真正的区别


最后,请注意,
--march=native
是在gcc 4.2中引入的,在此之前,它只是一个未被认可的参数。

我将对这个问题投入两分,并建议对elias的答案进行更详细的扩展。从gcc 4.6开始,运行
gcc-march=native-v-E-
会以多余的
-mno-*
标志的形式发出越来越多的垃圾邮件。以下内容将删除这些内容:

gcc -march=native -v -E - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-\S+//g; s/^.* - //g;'
我没有发现
gcc-march=native-v-E-
gcc-march=native-####-E-
之间有什么区别,除了一些被引用的参数之外——以及不包含特殊字符的参数,所以我不确定这在什么情况下会产生真正的区别


最后,请注意,
--march=native
是在gcc 4.2中引入的,在此之前它只是一个无法识别的参数。

不幸的是,这将不包括所有的标志。@Baptistewich有哪些标志-march=native将包括-march=core-avx-i,在这种情况下,或者哪些标志?谢谢@rogerdpack在此计算机(sandybridge)上,march=sandybridge不启用AVX(不知道为什么),而march=native启用。另一个重要的区别是,缓存大小仅在3月份提取=native@BaptisteWicht奇怪的是,我想这似乎在这里起作用:
echo | gcc-6-dM-E--march=sandybridge | grep AVX#define(定义)AVX(定义)(定义)1(代码)但缓存大小似乎不存在。不幸的是,这不会包括所有的标志。@BaptisteWicht是否有-march=native将包括-march=core-AVX-i的标志,在这种情况下,或者哪些标志?谢谢@rogerdpack在此计算机(sandybridge)上,march=sandybridge不启用AVX(不知道为什么),而march=native启用。另一个重要的区别是,缓存大小仅在3月份提取=native@BaptisteWicht这在这里似乎很奇怪(我猜):
echo | gcc-6-dM-E--march=sandybridge | grep AVX#define(定义)AVX(定义)1
,但缓存大小确实似乎不存在。我认为这是次优的。--help=target的输出不显示CPU缓存信息,下面列出了elias和42n4的方法。具体来说,在Phenom上的gcc 4.9.2上,输出包括以下内容:
--param l1 cache size=64--param l1 cache line size=64--param l2 cache size=512
@DanielSantos:在我的系统上,它确实使用
-v
选项显示这些参数,尽管它是
cc1
命令行的一部分……这并不完美。在gcc版本5.4.0(Buildroot 2017.05-rc2-00016-gc7eaf50-dirty)上,它将导致返回错误:汇编程序消息:错误:未知体系结构本机错误:无法识别的选项-三月=本机。因此,松开
-march=native
,它将在以下任何地方工作:
gcc-Q--help=target
@Oleg--听起来像是gcc5中的一个bug。这个问题在GCC 7中不存在。我认为这是次优的。--help=target的输出不显示CPU缓存信息,下面列出了elias和42n4的方法。具体来说,在Phenom上的gcc 4.9.2上,输出包括以下内容:
--param l1 cache size=64--param l1 cache line size=64--param l2 cache size=512
@DanielSantos:在我的系统上,它确实使用
-v
选项显示这些参数,尽管它是
cc1
命令行的一部分……这并不完美。在gcc版本5.4.0(Buildroot 2017.05-rc2-00016-gc7eaf50-dirty)上,它将导致返回错误:汇编程序消息:错误:未知体系结构本机错误:无法识别的选项-三月=本机。因此,松开
-march=native
,它将在以下任何地方工作:
gcc-Q--help=target
@Oleg--这听起来像是