2013-02-06 46 views
1

在這個小的代碼示例:我使用_mm_srl_epi32錯了嗎?

__m128i twos = _mm_set_epi32(2,3,1,2); 
__m128i foo = _mm_set_epi32(128,128,128,128); 
__m128i shifted = _mm_srl_epi32(foo,twos); 

「平移」是滿零,而我希望它2充滿4個32位整數與值32,16,64,和32,分別。我在使用內在的錯誤嗎?

+0

如果您想要進行元素轉換,您需要AMD的XOP或Intel的AVX2指令。 – Mysticial

+0

@Mysticial我想知道......我已經遇到過很多次了,你可能希望SIMD做的某些事情在早期的SSE版本中不可用(有些甚至現在不可用),比如簡單的只有在SSE 4.1中可用的32位元素的4個元素乘法。我想知道這是否僅僅是成本的一​​個因素(將SIMD ALU集成到CPU中的成本太高)......當然他們肯定有這種東西。 – TravisG

回答

4

是的,您使用不正確。 _mm_srl_epi32()的第二個參數指定了將第一個參數移位的位數,但它不像您預期​​的那樣是矢量參數,允許您將每個32位整數移位不同的位數。相反,128位參數被截斷爲64位,所得計數用於確定要移位的位數;第一個參數中的所有4個整數都使用相同的移位量。在你的情況下,較低的64位是0x0000000100000010,它評估爲一個非常大的正數。這導致foo的所有元素都被清空爲零,因爲所有位都被移出。

在英特爾的AVX Programmer's Reference的每條指令中找到所有小細節的好地方。雖然標題可能有些不恰當,但該文檔包含所有SSE/SSE2 /.../ AVX/AVX2指令的描述以及Intel C++編譯器中可用的內部函數描述(通常也可在gcc等中找到)。在文檔中搜索_mm_srl_epi32可以清楚地說明指令的功能。