A.19 範例會顯示不正確的巢狀結構的工作共用的指示詞
本章節範例說明了這些指示詞的巢狀規則。 如需有關指示詞的巢狀結構的詳細資訊,請參閱一節 2.9 在頁面上 33。
下列範例是不相容因為內部和外部for指示詞巢狀結構,並繫結至相同parallel指示詞:
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);
}
}
}
上述範例中的下列動態巢狀的版本也是不相容的:
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);
}
下列範例是不相容因為for和single指示詞巢狀結構,以及它們所繫結至同一個平行區域:
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);
}
}
}
下列範例是不相容因為barrier指示詞內for可能會導致死結:
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);
}
}
}
下列範例是不相容因為barrier因為用一次只能有一個執行緒可以進入重要區段會導致死結:
void wrong5()
{
#pragma omp parallel
{
#pragma omp critical
{
work1();
#pragma omp barrier
work2();
}
}
}
下列範例是不相容因為barrier因為之故只能有一個執行緒執行會導致死結single一節:
void wrong6()
{
#pragma omp parallel
{
setup();
#pragma omp single
{
work1();
#pragma omp barrier
work2();
}
finish();
}
}