当我运行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
我认为default
和sse2
之间基本没有区别,但default
和nosse2
之间存在很大差异,所以这告诉我,默认情况下,g ++正在使用sse2
指示,即使我被告知它已被禁用......这里发生了什么?
如果重要的话,我正在Linux下使用gcc-4.4.7编译Xeon E5-2680。
答案 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编译器的默认选择。