Ich arbeite gerade an einer Matrixberechnung mit OpenMP. Ich habe mehrere Schleifen in meinem Code, und stattdessen für jede Schleife #pragma omp parallel für [...] (die alle Threads erstellen und zerstören sie direkt danach) Ich möchte alle von ihnen am Anfang erstellen, und lösche sie am Ende des Programms um Overhead zu vermeiden. Ich mag so etwas wie:So verschachteln Sie parallele Schleifen in einer sequenziellen Schleife mit OpenMP
#pragma omp parallel
{
#pragma omp for[...]
for(...)
#pragma omp for[...]
for(...)
}
Das Problem ist, dass ich einige Teile haben diejenigen, die durch nur einen Thread ausführen, aber in einer Schleife, die Schleifen enthalten diejenigen parallel ausführen sein ... Diese ist, wie es aussieht:
//have to be execute by only one thread
int a=0,b=0,c=0;
for(a ; a<5 ; a++)
{
//some stuff
//loops which have to be parallelize
#pragma omp parallel for private(b,c) schedule(static) collapse(2)
for (b=0 ; b<8 ; b++);
for(c=0 ; c<10 ; c++)
{
//some other stuff
}
//end of the parallel zone
//stuff to be execute by only one thread
}
(die Loop-Grenzen in meinem Beispiel sind recht klein in meinem Programm die Anzahl der Iterationen bis 20.000 ... geht kann.) Eine meiner ersten Idee war, etwas zu tun, wie diese :
//have to be execute by only one thread
#pragma omp parallel //creating all the threads at the beginning
{
#pragma omp master //or single
{
int a=0,b=0,c=0;
for(a ; a<5 ; a++)
{
//some stuff
//loops which have to be parallelize
#pragma omp for private(b,c) schedule(static) collapse(2)
for (b=0 ; b<8 ; b++);
for(c=0 ; c<10 ; c++)
{
//some other stuff
}
//end of the parallel zone
//stuff to be execute by only one thread
}
}
} //deleting all the threads
Es kompiliert nicht, ich bekomme diesen Fehler von gcc: "Work-Sharing-Region möglicherweise nicht eng geschachtelt innerhalb der Arbeit teilen, kritisch, geordnet, Master oder explizite Task-Region".
Ich weiß, es kommt sicherlich von der "falschen" Verschachtelung, aber ich kann nicht verstehen, warum es nicht funktioniert. Muss ich vor der Parallelzone eine Barriere hinzufügen? Ich bin ein wenig verloren und weiß nicht, wie ich es lösen soll.
Vielen Dank im Voraus für Ihre Hilfe. Prost.
Vielen Dank für Ihre Antwort. Ich werde versuchen, meinen Code neu zu ordnen, um eine leichtere Parallelstruktur zu haben. – user3014051