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

时间:2018-04-11 17:50:22

标签: c parallel-processing 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是否仍然是私有的,并且{p <1}}和i被设置为pragma部分中的私有变量?如果没有,是否可以允许缓冲区访问私有?

1 个答案:

答案 0 :(得分:1)

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

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

不得以任何方式在循环中访问buffer1的任何其他元素。例如。 不要执行foo = buffer1[i-1]

之类的操作

这一切都适用于常规C数组或指针,但不能有任何有效的别名。