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*/
}
}
}
}
これにより、並列セクションをまったく使用しなかった場合よりも、プログラムの実行速度が大幅に低下します。