在omp中并行的openmp并行部分?

时间:2013-03-15 21:09:05

标签: openmp

我有一个使用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*/
         }
      }
   }
}

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

1 个答案:

答案 0 :(得分:1)

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

  1. 嵌套OMP可能导致生成比CPU核心数更多的线程数。这最终可能会进行大量的上下文切换。
  2. 您的OMP并行部分位于4个嵌套for循环内部,因此,由于创建和销毁线程,可能会出现开销。