我有一个使用 SSE 做很多事情的函数,分析器显示我用来计算水平最小值和最大值的代码部分消耗了大部分时间。

例如,我一直在使用以下实现:

static inline int16_t hMin(__m128i buffer) {
    buffer = _mm_min_epi8(buffer, _mm_shuffle_epi8(buffer, m1));
    buffer = _mm_min_epi8(buffer, _mm_shuffle_epi8(buffer, m2));
    buffer = _mm_min_epi8(buffer, _mm_shuffle_epi8(buffer, m3));
    buffer = _mm_min_epi8(buffer, _mm_shuffle_epi8(buffer, m4));
    return ((int8_t*) ((void *) &buffer))[0];
}

如您所见,我需要计算 16 个 1 字节整数的最小值和最大值。

任何好的建议都非常感谢:)

谢谢

最佳答案

我建议两个改变:

  • ((int8_t*) ((void *) &buffer))[0] 替换 _mm_cvtsi128_si32
  • _mm_shuffle_epi8 替换为 _mm_shuffle_epi32/_mm_shufflelo_epi16,它们在最近的 AMD 处理器和 Intel Atom 上具有较低的延迟,并且可以节省内存加载操作:
    static inline int16_t hMin(__m128i buffer)
    {
        buffer = _mm_min_epi8(buffer, _mm_shuffle_epi32(buffer, _MM_SHUFFLE(3, 2, 3, 2)));
        buffer = _mm_min_epi8(buffer, _mm_shuffle_epi32(buffer, _MM_SHUFFLE(1, 1, 1, 1)));
        buffer = _mm_min_epi8(buffer, _mm_shufflelo_epi16(buffer, _MM_SHUFFLE(1, 1, 1, 1)));
        buffer = _mm_min_epi8(buffer, _mm_srli_epi16(buffer, 8));
        return (int8_t)_mm_cvtsi128_si32(buffer);
    }
    
  • 关于c++ - 使用 SSE 的水平最小值和最大值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22256525/

    10-15 15:45