使用SSE或SSE3添加UCHAR阵列中的UCHAR值
Add uchar values in ushort array with SSE or SSE3
i有一个无符号的短dst [16] [16]矩阵和较大的无符号char src [m] [n]矩阵。
现在,我必须在SRC矩阵中访问,然后使用SSE2或SSE3添加16x16 subpatrix。
在较旧的实施中,我确定我的总价值从未大于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,因此我需要将它们存储为吸管。
我已经尝试了以下操作,但它不起作用。
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
}
我该如何解决这个问题?
编辑
谢谢保罗,但我认为您的偏移是错误的。我已经尝试了您的解决方案,并且似乎将subsatrix的行添加到错误的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位值的向量解开为8 x 16位值的两个向量,然后将两个向量添加到您的目的地:
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;
}
相关文章:
- OpenMP阵列性能较差
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 当我的阵列太大时出现分段错误
- 位阵列上的快速AND运算
- 阵列必须使用大括号封闭的初始器进行初始化
- 没有从阵列<float>到阵列<int>的可行转换
- C++动态安全 2D 交错阵列
- 将平面阵列重塑为复杂的特征类型
- 如何使用英特尔 PIN 捕获阵列的所有负载?
- 为什么我能够为阵列分配比计算机实际拥有的内存更多的内存
- 库特<<恩德尔;不适用于打印 2D 阵列
- 数组类 阵列的打印输出
- 从较小的阵列到较大的阵列的元素级转换
- 仅在大型阵列上出现合并排序分段错误
- 从阵列C++中删除重复项
- 阵列的大小在C++中是否灵活?
- 反转阵列中的正序列
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- 具有可变尺寸的 C++ 2D 阵列
- 使用SSE或SSE3添加UCHAR阵列中的UCHAR值