2009-08-27 18 views
2

OpenMPを使用して並列化したシリアルアプリケーションがあります。ワーカースレッドは一瞬のうちに作業を中止します

うまく機能しているようだ
#pragma omp parallel for default(shared) 
for (int i = 0; i < numberOfEmitters; ++i) 
{ 
    computeTrajectoryParams* params = new computeTrajectoryParams; 
      // defining params... 
    outputs[i] = (int*) ComputeTrajectory(params); 

    delete params; 
} 

:最初に、私のすべてのワーカースレッドがループの繰り返しを実行し、すべてが速くなって、私は100%のCPU負荷を持っている私は単に私のメインループに以下の追加しました(クアッドコアマシン上)。唯一のメインスレッドが動作したままになるまでしかし、...など、その後、別の、一瞬の後、ワーカースレッドの1が停止し、vcomp90.dllから_vcomp::PersistentThreadFunc(ファイルがvctools\openmprt\src\ttpool.cppである)と呼ばれる関数内に留まります。

これはなぜ起こるのでしょうか?これは、反復の約半分が実行された後に開始されます。

答えて

6

スケジューリング方式と各サイクルの計算サイズによって異なる場合があります。 スケジューリングが静的な場合、各スレッドには実行前に作業が割り当てられます。各スレッドはインデックスの1/4を取得します。いくつかのスレッドは、他のスレッドよりも処理が簡単である(または、他のスレッドが少なくて済むかもしれない)ため、他のスレッドより先に終了する可能性があります。

動的スケジューリングを使用して、よりうまく動作するかどうかを確認してください。

+0

ありがとう、これはまさに問題でした!私はプラグマを '#pragma omp parallel for default(shared)schedule(dynamic)'に変更しました。これで期待通りに動作します:100%のCPU負荷があります!再度、感謝します ! – Wookai

+0

うわー。絶対に正しいとupVoteはありません。ここに私のものがあります。 –

+0

私はupvoteしたかったが、私のクォータはその日に失効したことを知っています。私は今日戻った;)! – Wookai

2

コードに少しのコメント:ComputeTrajectoryの実行時間がms単位で測定され、繰り返し回数が多い場合は、実際にMP最適化されたメモリアロケータがあることを確認する必要があります。 (今日でも)大部分のアロケータはグローバルロックを持つグローバルプールを持っています。

また、完全に蚊帳の外に割り当てを取得に見ることができるが、それはここに可能であるかどうかを知るための十分な情報がありません。

+0

チップをありがとう。私は実際にはこれらの繰り返し(通常は256)の数が少なく、実行時間は数秒です。 – Wookai

関連する問題