使用集合内在函数,例如_mm_set_epi32
对于所有元素来说都是低效的。最好使用加载内在函数。有关更多信息,请参阅此讨论SSE指令优于普通指令的地方 https://stackoverflow.com/questions/10313397/where-does-the-sse-instructions-outperform-normal-instructions。如果数组是 16 字节对齐的,您可以使用_mm_load_si128
or _mm_loadu_si128
(对于对齐的内存,它们具有几乎相同的效率)否则使用_mm_loadu_si128
。但对齐内存的效率要高得多。为了获得对齐的内存,我建议_mm_malloc
and _mm_free
,或C11aligned_alloc
所以你可以使用正常的free
.
为了回答您的其余问题,我们假设您已将两个向量加载到 SSE 寄存器中__m128i a
and __m128i b
对于SSE版本>=SSE4.1使用
_mm_mullo_epi32(a, b);
没有SSE4.1:
此代码复制自 Agner Fog 的矢量类库 http://www.agner.org/optimize/#vectorclass(被本答案原作者抄袭):
// Vec4i operator * (Vec4i const & a, Vec4i const & b) {
// #ifdef
__m128i a13 = _mm_shuffle_epi32(a, 0xF5); // (-,a3,-,a1)
__m128i b13 = _mm_shuffle_epi32(b, 0xF5); // (-,b3,-,b1)
__m128i prod02 = _mm_mul_epu32(a, b); // (-,a2*b2,-,a0*b0)
__m128i prod13 = _mm_mul_epu32(a13, b13); // (-,a3*b3,-,a1*b1)
__m128i prod01 = _mm_unpacklo_epi32(prod02,prod13); // (-,-,a1*b1,a0*b0)
__m128i prod23 = _mm_unpackhi_epi32(prod02,prod13); // (-,-,a3*b3,a2*b2)
__m128i prod = _mm_unpacklo_epi64(prod01,prod23); // (ab3,ab2,ab1,ab0)