OpenMP - 进入临界区时是否需要刷新共享变量?

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

我想知道在 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”的陈旧视图,并将其更新为小于真实最大值但大于实际最大值的值陈旧的最大值

multithreading parallel-processing openmp
1个回答
3
投票

进入临界区域时不需要刷新 - 进入和退出临界区域时已经存在隐式刷新。

注意:对于您的示例案例,建议使用

reduction
子句 - 它基本上执行您所做的操作,但更简洁。 此外,实现也可以在
O(log(n))
而不是
O(n)
时间内计算值。

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