Przykłady A.19 pokazujące niepoprawne zagnieżdżanie dyrektyw podziału pracy
Przykłady w tej części ilustrują dyrektywa zasady zagnieżdżenia.Aby uzyskać więcej informacji na zagnieżdżanie w dyrektywie, zobacz 2.9 sekcji na stronie 33.
Poniższy przykład jest niezgodnych ponieważ wewnętrzne i zewnętrzne for dyrektyw są zagnieżdżone i powiązać to samo parallel dyrektywę:
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);
}
}
}
Niezgodne jest również następujące dynamicznie zagnieżdżonych wersja poprzedniego przykładu:
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);
}
Poniższy przykład jest niezgodnych ponieważ for i single dyrektyw są zagnieżdżone i powiązać tego samego regionu równoległy:
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);
}
}
}
Poniższy przykład jest niezgodnych ponieważ barrier dyrektywa wewnątrz for może powodować zakleszczenie:
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);
}
}
}
Poniższy przykład jest niezgodnych ponieważ barrier skutkuje zakleszczenia, ze względu na fakt, że tylko jeden wątek na raz można wprowadzić sekcji krytycznej:
void wrong5()
{
#pragma omp parallel
{
#pragma omp critical
{
work1();
#pragma omp barrier
work2();
}
}
}
Poniższy przykład jest niezgodnych ponieważ barrier skutkuje zakleszczenia, ze względu na fakt, że tylko jeden wątek wykonuje single sekcji:
void wrong6()
{
#pragma omp parallel
{
setup();
#pragma omp single
{
work1();
#pragma omp barrier
work2();
}
finish();
}
}