我需要水平添加一个16 x epi8值的__m128i。 XOP指令会使这个琐碎的事变得微不足道,但是我没有那些可用的指令。

当前方法是:

hd = _mm_hadd_epi16(_mm_cvtepi8_epi16(sum), _mm_cvtepi8_epi16(_mm_shuffle_epi8(sum, swap)));
hd = _mm_hadd_epi16(hd, hd);
hd = _mm_hadd_epi16(hd, hd);

使用SSE4.1是否有更好的方法?

最佳答案

您可以使用SSE2的 _mm_sad_epu8 ( psadbw )完成此操作,例如:

inline uint32_t _mm_sum_epu8(const __m128i v)
{
    __m128i vsum = _mm_sad_epu8(v, _mm_setzero_si128());
    return _mm_extract_epi16(vsum, 0) + _mm_extract_epi16(vsum, 4);
}

关于c++ - 水平求SSE无符号字节 vector 的最快方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36998538/

10-11 15:23