2012-02-03 4 views
2

OpenMPをクロスプラットフォームのようにスレッド化に使用しようとしています。しかし、私は、ループが実行されている間、並列を継続した後にコードを作成する方法を理解できませんか?基本的には最初のループを並列に実行しますが、2番目の非並列ループには到達しませんか?OpenMPはスレッドを実行しますがメインを続ける

int main() { 
    #pragma omp parallel 
     while(1) { 
      Sleep(4000); 
      printf("doing work in thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads()); 
     } 


    while (1) { 
     Sleep(4000); 
     printf("Hello from main %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads()); 
    } 
} 
+0

は(あなたの例では、並列領域は一方で「最初です( ){...} '並列領域の終わり(2番目の直前)には目に見えない障壁があります。 – osgx

+0

実際、OpenMPだけはあなたが望むものにとって悪い選択です。別のスレッド(OpenMPを使うことができる)を起動し、メインスレッドを「非並列」ループに進めるのが良い解決策です。詳細については、ユースケースについて説明しています。 –

+0

@AlexeyKukanov、私は同意しますが、OpenMPにはこの質問に記載された利点があります。 –

答えて

2

私はあなただけ、これはあなたのケースで理にかなって

int main() { 
    #pragma omp parallel 
     if(omp_get_thread_num()==0){ 
      while(1) { 
       Sleep(4000); 
       printf("Hello from main %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads()); 
      } 
     }else{ 
      while(1) { 
       Sleep(4000); 
       printf("doing work in thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads()); 
      } 
     } 
    } 
} 

天気詳細なしに判断することは困難であるあなたのOMP並列ブロック内のスレッドの1あなたの特別なスレッドを作ることができると思います。

sectionsを使用することもできます。ここからの例:http://bisqwit.iki.fi/story/howto/openmp/#Sections

#pragma omp parallel // starts a new team 
{ 
    //Work0(); // this function would be run by all threads. 

    #pragma omp sections // divides the team into sections 
    { 
    // everything herein is run only once. 
    { Work1(); } 
    #pragma omp section 
    { Work2(); 
     Work3(); } 
    #pragma omp section 
    { Work4(); } 
    } 

    //Work5(); // this function would be run by all threads. 
} 

あなたは、ネストされたrenationalisation行うことができます:あなたは「OMP並列」領域の終了後に実行するワーカースレッドを持つようにカントOpenMP: What is the benefit of nesting parallelizations?

+0

ありがとうJohan、達成したいのは、永遠にループするスレッドを1つ実行しても、残りのメインコードは続行する必要があります。だから、私は主なスレッドとこの他のスレッドが並行するようにしたいだけで、別のものをやります。これは、他のスレッドライブラリのfaily normalです。プログラムは実行され(スレッド0)、スレッドを実行してコードを実行します。 – Mark

+0

私はこれを実現します。セクションを使ってみてください。 –

+0

ありがとう! – Mark

関連する問題