【发布时间】:2021-08-14 23:47:12
【问题描述】:
我对流动的两种情况下变量acc的数据共享范围感到困惑。在案例 1 中,我得到以下编译错误:error: reduction variable ‘acc’ is private in outer context,而案例 2 编译没有任何问题。
根据this article在并行区域外定义的变量是共享的。
为什么添加 for-loop 并行性私有化 acc? 在这种情况下,如何累积在 for 循环中计算的结果并在线程组中分配循环的迭代空间?
案例1
float acc = 0.0f;
#pragma omp for simd reduction(+: acc)
for (int k = 0; k < MATRIX_SIZE; k++) {
float mul = alpha;
mul *= a[i * MATRIX_SIZE + k];
mul *= b[j * MATRIX_SIZE + k];
acc += mul;
}
案例2
float acc = 0.0f;
#pragma omp simd reduction(+: acc)
for (int k = 0; k < MATRIX_SIZE; k++) {
float mul = alpha;
mul *= a[i * MATRIX_SIZE + k];
mul *= b[j * MATRIX_SIZE + k];
acc += mul;
}
【问题讨论】:
标签: c++ parallel-processing openmp simd