我想知道在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的值,但会更大比过时的最大值
答案 0 :(得分:2)
进入关键区域时不需要冲洗-进入和退出关键区域时已经存在隐式冲洗。
注意:对于您的示例情况,建议使用reduction
子句-基本上可以完成您的工作,但更加简洁。