感谢this post,我找到了如何将4个32位整数相乘的方法。

我现在想做的就是总结结果。如何使用内在函数做到这一点?我可以访问SSE,SSE2和AVX。我最初的想法是将res卸载到一个int数组中并求和第一个和第三个元素,但是我想知道是否有更好的方法。

这就是我的代码

__m128i tmp1 = _mm_mul_epu32(a,b); /* mul 2,0*/
__m128i tmp2 = _mm_mul_epu32( _mm_srli_si128(a,4), _mm_srli_si128(b,4)); /* mul 3,1 */
__m128i res = _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE (0,0,2,0)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE (0,0,2,0)));

最佳答案

如果您只想进行水平加法,即将结果向量中的所有4个32位int元素求和,则只需将其移位并相加两次,然后提取一个元素即可,例如:

__m128i vsum = _mm_add_epi32(v, _mm_srli_si128(v, 8));
vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 4));
int32_t sum = _mm_cvtsi128_si32(vsum);

关于c - SSE 4个32位整数的乘法和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30288795/

10-12 16:15