0

我有一个使用 OpenMP 并行化的外部 for 循环。然而,在这个 for 循环中,有一些代码也可以并行执行。

我可以使用 OpenMP 的sections 子句来并行化吗?这甚至可能吗?由于 for 循环的每次迭代仅由一个线程运行,我可以(在每次迭代中)要求某些代码部分由多个线程并行运行吗?其余的代码应该只由一个线程运行,即循环迭代被分配到的线程。

例如。我有以下代码:

omp_p = omp_get_max_threads();
omp_set_nested(1);
#pragma omp parallel for num_threads(omp_p/2)
for(int p=0;p<omp_p/2;p++){
   size_t a = (p*N)/(omp_p/2);
   size_t b = ((p+1)*N)/(omp_p/2);
   for(int i=a;i<b;i++){
      /*Work on A[a]->A[b]*/
      for(int j=0;j<n;j++){
         for(int k=0;k<N;k++){
           /*Serial code*/
          #pragma omp parallel sections
              {
                 #pragma omp section
                   {

                   }
                 #pragma omp section
                   {

                   }

              }
           /*Serial work*/
           #pragma omp parallel sections
              {
              #pragma omp section
                   {

                   }
                 #pragma omp section
                   {

                   }
              }
           /*Serial code*/
         }
      }
   }
}

这会导致程序比我根本没有使用并行部分要慢得多。

4

1 回答 1

1

嵌套 OMP 应该是可能的。但我担心由于以下原因,您可能看不到任何性能提升:

  1. 嵌套 OMP 可能会导致生成的线程数多于 CPU 内核数。这最终可能会导致大量的上下文切换。
  2. 您的 OMP 并行部分位于 4 个嵌套 for 循环的深处,因此,由于线程的创建和销毁,可能会产生开销。
于 2013-03-15T21:52:19.453 回答