_mm_set_epi32
对所有元素使用集合内在函数是低效的。最好使用负载内在函数。有关SSE 指令在何处优于普通指令的更多信息,请参阅此讨论。如果数组是 16 字节对齐的,您可以使用_mm_load_si128
或者_mm_loadu_si128
(对于对齐的内存,它们具有几乎相同的效率),否则使用_mm_loadu_si128
. 但是对齐的内存效率更高。要获得对齐的内存,我建议使用_mm_malloc
and_mm_free
或 C11 aligned_alloc
,以便您可以正常使用free
。
要回答您的其余问题,假设您将两个向量加载到 SSE 寄存器中__m128i a
,并且__m128i b
对于 SSE 版本 >=SSE4.1,请使用
_mm_mullo_epi32(a, b);
没有 SSE4.1:
此代码是从 Agner Fog 的Vector Class Library复制的(并被此答案的原作者抄袭):
// 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)