首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么‘`gcc -进军=corei7-avx--帮助=目标’谎言?

为什么‘`gcc -进军=corei7-avx--帮助=目标’谎言?
EN

Stack Overflow用户
提问于 2014-12-10 23:31:48
回答 2查看 1.4K关注 0票数 6

如果我们询问-march=native扩展到什么,结果似乎应该是

代码语言:javascript
复制
$ 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标志,为什么?

代码语言:javascript
复制
 $ 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进行编译显示,它们将被启用。

代码语言:javascript
复制
$ 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-11 00:19:54

我猜有一点,但无论如何,这太长了,不能发表评论.

看看这个命令的输出:

代码语言:javascript
复制
$ echo | gcc -march=native -v -x c -c -

而另一个:

代码语言:javascript
复制
$ echo | gcc -march=corei7-avx -v -x c -c -

有趣的部分是对cc1二进制文件的调用。在-march=native情况下,它被所有目标选项替换,而不仅仅是等效的-march选项。我有一个sandybridge,所以在我的机器中它提供:

代码语言:javascript
复制
.../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

票数 3
EN

Stack Overflow用户

发布于 2015-03-11 02:23:37

这是GCC (39851)中的一个已知漏洞,它自GCC 4.5在2009年启用以来一直在运行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27412838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档