【发布时间】:2015-07-29 02:34:22
【问题描述】:
感谢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)));
【问题讨论】:
-
关于乘法,既然你有AVX,你只需要
__m128i res = _mm_mullo_epi32(a, b)。 -
您能否说明您受限于哪些 CPU 系列? SSE、SS2 和 AVX 似乎只是一个不太可能的组合 - 你确定你没有 SSE3、SSSE3、SSE4 等吗?
-
SSE 是无意义的,因为它不支持整数 SIMD 操作。
-
严格来说 SSE 确实 有整数 SIMD 指令,但仅适用于 64 位向量,而不是 128 位。 “SSE”也可以是所有各种 SSE* 指令集的统称,所以我认为我们可以在这里允许它。 ;-)