gcc的-O3优化标志中的哪一个启用了“硬件加速指令”

Fua*_*uad 3 c optimization gcc

因此,基本上,对于我的项目,有一个限制,即不能使用-O3标志(我们只能使用-O2)。这样做的原因是,-O3标志显然引入了“硬件加速指令”。

gcc版本是5.4,此版本的优化标志的手册页是:this

我想包括尽可能多的-O3标志。-O3引入的标志列表为:

-finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload, -ftree-loop-vectorize, -ftree-loop-distribute-patterns, -ftree-slp-vectorize, -fvect-cost-model, -ftree-partial-pre and -fipa-cp-clone
Run Code Online (Sandbox Code Playgroud)

因此,我计划使用-O2并手动包括尽可能多的上述标志。

上面的哪些标志启用了“硬件加速指令”优化?如何通过阅读说明来判断标志是否启用了“硬件加速指令”优化?是什么构成的?

Joh*_*nck 5

所使用的指令集由-march而不是由来控制-O3。的确-O3可以更多地使用SIMD指令进行矢量化,但是-O3在代码生成过程中并未专门考虑添加或删除指令。

如果只想使用最简单的指令来编译代码,请march为您的平台选择最简单的代码。例如,-march=core2对于x86-64来说是一个保守的选择,因为它指的是相当老的Intel Core 2处理器家族。

尽管如此,Core 2仍支持MMX和SSE到SSE3和SSSE3。要禁用这些功能,请添加:

-mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-ssse3
Run Code Online (Sandbox Code Playgroud)

  • @Bob:您的助教是错误的。在64位x86-64 CPU上编译时,已经保证至少有一些SSE指令可用(最老的x86-64 CPU保证达到SSE2 IIRC),因此在-O3以下启用了SSE。您需要按照John的建议明确禁用它们,否则编译器将在`-O2`处自由使用它们。 (5认同)
  • 我不认为大多数代码甚至都不会针对x86-64使用`-mno-sse`进行编译,因为ABI需要SSE寄存器。 (2认同)