物理シミュレーションに使用している簡単なプログラムがあります。OpenMP で特定のスレッド パラダイムを実装する方法を知りたいです。
int main()
{
#define steps (100000)
for (int t = 0;t < steps; t++)
{
firstParallelLoop();
secondParallelLoop();
if (!(t%100))
{
checkpoint();
}
}
}
void firstParallelLoop()
{// In another file.c
#pragma omp parallel for
for (int i = 0; i < sizeOfSim;i++)
{
//Some atomic floating point ops.
}
}
以前、私は pthreads を使用していて、デュアルコア ラップトップで 1.7 の高速化を達成しました。OpenMP を使用すると、速度が向上しないようです。問題は、スレッドグループ/プールが急速に作成され、破壊されて破壊されていることだと思います。
pthreads の実装では、新しいスレッドが作成されないようにし、プログラムがクライアント サーバーとして動作するようにする必要がありました。pthreads スキームでは、main() はサーバーであり、firstParallelLoop への呼び出しは、スレッドがデータを再処理するきっかけとなったミューテックス/セマフォを解放します。
CPU 使用率を見ると、30% マーク (4 コア、2 つは HT) を超えると予想されますが、27 前後のままです...
OpenMP で同様のことを行うにはどうすればよいですか? OpenMP にスレッドを再利用するように指示するにはどうすればよいですか?