Attualmente sto lavorando su un calcolo matriciale con OpenMP. Ho diversi loop nel mio codice e invece su ogni loop #pragma omp parallelo per [...] (che crea tutti i thread e li distrugge subito dopo) vorrei creare tutti loro all'inizio e cancellarli alla fine del programma per evitare spese generali. voglio qualcosa di simile:Come annidare loop paralleli in un ciclo sequenziale con OpenMP
#pragma omp parallel
{
#pragma omp for[...]
for(...)
#pragma omp for[...]
for(...)
}
Il problema è che ho alcune parti quelli devono essere eseguire da un solo filo, ma in un ciclo, che contiene loop quelli devono essere eseguire in parallelo ... Questo è come appare:
//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
}
(I confini di loop sono piuttosto piccole nel mio esempio nel mio programma il numero di iterazioni può va fino 20.000 ....) una delle mie prime idea era quella di fare qualcosa di simile :
//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
Non si compila, ottengo questo errore da gcc: "la regione di condivisione del lavoro potrebbe non essere strettamente annidata all'interno dell'area di lavoro condivisa, critica, ordinata, principale o esplicita".
So che proviene sicuramente dal nesting "sbagliato", ma non riesco a capire perché non funzioni. Devo aggiungere una barriera prima della zona parallela? Sono un po 'perso e non so come risolverlo.
Grazie in anticipo per il vostro aiuto. Saluti.
Grazie per la risposta. Proverò a riordinare il mio codice per avere una struttura più facile da parallela. – user3014051