假设我有以下功能:
void fun (){
#pragma omp parallel private(i, x, d0, d1)
{
#pragma omp for
for (i = 0; i < n; i++) {
d0 = calc_dist();
d1 = calc_dist();
x = ((d0 < d1) ? 0 : 1);
buffer1[i] = x;
#pragma omp atomic update
group_size[x] += 1;
}
}
}
我想知道访问buffer1 buffer1[i] = x
是否仍然是私有的,并且{p <1}}和i
被设置为pragma部分中的私有变量?如果没有,是否可以允许缓冲区访问私有?
答案 0 :(得分:1)
您对buffer1[i] = x;
的示例访问权限很好。它的工作原理是因为在工作共享循环中,没有两个线程可以获得相同的i
,因此没有两个线程可以访问相同的内存。
请注意,从技术上讲,buffer1[i]
不是私有,private仅适用于变量。 buffer1
是共享变量。
您不得以任何方式在循环中访问buffer1
的任何其他元素。例如。 不要执行foo = buffer1[i-1]
。
这一切都适用于常规C数组或指针,但不能有任何有效的别名。