#pragma omp parallel for
for(int i=0; i<N; i++) {
...
}
と
#pragma omp parallel
for(int i=0; i<N; i++) {
...
}
の間の任意の差がありますか?
ありがとうございます!
#pragma omp parallel for
for(int i=0; i<N; i++) {
...
}
と
#pragma omp parallel
for(int i=0; i<N; i++) {
...
}
の間の任意の差がありますか?
ありがとうございます!
#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個のスレッドをさらに生成することを意味します。
私は参照してください。それが私の必要なものです。したがって、最初のオプション( '#pragma omp parallel')は、Nthreads * N回の反復を合計で実行し、ループ内の' vec [i] = result; 'という形式の文は全てを処理します。 –
@ FranciscoJ.R.Ruiz正しいです。この回答があなたの質問であれば、それを答えとしてマークしてください:) – RyanP
確かに!どうもありがとう。 –
2番目のケースでは、同じジョブ(ループ全体)の各スレッドがあります。最初のケースはスレッド間で作業を共有するので、各スレッドは 'N/t'回の反復を行い、' t'はスレッドの数です。 –