如果我们询问-march=native扩展到什么,结果似乎应该是
$ gcc -Q -march=native --help=target | grep -E '^\s+-.*(sse|march)'
-march= corei7-avx
-mno-sse4 [disabled]
-msse [enabled]
-msse2 [enabled]
-msse2avx [disabled]
-msse3 [enabled]
-msse4 [enabled]
-msse4.1 [enabled]
-msse4.2 [enabled]
-msse4a [disabled]
-msse5
-msseregparm [disabled]
-mssse3 [enabled]但是,如果架构是直接指定的,gcc会删除它将为native启用的SSE标志,为什么?
$ gcc -Q -march=corei7-avx --help=target | grep -E '^\s+-.*sse'
-mno-sse4 [enabled]
-msse [disabled]
-msse2 [disabled]
-msse2avx [disabled]
-msse3 [disabled]
-msse4 [disabled]
-msse4.1 [disabled]
-msse4.2 [disabled]
-msse4a [disabled]
-msse5
-msseregparm [disabled]
-mssse3 [disabled]但是,用-march=corei7-avx进行编译显示,它们将被启用。
$ echo | gcc -march=corei7-avx -dM -E - | grep -i sse
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE2_MATH__ 1
#define __SSE_MATH__ 1
#define __SSE2__ 1
#define __SSSE3__ 1
#define __SSE__ 1
#define __SSE3__ 1发布于 2014-12-11 00:19:54
我猜有一点,但无论如何,这太长了,不能发表评论.
看看这个命令的输出:
$ echo | gcc -march=native -v -x c -c -而另一个:
$ echo | gcc -march=corei7-avx -v -x c -c -有趣的部分是对cc1二进制文件的调用。在-march=native情况下,它被所有目标选项替换,而不仅仅是等效的-march选项。我有一个sandybridge,所以在我的机器中它提供:
.../cc1 -march=sandybridge -mmmx -mno-3dnow -msse -msse2 -msse3 -mssse3 \
-mno-sse4a -mcx16 -msahf -mno-movbe -mno-aes -mno-sha -mpclmul \
-mpopcnt -mno-abm -mno-lwp -mno-fma -mno-fma4 -mno-xop ...然而,当您添加-march=corei7-avx或(在我的例子中是-march=sandybridge)时,没有这些特定的体系结构选项。
现在我的结论是:
-Q --help=target的输出表明是否设置了给定的编译器选项,而不是功能是否实际启用。正如发生的那样,这些特性中的一些可以以不同的方式启用或禁用。
例如,可以使用-msse以及-march=corei7-avx或-march=sandybridge启用SSE。但是,尽管指定-march=corei7-avx启用了SSE,但它并没有设置-msse选项本身。
另一方面,-march=native设置了许多选项,不仅是实际的-march,还包括可以从运行时系统获取的任何其他相关选项,例如缓存大小。
正如您已经注意到的,检查某个特定特性是打开还是关闭的正确方法是检查预定义的defines。
发布于 2015-03-11 02:23:37
这是GCC (39851)中的一个已知漏洞,它自GCC 4.5在2009年启用以来一直在运行。
https://stackoverflow.com/questions/27412838
复制相似问题