找到 sse 向量 m128 中的最大浮点数

Che*_*Guy 1 c++ simd intrinsics

我找到了以下 _m128i 的解决方案

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);
}
Run Code Online (Sandbox Code Playgroud)

返回 m128 的最大浮点数的等效函数是什么?

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

将不胜感激任何帮助

小智 5

使用您的算法,您可以将其转换为内部函数的单一大小浮点版本。并不是说这是最优的解决方案,而是这样的:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • Larsson 和@CheckersGuy:您不想存储到内存中。使用“return _mm_cvtss_f32(max4)”。(搜索[英特尔内在函数指南](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=float%20_mm)的提示:`float _mm`将找到返回`float`的`_mm*`内在函数)。如果你不幸运,你的编译器会将其编译为*实际的*存储/重新加载。(如果您只使用 `movss` (store1),而不是 16 字节存储,则不需要对齐 `result`。) (3认同)