在g ++中默认启用sse2吗?

时间:2015-06-08 19:33:01

标签: c++ linux gcc

当我运行g++ -Q --help=target时,我得到了

-msse2 [disabled]

但是,如果我使用默认选项创建汇编代码为

g++ -g mycode.cpp -o mycode.o; objdump -S mycode.o > default

以及带有

sse2版本

g++ -g -msse2 mycode.cpp -o mycode.sse2.o; objdump -S mycode.sse2.o > sse2

最后是带有

的非sse2版本

g++ -g -mno-sse2 mycode.cpp -o mycode.nosse2.o; objdump -S mycode.nosse2.o > nosse2

我认为defaultsse2之间基本没有区别,但defaultnosse2之间存在很大差异,所以这告诉我,默认情况下,g ++正在使用sse2指示,即使我被告知它已被禁用......这里发生了什么?

如果重要的话,我正在Linux下使用gcc-4.4.7编译Xeon E5-2680。

1 个答案:

答案 0 :(得分:5)

如果您正在为64位进行编译,那么这是完全正常的并且记录在案的行为。

如上所述in the gcc docs,在使用x86-64编译器时默认启用SSE指令集:

  

-mfpmath =单元

     

为选定的单位单位生成浮点算术。单位的选择是:

     

`387'

     

使用标准387浮点协处理器存在大部分芯片并以其他方式模拟。使用此选项编译的代码几乎无处不在。临时结果以80位精度计算,而不是由类型指定的精度,导致与大多数其他芯片相比略有不同的结果。有关详细说明,请参阅-ffloat-store。

     

这是i386编译器的默认选择。

     

`SSE'

     

使用SSE指令集中的标量浮点指令。该指令集由Pentium3和更新的芯片支持,在AMD系列中由Athlon-4,Athlon-xp和Athlon-mp芯片支持。早期版本的SSE指令集仅支持单精度算术,因此双精度和扩展精度算法仍然使用387完成。后来的版本仅出现在Pentium4中,未来的AMD x86-64芯片也支持双精度算术。

     

对于i386编译器,您需要使用-march = cpu-type,-msse或-msse2开关来启用SSE扩展并使此选项生效。 对于x86-64编译器,默认情况下会启用这些扩展名。

     

在大多数情况下,生成的代码应该快得多,并避免387代码的数值不稳定问题,但可能会破坏一些现有的代码,这些代码期望临时值为80位。

     

这是x86-64编译器的默认选择。