A.19显示不正确的嵌套的工作划分指令的示例
本节中的示例演示嵌套规则的指令。 有关指令嵌套的更多信息,请参见在第 33 页的 第2.9部分 。
,由于内部和外部 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);
}
}
}
,因为在 for 内的某个 barrier 指令会导致死锁,下面的示例是不符合:
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();
}
}