对于x86-64来说,有很多指令集可以加速代码的执行,下面是gcc wiki https://gcc.gnu.org/wiki/FunctionMultiVersioning中的一个列表:
- MMX
- 上交所
- SSE2
- 三级考试
- SSSE3
- 中学教育标准4.1
- 中学教育标准4.2
- POPCNT语言
- AVX
- AVX2
对于gcc编译器,与-O2
相比,在不使用任何标志进行编译时,gcc针对的是哪个x86-64指令集?
为了保持事情简单,让我们只说问题是关于gcc版本12(最近的主要)。但我想知道什么gcc命令开关/选项,我需要做,以便我可以看到我的版本的gcc版本做什么。
我假设gcc选择的是“便携式”的东西,所以这可能意味着一些缓慢的东西。但这只是我的假设...我想知道这意味着像SSE4.2或没有?
1条答案
按热度按时间jv4diomz1#
如果你没有传递命令行
-march
选项,那么你得到的是编译gcc时所选择的内容。默认值是-march=x86-64
,但是它可能被编译你的gcc的人(例如你的二进制包发行商)覆盖。参见https://gcc.gnu.org/install/configure.html并注意--with-arch
选项。你可以用
-v -Q
来编译,看看使用了什么选项。有了
-march=x86-64
,你就可以得到“最小公分母”代码,它将在每一个已知的x86-64 CPU上运行,一直追溯到AMD K8。这包括SSE 2,它是原始AMD 64规范的一部分,但不包括SSE 3或以后的任何东西。popcnt
也不包括在内。-march
选项与-O2
和-f...
标志等优化选项正交(例如-funroll-loops
)。您总是可以获得与-march
所选内容兼容的代码,无论使用什么优化选项。但是-m
标志(如-mavx
)可以允许使用-march
所暗示的功能之外的其他CPU功能,在这种情况下,您的代码只能保证在具有这些功能的CPU上运行。