首页 文章

没有for循环的OpenMP不等负载

提问于
浏览
0

我有一个OpenMP代码,如下所示

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

  }
}

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

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

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

最好的祝福!

1 回答

  • 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 由许多线程共享和读取/更新 .

相关问题