Программа демонстрирует выполнение различных блоков разными нитями.
C / C++ - пример директивы sections
#include <omp.h>
#define N 1000
main ()
{
int i;
float a[N], b[N], c[N], d[N];
/* Some initializations */
for (i=0; i < N; i++)
a[i] = i * 1.5;
b[i] = i + 22.35;
#pragma omp parallel shared(a,b,c,d) private(i)
{
#pragma omp sections nowait
{
#pragma omp section
for (i=0; i < N; i++)
c[i] = a[i] + b[i];
#pragma omp section
for (i=0; i < N; i++)
d[i] = a[i] * b[i];
} /* end of sections */
} /* end of parallel section */
}
|
SINGLE Directive
Purpose:
- Директива определяет, что содержимое секции должно быть выполнено лишь один раз нитью, первой дошедшей до данной точки программы (такая ситуация иногда возникает, например, при работе с общими переменными).
- Используется в секциях где код не является безопасным по отношению к множеству потоков (thread safe). Например, ввод-вывод данных.
Format:
#pragma omp single [clause...] newline private (list) firstprivate (list) nowait structured_blockRestrictions:
- Нельзя использовать операторы перехода из и в блока SINGLE.
C / C++ - пример директивы sections
#include <omp.h>
#define N 1000
main ()
{
int i;
float a[N], b[N], c[N], d[N];
/* Some initializations */
for (i=0; i < N; i++)
a[i] = i * 1.5;
b[i] = i + 22.35;
#pragma omp parallel shared(a,b,c,d) private(i)
{
#pragma omp sections nowait
{
#pragma omp section
for (i=0; i < N; i++)
c[i] = a[i] + b[i];
#pragma omp section
for (i=0; i < N; i++)
d[i] = a[i] * b[i];
} /* end of sections */
} /* end of parallel section */
}






