2016-05-10 9 views
0

4D配列に格納されたデータをループする多くの関数があります。 OpenMPを使用して、このデータを最も理にかなった場所で繰り返し処理し、上書きしないようにしています。例えばマルチスレッドループスルー4D配列C++

は、私は次のコードスニペットていますもともと

void MaximumCombiner::createComplexData(double**** input, const int nX, const int nY, 
             const int nZ, const int nA, std::complex<double>**** output, 
             const double* beamData) 
{ 
    for(int iX = 0; iX < nX; ++iX) 
    { 
     for(int iY = 0 ; iY < nY ; ++iY) 
     { 
      std::complex<double> complexArg(0.0, (beamData[iY] * M_PI/180.0)); 
      std::complex<double> complexExp = std::exp(complexArg); 

      for(int iZ = 0; iZ < nZ; ++iZ) 
      { 
       for(int iA = 0 ; iA < nA ; ++iA) 
       { 
        output[iX][iY][iZ][iA] = input[iX][iY][iZ][iA] * complexExp; 
       } 
      } 
     } 
    } 
} 

は、私は、各forループの前#pragma omp parallel forを追加する必要がありますと思ったが、私は創造のオーバーヘッドで、より多くの時間を費やしていた場合、今、私は疑問に思って/実際の作業よりスレッドの削除。私はまた、最初のforループの上に#pragma omp parallelを使用して試してみましたが、内部ループの1つに#pragma omp forを貼り付けましたが、これが最も良いかどうかはわかりません。自分のOMPコールをどこに置くかを決定しようとしたら、どうすればいいですか?

+1

Woo! 4つ星のプログラミング! – user4581301

+2

さまざまなオプションのプロファイルを作成し、経験的に最良のものを確認します。ハードナンバーなしのスレッド作成のオーバーヘッドについての前提を作ることは、苦痛につながるだけです。 –

+0

オプションのプロファイル方法についてお勧めしますか? Valgrindを使うだけですか?スレッド化せずに、どのチャンクが最も長くかかるかを確認します。 – Todd

答えて

0

一般的に直接的な方法は、最も外側のforループに1つだけ入れてください。#pragma omp forこれにより、最小のスレッド作成/削除のオーバーヘッドが得られます。

ただし、このオーバーヘッドがボトルネックではない可能性があります。コメントで示唆されているように、最良の方法を見つけるためにコードをプロファイリングする必要があります。

関連する問題