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

Posted

技术标签:

【中文标题】在 sse 向量 m128 中找到最大浮点数【英文标题】:finding maximum float in sse vector m128 [duplicate] 【发布时间】:2017-09-08 23:17:17 【问题描述】:

我找到了 _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);

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

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

不胜感激

【问题讨论】:

【参考方案1】:

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

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;

【讨论】:

这让我看起来很愚蠢 xD 刚开始接触那些内在的东西,完全错过了 _mm_store1_ps 。谢谢:P Larsson 和@CheckersGuy:你不想存储到内存中。使用return _mm_cvtss_f32(max4)。 (搜索Intel's intrinsics guide 的提示:float _mm 将找到返回float_mm* 内在函数)。如果您不走运,您的编译器会将其编译为 actual 存储/重新加载。 (如果您只使用 movss (store1),而不是 16 字节存储,则不需要对齐 result。) 另外,如果您没有 AVX,如果编译器没有为您优化,您可以通过仔细选择 shuffle 来保存一些 MOVAPS 指令。特别是如果你有 SSE3。水平 MAX 需要与水平 ADD 相同的随机播放,请参阅 ***.com/questions/6996764/…。 同意,_mm_cvtss_f32 可能不太可能混淆编译器。【参考方案2】:

您可以使用 DirectXMath,MS 在 _m128 上为您完成了所有工作。

【讨论】:

以上是关于在 sse 向量 m128 中找到最大浮点数的主要内容,如果未能解决你的问题,请参考以下文章

SSE 整数与浮点数练习

在汇编中将无符号字符转换为浮点数(为浮点向量计算做准备)

使用 SSE 将 4 个浮点数乘以 4 个浮点数的最有效方法是啥?

将常量浮点数加载到 SSE 寄存器中

在 m128 中用低 32 位改组高 32 位

如何将 4 个浮点数的 ps 向量转换为 4 个双精度数并存储到 pd 数组?