2017-09-08 58 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。