0

OpenMP を使用して並列化した外部 for ループがあります。ただし、この for ループ内には、並列で実行できるコードのセクションがあります。

これを並列化するために OpenMP のセクション句を使用できますか? これは可能ですか?for ループの各反復は 1 つのスレッドだけで実行されるため、(各反復内で) コードの特定のセクションを複数のスレッドで並行して実行するように要求できますか? コードの残りの部分は、1 つのスレッド、つまりそのループ反復が割り当てられたスレッドで実行する必要があります。

たとえば。次のコードがあります。

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

Nested OMP should be possible. But I fear that you might not see any performance gain by doing this due to the following reasons:

  1. Nested OMP might result in generation of more number of threads than the number of CPU cores. This might end up in doing lots of context switching.
  2. OMP 並列セクションは、ネストされた 4 つの for ループの奥深くにあるため、スレッドの作成と破棄によるオーバーヘッドが発生する可能性があります。
于 2013-03-15T21:52:19.453 に答える