2015-06-08 54 views
2

當我運行g++ -Q --help=target時,我得到在g ++中默認啓用sse2嗎?

-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說明,即使我被告知它被禁用...這裏發生了什麼?

我正在使用gcc-4.4.7在Linux下的Xeon E5-2680上進行編譯(如果有的話)。

+1

x64規範afaik包含SSE2指令,所以如果您正在編譯x64,它們可能默認爲打開。雖然沒有解釋'--help = target'輸出。 –

+0

@ Laurbert515你編譯的i386或x86-64? – Uroc327

回答

3

如果您正在編譯64位,那麼這是完全正確和記錄的行爲。

如上所述in the gcc docs使用X86-64編譯時SSE指令集是默認啓用:

-mfpmath =單元

生成浮點算術對選定的單元單位。爲單元的選擇是:

`387'

使用標準387浮點協處理器目前大多數的芯片和稱爲仿真。用這個選項編譯的代碼幾乎可以在任何地方運行臨時結果以80位精度計算,而不是由該類型指定的精度,與其他大多數芯片相比,結果略有不同。請參閱-ffloat-store以獲取更詳細的說明。

這是i386編譯器的默認選擇。

'SSE」

使用標量浮點出現在SSE指令集運算指令。 AMD Athlon-4,Athlon-xp和Athlon-mp芯片支持Pentium3和更新的芯片。早期版本的SSE指令集僅支持單精度算術,因此雙精度算法和擴展精度算法仍然使用387.完成後期版本,僅出現在Pentium4中,未來的AMD x86-64芯片也支持雙精度算法。

對於i386編譯器,您需要使用-march = cpu-type,-msse或-msse2開關來啓用SSE擴展並使此選項有效。 對於x86-64編譯器,默認情況下啓用這些擴展。

在大多數情況下,生成的代碼應該快得多,並避免387代碼的數字不穩定性問題,但可能會破壞某些預計臨時代碼爲80位的現有代碼。

這是x86-64編譯器的默認選擇。