2011-08-25 70 views
1

使用OSX的Accelerate framework,您可以訪問4路SIMD功能,您可以在其中操作矢量浮點數,矢量整數和矢量布爾值。它爲您提供4路分區,例如並且還有4路正弦,餘弦,棕褐等。什麼是OSX Accelerate框架的浮點選擇的4路SIMD版本?

對於4個浮點數的矢量浮點數,框架提供了vFloat。 對於4個布爾矢量布爾,該框架提供了vBool32

我試圖做到的是這行代碼的4路SIMD版本:

float a = ...; 
    float b = ...; 
    bool condition = ...; 

    float selected = condition ? a : b; 

在Cell處理器例如,你可以使用內建的「spu_sel(VAL1,VAL2,有條件的) 」。

我試着寫下來選擇4路爲:「?」

vFloat a = { ... }; 
vFloat b = { ... }; 
vBool32 condition = { ... }; 

vFloat selected = condition ? a : b; 

...這不是由LLVM編譯器所接受,作爲運算符不接受vBool32。 此外,在上述網頁上沒有運營商稱爲「vsel」或「vself」或類似的東西。在這個框架中是否有浮點選擇?如果是這樣,如何訪問它?

回答

2

如果你想在這個抽象層次上工作,那麼你可能不得不解決乘以1.0f或0.0f來達到預期的結果。這實際上仍然非常有效,因爲AltiVec和SSE每個時鐘週期都可以發出至少一個SIMD浮點乘法。

如果你想獲得的性能每一點雖然那麼我認爲你需要下降到本機SIMD編程和SSE4,_mm_and_ps的情況下,使用相關的內部函數(vec_sel中的AltiVec,_mm_blend_ps的情況下,在較舊的SSE實現的情況下)/ _mm_andnot_ps/_mm_or_ps)。

相關問題