2012-11-13 8 views
20

次のコードは、最初の(外側の)ループを並列化するか、または入れ子になったループ全体を並列化しますか?OpenMPはどのようにネストループを処理しますか?

#pragma omp parallel for 
    for (int i=0;i<N;i++) 
    { 
     for (int j=0;j<M;j++) 
     { 
     //do task(i,j)// 
     } 
    } 

ので、(私は上記のコードは、forループ全体のネストされたを並列化するかどうか(したがって、一つのスレッドに直接関連するタスク(i、j)を)確認する、またはそれが唯一のforループの外側を並列化それは、ループインデックスiを有する各並列スレッドについて、その内部ループが非常にインポートされる単一のスレッドにおいて順次行われることを保証する。

答えて

27

書き込んだ行は、外側のループだけを並列化します。並列化するには、両方のあなたはcollapse句を追加する必要があります。

#pragma omp parallel for collapse(2) 
    for (int i=0;i<N;i++) 
    { 
     for (int j=0;j<M;j++) 
     { 
     //do task(i,j)// 
     } 
    } 

あなたはより多くの詳細についてはOpenMP 3.1仕様(秒2.5.1)をチェックすることもできます。

+1

ありがとう、それは素晴らしい、私はちょうど内部のループがその仕事を順番に行うことを保証しながら外側のループを平行にしたい。 – user0002128

4

OpenMPは、プラグマの隣にあるループのみを並列化します。必要に応じて内部ループを並列化することもできますが、自動的には実行されません。

関連する問題