OpenMP代码大多数时候都在Join Barrier上等待

时间:2011-11-08 08:24:51

标签: c++ openmp

我有一段代码

void parallel_func()
{
#pragma omp parallel
  {
    #pragma omp for collapse(2) schedule(dynamic) nowait
    for(i=0; i<N; i++) {
        for(j=0;j<N;j++) {
            if (i>j) continue; // hack to allow collapse here
        //...
        }
    }

    #pragma omp critical
    {
    //...
    }
  }
}

使用分析器,我注意到我的代码花费的大部分时间......等待OpenMP 加入障碍 ......任何想法为什么?或者如何确定原因?

1 个答案:

答案 0 :(得分:1)

  1. omp parallel在哪里?我假设parallel_func位于omp parallel部分内。

  2. 目前尚不清楚,因为您没有说明哪个连接障碍会造成巨大的开销。在您的代码中,omp for确实有nowait,这意味着没有隐含障碍。你有omp critical。这实际上是一个关键部分,因此不会进行屏障操作。 (如果omp single,则需要加入障碍,除非omp single nowait

  3. 因此,唯一可疑的加入障碍位置来自omp parallel部分,该部分未在您的代码中显示。如果parallel_func的末尾是omp parallel部分的结尾,并且您的omp parallel没有nowait,那么联接障碍就是parallel_func的末尾1}}。

  4. 最后,如何找出原因?这主要是因为工作量不平衡。每个线程的工作量可能偏差太大。这将使一些线程在隐式连接障碍上浪费时间。请确定工作量分配。