【问题标题】:finding maximum float in sse vector m128 [duplicate]在 sse 向量 m128 中找到最大浮点数
【发布时间】: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)

不胜感激

【问题讨论】:

    标签: c++ simd intrinsics


    【解决方案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 相同的随机播放,请参阅 stackoverflow.com/questions/6996764/…
    • 同意,_mm_cvtss_f32 可能不太可能混淆编译器。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-07-19
      • 2013-02-20
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2012-04-10
      • 2011-03-30
      • 1970-01-01
      相关资源
      最近更新 更多