gpt4 book ai didi

c++ - 使用 SSE 或 SSE3 在 ushort 数组中添加 uchar 值

转载 作者:太空狗 更新时间:2023-10-29 21:25:50 28 4
gpt4 key购买 nike

我有一个 unsigned short dst[16][16] 矩阵和一个更大的 unsigned char src[m][n] 矩阵。

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

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

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。

我已经尝试了以下方法,但它不起作用。

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 行。我希望正确的解决方案是这样的:

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

最佳答案

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

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

关于c++ - 使用 SSE 或 SSE3 在 ushort 数组中添加 uchar 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13313572/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com