c - 使用 openmp 确保缓冲区访问是私有的



假设我有以下函数:

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是否仍然是私有的,因为ix在杂注部分中设置为私有变量?如果不是,是否可以允许缓冲区访问私有?

您的示例访问buffer1[i] = x;很好。它之所以有效,是因为在工作共享循环中,没有两个线程会获得相同的i因此没有两个线程会访问相同的内存。

请注意,从技术上讲,buffer1[i]不是私有的,私有仅适用于变量。 buffer1是一个共享变量

您不得在循环中以任何方式访问任何其他buffer1元素。 例如,不要做任何类似foo = buffer1[i-1] .

这一切都适用于常规 C 数组或指针,但不得有任何混叠。

最新更新