2017-10-26 5 views
0

今まで私は書き込みが非常に簡単で、ほとんどの時間を消費するので、大きなサイクルの間だけompを使用してきました。しかし、時には、あるスレッドでのみ効率的に行うことができるI/Oを行う必要がありますが、通常はこのI/Oは(次の)ループとは独立しています。後でcyclusのためにスレッドをompに追加することはできますか?

は、私はこのような何かをする必要があります。

print_something(); // independet 
print_something_else(); // independent 
for(...){...}; // large cycle independent on previous printing 

がどのように第二のスレッドでは、1つのスレッドでprint_something_elseprint_somethingを実行し、ループを計算するために、残りのすべてのスレッドを使用するompを使用しますか?ループは印刷機能の実行よりもおそらく時間がかかるので、完了後にループにI/Oを行っていた2つのスレッドを追加する方法はですか?

この作品のようですか?

#pragma omp parallel 
{ 
    #pragma omp sections 
    { 
     #pragma omp section 
     { 
      print_something(); 
     } 
     #pragma omp section 
     { 
      print_something_else(); 
     } 
    } 
    #pragma omp for 
    for(...){...}; 
} 

答えて

2

#pragma omp sectionは、暗黙のバリアがあり、そのセクションが#pragma omp forを実行する前に終了するのをアプリケーションが待機します。 1つの選択肢は、プラグマompセクションにnowait句を追加することです。だからこれはコードを実行する代わりになるでしょう:

#pragma omp parallel 
{ 
    #pragma omp sections nowait 
    { 
     #pragma omp section 
     { 
      print_something(); 
     } 
     #pragma omp section 
     { 
      print_something_else(); 
     } 
    } 
    #pragma omp for 
    for(...){...}; 
} 

このアプローチは、しかし、問題があります。 #pragma omp forは静的スケジューリングを使用することができます。つまり、スレッドのチーム間でforループに作業を配布し、セクションを実行しているものも含めます。その場合、並列のforはセクションが完了するのを待たなければなりません。対処する1つの方法は、forループ(例えば動的または誘導)上で異なるスケジューリングを使用することである。

あなたのコンパイラがOpenMPタスク構造をサポートしている場合、私はタスクがあなたが探しているこの不規則な並列性をより良く表現できると信じています。 SOのこの別のquestionには、セクションとタスクの違いについての良い答えがあります。

+0

タスクconstrcutsの使い方についてもっと説明できますか?正しく理解するのが難しい – Michal

関連する問題