gpt4 book ai didi

c - 为什么 `gcc -Q -march=corei7-avx --help=target` 是谎言?

转载 作者:太空狗 更新时间:2023-10-29 17:22:48 35 4
gpt4 key购买 nike

如果我们查询 -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

最佳答案

我猜了一点,但无论如何,这对于评论来说太长了......

看看这个命令的输出:

$ 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 的输出告诉您是否设置了给定的编译器选项,而不是是否实际启用了功能。碰巧的是,其中一些功能可以通过不同的方式启用或禁用。

例如,SSE 可以通过 -msse 启用,也可以通过 -march=corei7-avx-march=sandybridge 启用。但是,虽然指定 -march=corei7-avx 启用 SSE,但它不会设置 -msse 选项本身

另一方面,-march=native 设置了很多选项,不仅是实际的 -march,还有任何其他可以从运行时获取的相关选项系统,例如缓存大小。

正如您已经注意到的那样,检查特定功能是打开还是关闭的正确方法是检查预定义的 defines

关于c - 为什么 `gcc -Q -march=corei7-avx --help=target` 是谎言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27412838/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com