2011-11-14 54 views
3

如何在GCC中使用SSE2? 我想使用double值。用於GCC雙重計算的SSE2

我搜索s.th.像這樣: http://vrm-vrm.blogspot.com/2009/10/gcc-intrinsics.html 只適用於雙值。

+0

你可以用'-msse'等編譯,或用'-march = native'編譯... –

+0

這就是全部?我聽說它會很複雜,必須使用內在函數。 –

+2

如果要使用顯式構造,則必須使用內在函數。使用編譯器標誌,您只需告訴編譯器,在可用時使用硬件即可,並且優化器確定這是一個不錯的選擇。與某個「-O」級別結合使用。沒有保證,但試試看並比較組件。 –

回答

4

如果要使用SSE2 double insns,則必須使用gcc -mfpmath=sse -msse2進行編譯。

單獨的選項-msse2將允許您使用SSE2內部函數,-mfpmath=sse將導致GCC爲所有FP操作發出SSE2 insns。

另請注意,矢量化啓用-O3

矢量SSE2-4 insn的優點是顯而易見的,Sandy Bridge處理器可以執行多達三個256位操作每個週期(例如4次乘法,4個增加和在它上面的一些洗牌)

但是,英特爾優化手冊推薦使用SSE甚至用於標量操作,原因包括平面註冊模式和更短的延遲,與傳統x87 insns相比。

編輯:

忘了提,對於32位代碼,您也可以增加-msseregparm,這將導致FP參數和返回通過SSE寄存器傳遞值。默認情況下,它們分別在內存和%st0上傳遞。當然,這會改變ABI,因此所有交互模塊都必須使用此選項進行編譯。

+0

如果內存正確運行,x87在64位ABI中根本不使用。 – phkahler

+0

@phkahler,是的,除了使用x87時的「長雙倍」操作,自然是如此。 – chill