对于gcc编译器,与-O2相比,在不使用任何标志进行编译时,gcc针对的是什么x86-64指令集?

ny6fqffe  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(125)

对于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或没有?

jv4diomz

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上运行。

相关问题