我需要水平添加一个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/