假设我有以下函数:
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
是否仍然是私有的,因为i
和x
在杂注部分中设置为私有变量?如果不是,是否可以允许缓冲区访问私有?
您的示例访问buffer1[i] = x;
很好。它之所以有效,是因为在工作共享循环中,没有两个线程会获得相同的i
因此没有两个线程会访问相同的内存。
请注意,从技术上讲,buffer1[i]
不是私有的,私有仅适用于变量。 buffer1
是一个共享变量。
您不得在循环中以任何方式访问任何其他buffer1
元素。 例如,不要做任何类似foo = buffer1[i-1]
.
这一切都适用于常规 C 数组或指针,但不得有任何混叠。