当index设置为private时,如何确保访问缓冲区是私有的

时间:2018-04-12 12:25:50

标签: c multithreading parallel-processing openmp

假设我有以下使用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设为私有。在这种情况下,我想知道行buffer1buffer1[m] = i*x + m的更新是否也是私有的,因为m是私有的,或者它实际上是由所有线程原子更新的

1 个答案:

答案 0 :(得分:1)

不,您的代码不正确。

正如我在你的另一个问题中强调的那样,

buffer1是共享的。您必须确保每个线程仅适用于buffer1的独占索引。拥有私有m并不重要,因为多个私有m实例可以并且具有相同的值。

您必须以其他方式保护对buffer1的访问权限,这可以通过atomic指令或ordered directive来完成。您需要采用哪种方式取决于您的具体算法。