A.19 Примеры неправильного вложения директив совместной работы
Примеры в этом разделе демонстрируют директивные правила вложения. Дополнительные сведения о вложении см. в разделе директивном Раздел 2.9 на странице 33.
В следующем примере noncompliant поскольку внутренняя и outer 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);
}
}
}
Следующая динамически вложенных версия предыдущего примера также noncompliant:
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);
}
В следующем примере noncompliant поскольку 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);
}
}
}
В следующем примере noncompliant поскольку a barrier директива in a 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);
}
}
}
В следующем примере noncompliant поскольку barrier результаты взаимоблокировке из-за факту, что одновременно только один поток может ввести критическую секцию.
void wrong5()
{
#pragma omp parallel
{
#pragma omp critical
{
work1();
#pragma omp barrier
work2();
}
}
}
В следующем примере noncompliant поскольку barrier результаты взаимоблокировке из-за факту которому только один поток выполнения single раздел:
void wrong6()
{
#pragma omp parallel
{
setup();
#pragma omp single
{
work1();
#pragma omp barrier
work2();
}
finish();
}
}