用 gcc 编译时,函数
sum_of_squares
返回 0。我做错了什么还是这是 gcc bug?我知道我不会处理 n 不能被 8 整除的情况。
#include <stdio.h>
#include <x86intrin.h>
int sum_of_squares(int x[], int n) {
int sum = 0;
__m256i sum8 = _mm256_set1_epi32(0);
for (int i = 0; i < n; i += 8) {
__m256i x8 = _mm256_load_si256((__m256i *)&x[i]);
x8 = _mm256_mul_epi32(x8, x8);
sum8 = _mm256_add_epi32(x8, sum8);
}
int *_sum = (int *)&sum8;
for (int i = 0; i < 8; i++) sum += _sum[i];
return sum;
}
int main() {
_Alignas(32) int x[16];
for (int i = 0; i < 15; i++) {
x[i] = i;
}
printf("%d", sum_of_squares(x, 16));
}
x8 = _mm256_mul_epi32(x8, x8);
指导并没有达到你期望的效果。它仅使用每个 64 位通道中的最低 32 位,并计算 4 个乘积,每个乘积 64 位。
要计算 8 个 32 位乘积,请考虑使用
_mm256_mullo_epi32
。
for (int i = 0; i < 15; i++)
请注意,您仅初始化 15 个数字,然后加载 16 个。
int *_sum = (int *)&sum8;
这可行,但通常会编译成缓慢的代码,矢量存储然后标量加载。
要计算向量中所有数字的水平总和,请参阅答案。