gcc 11.4 openmp 似乎没有生成 AVX2 指令。根据之前的 stackoverflow,我做错了什么?

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

我在 popos 上使用 gcc 11.4

我尝试过的命令:

g++ -fopenmp-simd -O2 -S simd_reduction.cpp
g++ -fopenmp-simd -O2 -mavx2 -march=native -S simd_reduction.cpp

代码:

#include <omp.h>

float dot_product_simd(const float a[], const float b[], int n) {
    float dot = 0.0;
    #pragma omp parallel for simd reduction(+:dot)
    for (int i = 0; i < n; i++) {
        dot += a[i] * b[i];
    }
    return dot;
}

void multiply_arrays(const float a[], const float b[], float c[], int n) {
    #pragma omp parallel for simd safelen(8)
    for (int i = 0; i < n; i++) {
        c[i] = a[i] * b[i];
    }
}

multiply_arrays 确实可以与给定 -fopenmp-simd 的 avx2 指令一起使用。 点积减少仅使用 xmm 寄存器,因此它仅执行 128 位数学。

这个问题在以后的版本中已经修复了吗,我还需要做什么吗?

c++ gcc openmp simd avx
1个回答
0
投票

这是设计使然。浮点加法不具有关联性,改变求和值的顺序将会改变输出。默认情况下,编译器不会进行改变输出数字的优化,这意味着它们不会对点积函数进行任何向量化。很确定你的 SSE 指令正在做标量数学,而不是向量数学;标量 FP32 指令以

ss
结尾,矢量 FP32 指令以
ps
结尾。

尝试使用

-ffast-math
编译器开关。

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