2017-06-30 5 views
1

現在のところ、私のコードのどこか深いところで、ネストされたfor-loop(N1 =〜10000、N2 =〜500、x、y = 10-50)を使って作業しています。私は#pragma ompを使ってOpenMPに計算をいくつかのコアに配布させました。OpenMPスケジューリングは条件付き内部ループで効率的ですか?

#pragma omp parallel for 
for (int i = 0; i < N1; ++i) 
{ 
    for (int j = 0; j < N2; ++j) 
    { 
     for (int k = x; k <= y; ++k) 
     { 
      // calculation 
     } 
    } 
} 

は今、私の2 innerloopsは

#pragma omp parallel for 
for (int i = 0; i < N1; ++i) 
{ 
    if (toExecute[i]) 
    { 
     for (int j = 0; j < N2; ++j) 
     { 
      for (int k = x; k <= y; ++k) 
      { 
       // calculation 
      } 
     } 
    } 
} 

内側のネストされたループ条件となりどちらか長い時間がかかる、または直後に行われます。もちろん、if-statementを省略することもできます。これは、outer-loopとif-statementをより短いループに置き換え、後のインデックス作成を参照します。

質問:私の外側のループ内でifステートメントを処理するには十分にスマートなのですか?何か手動で行う必要がありますか?

私は現在Visual Studio 2017でC++を使用しています(OpenMPのバージョンは少し遅れていると思います)。

答えて

2

理想的には、OpenMPで処理するのが理想的です。しかし、パフォーマンスのことをやっているときはいつものように、あなたのために何がベストかを見極めなければなりません。確かに、手作業ですばらしいスピードアップを得ることができます。 OpenMPは全面的なものではなく、あなたの計算に関するすべての詳細と情報を知らない。

あなたの計算が任意の反復で同じ量の作業を意味する場合、あなたの条件は、最もアウトターループに関するいくつかの異なる作業負荷につながる可能性があります。だから、theoritically、動的スケジューリングは、あなたはまた、あなたの計算に合うかもしれないstaticまたはguidedスケジューリングをしてみてください(私はあなたの計算の詳細を知らないので、私が言うことができない)と粒度と遊ぶことができ #pragma omp parallel for schedule(dynamic)

よりフィットする必要がありますブロック。

他のテストでは、それが可能な場合(つまり並列化可能な場合)、内部ループで並列化を移動するようにしてください。 並列化を入れ子にすることもできます。ステップバイステップで試してみて、最高の結果を得るために時間をかけてください。これらの調整はしばしば異なるアーキテクチャー間で一般的なものではないことを思い出させるため、パフォーマンスとコードの再利用性の間のトレードオフを目指してください。

関連する問題