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コールをどこに置くかを決定しようとしたら、どうすればいいですか?
Woo! 4つ星のプログラミング! – user4581301
さまざまなオプションのプロファイルを作成し、経験的に最良のものを確認します。ハードナンバーなしのスレッド作成のオーバーヘッドについての前提を作ることは、苦痛につながるだけです。 –
オプションのプロファイル方法についてお勧めしますか? Valgrindを使うだけですか?スレッド化せずに、どのチャンクが最も長くかかるかを確認します。 – Todd