2017-09-08 55 views
0

我發現_m128i發現在上證所矢量M128最大浮動

int horizontal_max_Vec4i(__m128i x) { 
    __m128i max1 = _mm_shuffle_epi32(x, _MM_SHUFFLE(0,0,3,2)); 
    __m128i max2 = _mm_max_epi32(x,max1); 
    __m128i max3 = _mm_shuffle_epi32(max2, _MM_SHUFFLE(0,0,0,1)); 
    __m128i max4 = _mm_max_epi32(max2,max3); 
    return _mm_cvtsi128_si32(max4); 
} 

以下解決方案會是什麼一個返回M128的最大浮動同等功能?

(我可以使用SSE和AVX的任何版本)

希望得到任何幫助

回答

3

使用你的算法,你可以只把它翻譯成內部函數的單級浮點版本。不是說這是最優化的解決方案,但這樣的事情:

float horizontal_max_Vec4(__m128 x) { 
    __m128 max1 = _mm_shuffle_ps(x, x, _MM_SHUFFLE(0,0,3,2)); 
    __m128 max2 = _mm_max_ps(x, max1); 
    __m128 max3 = _mm_shuffle_ps(max2, max2, _MM_SHUFFLE(0,0,0,1)); 
    __m128 max4 = _mm_max_ps(max2, max3); 
    float result = _mm_cvtss_f32(max4); 
    return result; 
} 
+0

這讓我看起來很蠢xD剛開始時那些內在的,完全錯過了_mm_store1_ps。謝謝:P – CheckersGuy

+2

Larsson和@CheckersGuy:你不想存儲到內存中。使用'return _mm_cvtss_f32(max4)'。 (提示搜索[英特爾內部函數指南](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=float%20_mm):'float _mm'將會找到'_mm *'返回'float'的內在函數)。如果你不走運,你的編譯器會把它編譯成* actual * store/reload。 (如果你只使用movss(store1)而不是16字節存儲,你不需要'結果'對齊。) –

+1

另外,如果你沒有AVX,你可以保存一些MOVAPS如果編譯器沒有爲您優化這些指令,請仔細選擇shuffle。特別是如果你有SSE3。水平MAX需要與水平ADD相同的洗牌,所以請參閱https://stackoverflow.com/questions/6996764/fastest-way-to-do-horizo​​ntal-float-vector-sum-on-x86。 –

0

您可以使用DirectXMath,MS做的每一件事情對你_m128。