我想知道在 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”的陈旧视图,并将其更新为小于真实最大值但大于实际最大值的值陈旧的最大值
进入临界区域时不需要刷新 - 进入和退出临界区域时已经存在隐式刷新。
注意:对于您的示例案例,建议使用
reduction
子句 - 它基本上执行您所做的操作,但更简洁。
此外,实现也可以在 O(log(n))
而不是 O(n)
时间内计算值。