首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SSE或SSE3在ushort数组中添加uchar值

使用SSE或SSE3在ushort数组中添加uchar值
EN

Stack Overflow用户
提问于 2012-11-09 18:06:59
回答 1查看 411关注 0票数 3

我有一个没有符号的短dst16矩阵和一个更大的无符号字符srcm矩阵。

现在,我必须访问src矩阵,并使用SSE2SSE3向dst添加一个16x16子矩阵。

在旧的实现中,我确信我的求和值永远不会大于256,所以我可以这样做:

代码语言:javascript
复制
for (int row = 0; row < 16; ++row)
{
    __m128i subMat = _mm_lddqu_si128(reinterpret_cast<const __m128i*>(src));
    dst[row] = _mm_add_epi8(dst[row], subMat);
    src += W; // Step to the next row I need to add
}

其中W是到达所需行的偏移量。这段代码可以工作,但现在我在src中的值更大,之和可能大于256,所以我需要将它们存储为ushort。

我试过以下几种方法,但不起作用。

代码语言:javascript
复制
for (int row = 0; row < 16; ++row)
{
    __m128i subMat = _mm_lddqu_si128(reinterpret_cast<const __m128i*>(src));
    dst[row] = _mm_add_epi16(dst[row], subMat);
    src += W; // Step to the next row I need to add
}

我该如何解决这个问题?

编辑

谢谢保罗,但我认为你的补偿是错的。我已经尝试过您的解决方案,似乎子矩阵的行被添加到错误的dst行中。我希望正确的解决办法是:

代码语言:javascript
复制
for (int row = 0; row < 32; row += 2)
{
    __m128i subMat = _mm_lddqu_si128(reinterpret_cast<const __m128i*>(src));
    __m128i subMatLo = _mm_unpacklo_epi8(subMat, _mm_set1_epi8(0));
    __m128i subMatHi = _mm_unpackhi_epi8(subMat, _mm_set1_epi8(0));
    dst[row] = _mm_add_epi16(dst[row], subMatLo);
    dst[row + 1] = _mm_add_epi16(dst[row + 1], subMatHi);
    src += W;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-10 10:58:40

您需要将16x8位值的向量解压缩为两个8x16位值的向量,然后将这两个向量添加到目标:

代码语言:javascript
复制
for (int row = 0; row < 16; ++row)
{
    __m128i subMat = _mm_lddqu_si128(reinterpret_cast<const __m128i*>(src));
    __m128i subMatLo = _mm_unpacklo_epi8(subMat, _mm_set1_epi8(0));
    __m128i subMatHi = _mm_unpackhi_epi8(subMat, _mm_set1_epi8(0));
    dst[row] = _mm_add_epi16(dst[row], subMatLo);
    dst[row + 1] = _mm_add_epi16(dst[row + 1], subMatHi);
    src += W;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13313572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档