2012-11-13 17 views
20

Parallelisiert der folgende Code die ersten (äußeren) Schleifen oder parallelisiert er die gesamten verschachtelten Schleifen?Wie behandelt OpenMP verschachtelte Schleifen?

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

Ich möchte nur sicherstellen, wenn der obige Code wird die gesamte verschachtelte for-Schleifen (also einen Thread in direktem Zusammenhang Aufgabe (i, j)) parallelisieren, oder es parallelisiert nur die äußere for-Schleife (also es stellt sicher, dass für jeden parallelen Thread mit Schleifenindex i seine innere Schleife sequentiell in einem einzigen Thread ausgeführt wird, was sehr wichtig ist).

Antwort

27

Die Zeilen, die Sie geschrieben haben, werden nur die äußere Schleife parallelisieren. Parallelisieren beide benötigen Sie eine collapse Klausel hinzuzufügen:

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

Sie können OpenMP 3.1 Spezifikationen (sec 2.5.1) für weitere Details überprüfen möchten.

+1

Danke, das ist großartig, ich möchte nur die äußeren Schleifen parallel laufen lassen, während ich sicherstelle, dass die inneren Schleifen nacheinander ihre Arbeit machen. – user0002128

4

OpenMP parallelisiert nur die Schleife neben dem Pragma. Sie können die innere Schleife auch parallelisieren, wenn Sie möchten, aber es wird nicht automatisch gemacht.

Verwandte Themen