OpenMP-进入关键区域时是否需要刷新共享变量?

时间:2018-08-11 20:35:33

标签: multithreading parallel-processing openmp

我想知道在OpenMP中,是否需要在关键区域中刷新要在关键区域中更新的共享变量?

例如,我想使用以下代码计算向量中的最大值:

int max = vec[0];
#pragma omp parallel
{
    int local_max = vec[0];
    #pragma omp for
    for (uint i = 0; i < vec.size(); i++) {
        if (vec[i] > local_max) local_max = vec[i];
    }
    #pragma omp critical
    {
        if (local_max > max) max = local_max;
    }
}

我想知道进入临界区后是否需要先刷新变量,因为一个线程很可能会获取变量“ max”的陈旧视图,并将其更新为小于真实max的值,但会更大比过时的最大值

1 个答案:

答案 0 :(得分:2)

进入关键区域时不需要冲洗-进入和退出关键区域时已经存在隐式冲洗。

注意:对于您的示例情况,建议使用reduction子句-基本上可以完成您的工作,但更加简洁。