我需要水平添加一个 __m128i
,它是 16 x epi8 值。 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_cvtsi128_si32(vsum) + _mm_extract_epi16(vsum, 4);
}
如果您要对多个字节 vector 求和,请在 vsum
结果上使用 _mm_add_epi32
(或 64),只对两个 32 (或 64 位)最后减半到标量一次。
关于c++ - 水平求和 SSE 无符号字节 vector 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36998538/