我在 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 位数学。
这个问题在以后的版本中已经修复了吗,我还需要做什么吗?
这是设计使然。浮点加法不具有关联性,改变求和值的顺序将会改变输出。默认情况下,编译器不会进行改变输出数字的优化,这意味着它们不会对点积函数进行任何向量化。很确定你的 SSE 指令正在做标量数学,而不是向量数学;标量 FP32 指令以
ss
结尾,矢量 FP32 指令以 ps
结尾。
尝试使用
-ffast-math
编译器开关。