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

标签 c++ c parallel-processing sse ushort

我有一个 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/

相关文章:

C++ - 在不使用系统从批处理文件转换的情况下运行程序

C++11:map::lower_bound 在 Linux 中对于 2 个或更少的元素不能正常工作

java - 如何在java中并行化for循环?

c++ - 使用 boost.asio 是否可以进行标记和空间奇偶校验?

c++ - 我需要什么条件才能进一步增加 5% 的折扣?

aio_write 到文件请求后更改数据

c - 在 C 中序列化函数

c - 使用 dup2 和 strtok 将一个文件重定向到另一个文件

python - 并行 scipy.sparse 逐元素乘法

r - 使用递归函数的并行计算