2016-03-19 10 views
1

//OpenMP並列

EDIT内側のループは一方で:どのように私は5つのスレッドがすべてのスレッドがそのコードを持った後、単一のスレッドにその結果を渡し、その後CONCURRENTLYコードAと第六のスレッドの実行コードBを実行するのですか?私はイムこれは私の元のコード

omp_set_num_threads(6); 
#pragma omp parallel 
    { 
     int TID = omp_get_thread_num(); 

     while (true) 
     { 
      if (TID < 5) 
      { 
       // codeA 

      } 

      else 
      { 
       // codeB 
      } 

      // combine result from A and B 
      #pragma single 
      { 
       //show result A and B 
      } 
     } 
    } 

OpenMP threads "disobey" omp barrier

キーワード障壁を使用することはできません私は5つのスレッドを設定することができるはず十分Can I assign multiple threads to a code section in OpenMP?

をグーグル後に解決策を見つけたかもしれないことを読んでタスクAとスレッド1を実行してタスクBを実行します。結果を蓄積するためにスレッド5を終了する前に、クリティカルを使用するだけです。

+0

複数回同じ質問をしないようにしてください。 [あなたの最初の質問](http://stackoverflow.com/q/36100511/5239503)をもっと明確にしたい場合は、それを編集してください。 – Gilles

答えて

0

次のコードは、実装したいものを例示していますか?この特別な場合、スレッド0-4はスレッド識別子とAresultを1つだけ累積します(共有変数であるため、スレッドへのアトミックアクセスが必要です)。スレッド5はスレッド識別子をBresultに割り当てます。 ご参考まで:#pragma omp singleでompを見逃しました。

Aresult/Bresultで計算された値をスレッドが変更しないように、AとBの結果を表示する間に、#pragma omp barrierを追加しました。これは、障壁を追加しないで、#pragma omp singleを通過しないスレッドが次の反復で作業を開始する場合に発生する可能性があります。

のOpenMP V3.0 /セクション2.5ワークシェア構築物からOpenMP threads "disobey" omp barrier状態

で受け入れ答えとしてので障壁を追加することが可能であることに注意してください:

次の制限事項がワークシェアリング構造に適用されます。

各ワークシェアリング領域は、チーム内のすべてのスレッド によってまったく検出されないか、まったく検出されません。ワークシェアリング領域と障壁の順序は、チーム内のすべてのスレッドで同じでなければなりません。

この場合、すべてのスレッドは、結果を示すコードを入力する前後にバリアに遭遇します。

#include <omp.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int Aresult = 0; 
    int Bresult = 0; 

    omp_set_num_threads(6); 
    #pragma omp parallel 
    { 
     int TID = omp_get_thread_num(); 

     while (1 == 1) 
     { 
      if (TID < 5) 
      { 
       // codeA 
       #pragma omp atomic 
       Aresult += TID + 1; // Aresult should be 1+2+3+4+5 
      } 
      else 
      { 
       // codeB 
       Bresult = TID; 
      } 

      #pragma omp barrier 

      // combine result from A and B 
      #pragma omp single 
      { 
       //show result A and B 
       printf ("Aresult = %d Bresult = %d\n", Aresult, Bresult); 

       // set Aresult & Bresult to 0 for next iteration 
       Aresult = Bresult = 0; 
      } 

      #pragma omp barrier 
     } 
    } 

} 
関連する問題