2017-05-13 7 views
2

OpenMPとCで大学の成果物を扱っていますが、次のコードを実行しようとしていますが、唯一のことは各セクションがどのように異なるスレッド:OpenMPは常に同じスレッドで動作します

#include <omp.h> 
#include <stdio.h> 
int main() {        
    int id, np;  

    printf("Max threads number: %d\n",omp_get_max_threads()); 
    omp_set_num_threads(omp_get_max_threads()); 

    #pragma omp parallel sections private(id, np) 
    { 
     np = omp_get_num_threads(); 
     #pragma omp section 
     { 
      id = omp_get_thread_num(); 
      printf("Hello from thread %d out of %d threads\n", id, np); 
     } 
     #pragma omp section 
     { 
      id = omp_get_thread_num(); 
      printf("Hello from thread %d out of %d threads\n", id, np); 
     } 
     #pragma omp section 
     { 
      id = omp_get_thread_num(); 
      printf("Hello from thread %d out of %d threads\n", id, np); 
     } 
     #pragma omp section 
     { 
      id = omp_get_thread_num(); 
      printf("Hello from thread %d out of %d threads\n", id, np); 
     } 
    } 
} 

私はLinux上で働いている、と私はそれをコンパイルするとき、これは言う:

Max threads number: 4 
Hello from thread 0 out of 1 threads 
Hello from thread 0 out of 1 threads 
Hello from thread 0 out of 1 threads 
Hello from thread 0 out of 1 threads 

g++ prueba.c -lgomp -o prueba 

を私は次の出力を取得しています

スレッド番号0で常に動作している理由とomp_get_num_threads()が常に1である理由を誰にでも教えてください。

私が達成したい出力は次のようになります。事前に

Max threads number: 4 
Hello from thread 0 out of 3 threads 
Hello from thread 1 out of 3 threads 
Hello from thread 2 out of 3 threads 
Hello from thread 3 out of 3 threads 

ありがとう!

答えて

2

まず、あなたが-fopenmpコンパイラフラグが欠落しているが、そのプラグマは無視されます。すべてのコンパイルおよびリンク手順でfopenmpを指定します。必要がない限り手動で-lgompとリンクしないでください。他の答えは説明しているように

sections構文内の最初の文

np = omp_get_max_threads(); 

はまだ、単一のスレッドで実行される構造化ブロックとみなされます。したがって、コードは次のようになります。

#pragma omp parallel sections private(id) 
{ 
    #pragma omp section 
    { 
     np = omp_get_max_threads(); 
    } 
    #pragma omp section 
    { 
    id = omp_get_thread_num(); 
    printf("Hello from thread %d out of %d threads\n", id, np); 
    } 
.... 

Note that you could also split the `parallel`/`sections` and initalize the private variables for each thread: 

いいですか?このコードはすべての並列スレッドで実行され、np(スレッドごとに同じ値)は、ワーク共有omp sectionによって保持されます。あなたは移動することもできます:

#pragma omp parallel 
{ 
    // Declaring the variables within makes them implicitly private 
    // and avoids stupid mistakes 
    int np = omp_get_max_threads(); 
    int id = omp_get_thread_num(); 
    #pragma omp sections 
    { 
     #pragma omp section 
     { 
      printf("Hello from thread %d out of %d threads\n", id, np); 
     } 
     ... 
    } 
} 
+0

うわー...間違いなくこれが私の問題を解決した...本当にありがとう!私はあなたに私に返答する両方の努力をとても感謝します! –

1
  1. npをプライベートとして指定すると、個々のセクションブロックごとにプライベートになります。 np = omp_get_num_threads();を個々のセクションにコピーする(プライベートにする)か、パラレルコンストラクトから完全に移動する(プライベートから削除する)。
  2. セクションブロックは、同じスレッド上の4つのブロックを含め、任意の順序で実行できます。出力「0,1,2,3」は制御できません。

EDIT:私たちは同じライン上にあることを確認するために、私は私がテストしたコードの下に貼り付けコピー:

#include <omp.h> 
#include <stdio.h> 
int main() { 
int id, np; 

printf("Max threads number: %d\n",omp_get_max_threads()); 
omp_set_num_threads(omp_get_max_threads()); 

#pragma omp parallel sections private(id) 
{ 
    np = omp_get_max_threads(); 
    #pragma omp section 
    { 
    id = omp_get_thread_num(); 
    printf("Hello from thread %d out of %d threads\n", id, np); 
    } 
    #pragma omp section 
    { 
    id = omp_get_thread_num(); 
    printf("Hello from thread %d out of %d threads\n", id, np); 
    } 
    #pragma omp section 
    { 
    id = omp_get_thread_num(); 
    printf("Hello from thread %d out of %d threads\n", id, np); 
    } 
    #pragma omp section 
    { 
    id = omp_get_thread_num(); 
    printf("Hello from thread %d out of %d threads\n", id, np); 
    } 
} 
} 
+0

早く返信いただきありがとうございます!私はあなたの両方のソリューションを試しましたが、私はそれらの両方について説明したものと同じ出力を得ています...とにかく、omp_get_num_threads()は使用中のスレッドの合計を教えてはいけませんか?では、omp_get_thread_num()を使用すると、なぜ私に1が与えられ、さらに常に0に取り組んでいますか? –

+0

実際のコードを追加しました。私はそれに問題はない。 –

+0

ああ大丈夫です!私はあなたが何を言ったのか分からなかった、私はnp = omp_get_max_threads();プラグマ並列ブロックの外に出現する。さて、このように、出力は4回与えられます: こんにちはスレッドから0スレッド しかし、なぜidが変わらないのですか?私はそれが各スレッドで動作するようにしたいです –

関連する問題