1

そういうループを並列化したい。各「calc_block」は、前の反復で取得したデータを使用することに注意してください。

for (i=0 ; i<MAX_ITER; i++){

    norma1 = calc_block1();
    norma2 = calc_block2();
    norma3 = calc_block3();
    norma4 = calc_block4();

    norma = norma1+norma2+norma3+norma4;
    ...some calc...
    if(norma<eps)break;
}

私はこれを試しましたが、スピードアップはかなり小さいです ~1.2

for (i=0 ; i<MAX_ITER; i++){
  #pragma omp parallel sections{
     #pragma omp section
       norma1 = calc_block1();
     #pragma omp section
       norma2 = calc_block2();
     #pragma omp section
       norma3 = calc_block3();
     #pragma omp section
       norma4 = calc_block4();
  }

  norma = norma1+norma2+norma3+norma4;
    ...some calc...
  if(norma<eps)break;
}

ループ内でセクションを使用するオーバーヘッドが原因で発生したと思います。しかし、私はそれを修正する方法を知りません...前もって感謝します!

4

1 に答える 1