【问题标题】:How to ensure that accessing a buffer is private when index is set private将索引设置为私有时如何确保访问缓冲区是私有的
【发布时间】:2018-04-12 12:25:50
【问题描述】:

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

【问题讨论】:

    标签: c multithreading parallel-processing openmp


    【解决方案1】:

    不,您的代码不正确。

    buffer1 是共享的,正如我在您的另一个问题中强烈强调的那样。您必须确保每个线程仅适用于 buffer1 的独占索引。拥有私有 m 并不重要,因为多个私有 m 实例可以并且将具有相同的值。

    您必须另外保护对buffer1 的访问,这可以通过atomic 指令或ordered directive 来完成。你需要走哪条路取决于你的具体算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多