Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Gli esempi di questa sezione vengono illustrate le regole direttive di annidamento.Per ulteriori informazioni sull'annidamento la direttiva, vedere parte 2,9 nella pagina 33.
Nell'esempio non è conforme perché l'interno e esterno for le direttive sono annidate e vincolano gli stessi parallel direttiva:
void wrong1(int n)
{
#pragma omp parallel default(shared)
{
int i, j;
#pragma omp for
for (i=0; i<n; i++) {
#pragma omp for
for (j=0; j<n; j++)
work(i, j);
}
}
}
La versione seguente dinamicamente annidata esempio precedente viene inoltre non compatibile:
void wrong2(int n)
{
#pragma omp parallel default(shared)
{
int i;
#pragma omp for
for (i=0; i<n; i++)
work1(i, n);
}
}
void work1(int i, int n)
{
int j;
#pragma omp for
for (j=0; j<n; j++)
work2(i, j);
}
Nell'esempio non è conforme perché for e single le direttive sono annidate e sono associati alla stessa area parallela:
void wrong3(int n)
{
#pragma omp parallel default(shared)
{
int i;
#pragma omp for
for (i=0; i<n; i++) {
#pragma omp single
work(i);
}
}
}
Nell'esempio non è conforme perché barrier direttiva in un oggetto for può provocare un deadlock:
void wrong4(int n)
{
#pragma omp parallel default(shared)
{
int i;
#pragma omp for
for (i=0; i<n; i++) {
work1(i);
#pragma omp barrier
work2(i);
}
}
}
Nell'esempio non è conforme perché barrier risultati in deadlock dovuto al fatto che un solo thread alla volta possibile attivare la sezione critica:
void wrong5()
{
#pragma omp parallel
{
#pragma omp critical
{
work1();
#pragma omp barrier
work2();
}
}
}
Nell'esempio non è conforme perché barrier risultati in deadlock dovuto al fatto che solo un thread esegue single sezione:
void wrong6()
{
#pragma omp parallel
{
setup();
#pragma omp single
{
work1();
#pragma omp barrier
work2();
}
finish();
}
}