2016-06-28 14 views
7

平行、プラグマOMP平行は、OpenMPとC++で

#pragma omp parallel for 
for(int i=0; i<N; i++) { 
    ... 
} 

#pragma omp parallel 
for(int i=0; i<N; i++) { 
    ... 
} 

の間の任意の差がありますか?

ありがとうございます!

+1

2番目のケースでは、同じジョブ(ループ全体)の各スレッドがあります。最初のケースはスレッド間で作業を共有するので、各スレッドは 'N/t'回の反復を行い、' t'はスレッドの数です。 –

答えて

5
#pragma omp parallel 
for(int i=0; i<N; i++) { 
    ... 
} 

このコードでは、並列領域が作成され、個々のスレッドがループ内で実行されます。つまり、ループを分割してすべての反復を1回だけ完了するN個のスレッドではなく、完全ループをN回実行します。

あなたが行うことができます

#pragma omp parallel 
{ 
    #pragma omp for 
    for(int i=0; i < N; ++i) 
    { 
    } 

    #pragma omp for 
    for(int i=0; i < N; ++i) 
    { 
    } 
} 

これは、1つの並列領域を作成する(別名1つのフォーク/参加、高価であるため、あなたはすべてのループのためにそれを行うにはしたくないもの)とに複数のループを実行しますその領域内で平行である。後で#pragma omp parrallel forとは対照的に、#pragma omp forを使用する並列領域がすでに存在するかどうかを確認してください。これは、N個のスレッドのそれぞれがループを実行するためにN個のスレッドをさらに生成することを意味します。

+0

私は参照してください。それが私の必要なものです。したがって、最初のオプション( '#pragma omp parallel')は、Nthreads * N回の反復を合計で実行し、ループ内の' vec [i] = result; 'という形式の文は全てを処理します。 –

+0

@ FranciscoJ.R.Ruiz正しいです。この回答があなたの質問であれば、それを答えとしてマークしてください:) – RyanP

+0

確かに!どうもありがとう。 –

関連する問題