这是 gcc 错误吗?

问题描述 投票:0回答:1

用 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));
}
c gcc x86 simd avx
1个回答
0
投票

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;

这可行,但通常会编译成缓慢的代码,矢量存储然后标量加载。
要计算向量中所有数字的水平总和,请参阅答案

© www.soinside.com 2019 - 2024. All rights reserved.