没有for循环的OpenMP不等负载

时间:2017-11-20 20:12:35

标签: c parallel-processing openmp

我有一个类似于以下

的OpenMP代码
while(counter < MAX)  {
  #pragma omp parallel reduction(+:counter) 
  {
     // do monte carlo stuff
     // if a certain condition is met, counter is incremented

  }
}

因此,只要计数器低于某个值,就可以通过可用线程执行并行部分。取决于场景(我在这里做MC的东西,所以它是随机的),计算可能需要很长时间,因此这里的工人之间存在不平衡,由于并行结束时的隐含障碍而变得明显部分。

似乎#pragma omp parallel for可能有办法绕过这个(即nowait指令/动态调度),但我不能使用它,因为我不知道for循环的上部迭代次数。 / p>

任何想法/设计模式如何处理这种情况?

祝你好运!

1 个答案:

答案 0 :(得分:1)

在一个并行部分中运行所有内容并以原子方式访问counter

int counter = 0;
#pragma omp parallel
while(1) {
     int local_counter;
     #pragma omp atomic read
     local_counter = counter;
     if (local_counter >= MAX) {
          break;
     }
     // do monte carlo stuff
     // if a certain condition is met, counter is incremented
     if (certain_condition) {
         #pragma omp atomic update
         counter++;
     }
}

由于原子访问,您无法直接检查while条件。 请注意,此代码将超调,即在并行部分之后可能counter > MAX。请记住,counter由许多线程共享和读取/更新。