我有一个没有符号的短dst16矩阵和一个更大的无符号字符srcm矩阵。
现在,我必须访问src矩阵,并使用SSE2或SSE3向dst添加一个16x16子矩阵。
在旧的实现中,我确信我的求和值永远不会大于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;
}发布于 2012-11-10 10:58:40
您需要将16x8位值的向量解压缩为两个8x16位值的向量,然后将这两个向量添加到目标:
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;
}https://stackoverflow.com/questions/13313572
复制相似问题