假设您在谈论 x86(SSE等),那么支持的算术类型是 8、16、32 和 64 位整数,以及单精度和双精度浮点数。但请注意,并非所有数据类型都支持所有算术运算 - SSE 在这方面缺乏正交性。
假设 32 位整数和适当对齐的数组(16 字节对齐),那么您可以将上述循环示例实现为:
#include <emmintrin.h> // SSE2 intrinsics
int32_t a[100] __attribute__ ((aligned(16)));
// suitably aligned array
__m128i vsum = _mm_set1_epi32(0); // init vsum = { 0, 0, 0, 0 }
for (int i = 0; i < 100; i += 4)
{
__m128i v = _mm_load_si128(&a[i]); // load 4 ints from a[i]..a[i+3]
vsum = _mm_add_epi32(vsum, v); // accumulate 4 partial sums
}
// final horizontal sum of partial sums
vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 8));
int32_t sum = _mm_cvtsi128_si32(vsum); // sum = scalar sum of a[]