假设我有以下使用openmp的函数:
void fun (){
#pragma omp parallel private(i, x, m, d0, d1)
{
int m;
#pragma omp for
for (i = 0; i < n; i++) {
d0 = calc_dist();
d1 = calc_dist();
x = ((d0 < d1) ? 0 : 1);
for (m = 0; m < 2; ++m)
{
buffer1[m] = i*x + m;
}
#pragma omp atomic update
group_size[x] += 1;
}
}
}
如您所见,我将变量m
设为私有。在这种情况下,我想知道行buffer1
中buffer1[m] = i*x + m
的更新是否也是私有的,因为m
是私有的,或者它实际上是由所有线程原子更新的
答案 0 :(得分:1)
不,您的代码不正确。
正如我在你的另一个问题中强调的那样, buffer1
是共享的。您必须确保每个线程仅适用于buffer1
的独占索引。拥有私有m
并不重要,因为多个私有m
实例可以并且具有相同的值。
您必须以其他方式保护对buffer1
的访问权限,这可以通过atomic
指令或ordered directive
来完成。您需要采用哪种方式取决于您的具体算法。