水平求SSE无符号字节向量的最快方法 [英] Fastest way to horizontally sum SSE unsigned byte vector

查看:79
本文介绍了水平求SSE无符号字节向量的最快方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to horizontally add a __m128i that is 16 x epi8 values. The XOP instructions would make this trivial, but I don't have those available.

当前方法是:

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是否有更好的方法?

Is there a better way with up to SSE4.1?

推荐答案

您可以使用SSE2的

You can do it with SSE2's _mm_sad_epu8 (psadbw), e.g.:

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);
}

这篇关于水平求SSE无符号字节向量的最快方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆