2013-10-07 13 views
5

私はすでに "プラグマomp for"ループでOpenMPを使用しており、OpenMPタスクを今すぐ試してみたかったのです。 しかし、2つのタスクを並列に実行する必要がある単純なプログラムは動作していないようです。 タスクの使用が間違っていると誤解しましたか?gcc openmpタスクが動作しない

#include<iostream> 
#include<omp.h> 

//ubuntu 12.04 LTS, gcc 4.6.3 
//g++ test_omp.cpp -fopenmp 

int main() 
{ 
#pragma omp parallel 
{ 
    #pragma omp single 
    { 

     #pragma omp task 
     { 
      while(true) 
      { 
      usleep(1e6); 
      #pragma omp critical (c_out) 
      std::cout<<"task1"<<std::endl; 
      } 
     } 

     #pragma omp task 
     { 
      while(true) 
      { 
      usleep(1e6); 
      #pragma omp critical (c_out) 
      std::cout<<"task2"<<std::endl; 
      } 
     } 

    } 
} 
} 

出力は次のようになりますので、2番目のタスクが実行されていない TASK1 TASK1 TASK1 .....

。 OpenMPの仕様から

答えて

3

スレッドがタスクコンストラクトを検出すると、タスクが関連付けられた構造化されたブロックのため コードから生成されます。 のデータ環境は、 のタスク構成、データ環境ごとのICV、および が適用されるデフォルトのデータ共有属性句に従って作成されます。

遭遇したスレッドはすぐにタスクを実行するか、 が実行を延期する可能性があります。後者の場合、チーム内の任意のスレッドが に割り当てられている可能性があります。タスクの完了は、タスク 同期構造を使用して保証することができます。タスク構造体は、 外部タスク内にネストすることができますが、内部タスクのタスク領域は外部タスクの タスク領域の一部ではありません。

(強調鉱山)

私はこれを読ん方法:単一のスレッドがあなたのsingleセクションの実行を開始します。これはtaskディレクティブに到達します。その時点で、タスク自体を実行するか、別のスレッドに渡すかを決めることができます。この問題は、タスク自体を実行することを決定したときに発生します。

task/singleあなたの例では私は確信していません。やりたいことの代わりにomp parallel sectionsのためのケースのように思える:

int main() 
{ 
#pragma omp parallel sections num_threads(2) 
{ 
     #pragma omp section 
     { 
      while(true) 
      { 
      usleep(3e5); 
      #pragma omp critical (c_out) 
      std::cout<<"task1"<<std::endl; 
      } 
     } 
     #pragma omp section 
     { 
      while(true) 
      { 
      usleep(5e5); 
      #pragma omp critical (c_out) 
      std::cout<<"task2"<<std::endl; 
      } 
     } 
} 
} 
+0

私はOpenMPのタスクは常に「卵」または「フォーク」と、このタスクは、彼の仕事を続けて遭遇したスレッドのいくつかの種類であると思いました。しかし、私は間違っていました。 – martin7743

関連する問題