gpt4 book ai didi

c++ - 错误 : reduction variable is private in outer context (omp reduction)

转载 作者:行者123 更新时间:2023-12-04 14:57:10 24 4
gpt4 key购买 nike

我对流动的两种情况下变量 acc 的数据共享范围感到困惑。在情况 1 中,我收到以下编译错误:error: reduction variable ‘acc’ is private in outer context ,而案例 2 编译时没有任何问题。
根据this article在并行区域之外定义的变量是共享的。
为什么添加 for 循环并行性将 acc 私有(private)化?
在这种情况下,我如何累积在 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;
}


最佳答案

您的案例 1 违反了 OpenMP 语义,因为有一个隐含的并行区域(请参阅 OpenMP Language Terminology ,“顺序部分”)包含 acc 的定义.因此,acc确实是该隐式并行区域私有(private)的。这就是编译器所提示的。
您的案例 2 的不同之处在于 simd构造不是工作共享构造,因此对 reduction 的语义有不同的定义。条款。
如果你这样写,情况 1 是正确的:

void example(void) {
float acc = 0.0f;

#pragma omp parallel 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;
}
}
acc变量现在定义在 parallel 之外 for simd构造绑定(bind)到。

关于c++ - 错误 : reduction variable is private in outer context (omp reduction),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67709887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com