2010-07-29 36 views
13

我正在尋找最有效的方法來翻轉包裝在SSE註冊中的所有四個浮標上的標誌。在包裝好的SSE浮標上翻轉標誌

我還沒有在英特爾架構軟件開發手冊中找到這樣做的內在原因。以下是我已經嘗試過的事情。

對於每種情況,我循環遍歷代碼100億次,並獲得指定的掛牆時間。我試圖至少匹配4秒,這需要使用我的非SIMD方法,即使用一元減法運算符。


[48秒]
_mm_sub_ps(_mm_setzero_ps(), vec);


[32秒]
_mm_mul_ps(_mm_set1_ps(-1.0f), vec);


[9秒]

union NegativeMask { 
    int intRep; 
    float fltRep; 
} negMask; 
negMask.intRep = 0x80000000; 

_mm_xor_ps(_mm_set1_ps(negMask.fltRep), vec); 


編譯器是gcc 4.2 -O3 。 CPU是Intel Core 2 Duo。

回答

4

只是爲了通過這些內置矢量GCC的文檔完成你自己的答案:

The types defined in this manner can be used with a subset of normal C 
operations. Currently, GCC will allow using the following operators on 
these types: `+, -, *, /, unary minus, ^, |, &, ~'. 

這可能是一個好主意,始終堅持這些可能的情況下。非常高的機會gcc總是會爲這個SSE提供最有效的代碼。

對於您的編譯器選項,添加更多特定於您的體系結構的內容,在大多數情況下,將會執行類似-march=native的操作。

2

大約在早上編碼,直到凌晨3點一個生命的教訓.....

我從來沒有嘗試過只用在我的緊縮向量一元減。這實際上編譯並具有與非SIMD方法完全相同的性能。

+5

要小心的是 - 使用特定的GCC的擴展這樣的,這使得代碼不可移植。 – 2010-08-02 21:18:15

+0

你看過這個代碼生成了嗎? – Aktau 2014-09-30 19:23:58

21

這是不是真的需要工會,所有世界上最好(可讀性,速度和便攜性)的:

_mm_xor_ps(vec, _mm_set1_ps(-0.f))