Слайд 2
![Директива #pragma omp parallel [опция[[,] опция]...] задает параллельную область. Возможные](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-1.jpg)
Директива
#pragma omp parallel [опция[[,] опция]...]
задает параллельную область.
Возможные опции:
If (условие)
num_threads (целочисленное выражение)
default(shared|none)
private(список)
firstprivate(список)
shared(список)
copyin(список)
reduction(оператор:список)
Слайд 3
![Функции double omp_get_wtime ( ); возвращает в вызвавшей нити астрономическое](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-2.jpg)
Функции
double omp_get_wtime ( );
возвращает в вызвавшей нити астрономическое время в секундах
(вещественное число двойной точности), прошедшее с некоторого момента в прошлом.
double omp_get_wtick ( );
возвращает в вызвавшей нити разрешение таймера в секундах.
Слайд 4
![Переменные среды и вспомогательные функции Количество нитей, выполняющих параллельную область,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-3.jpg)
Переменные среды и вспомогательные функции
Количество нитей, выполняющих параллельную область, задается переменной
среды OMP_NUM_THREADS.
Функции
omp_set_num_threads (int num);
int omp_get_num_threads ();
позволяют задать и считать значение переменной
OMP_NUM_THREADS.
Слайд 5
![Переменные среды и вспомогательные функции Возможность динамически изменять количество нитей,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-4.jpg)
Переменные среды и вспомогательные функции
Возможность динамически изменять количество нитей, используемых для
выполнения параллельной области, задается переменной среды OMP_DYNAMIC.
Функции
omp_set_dynamic (int num);
int omp_get_dynamic ( );
позволяют задать и считать значение переменной
OMP_DYNAMIC.
Слайд 6
![Переменные среды и вспомогательные функции Функция int omp_get_max_threads ( );](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-5.jpg)
Переменные среды и вспомогательные функции
Функция
int omp_get_max_threads ( );
возвращает максимально
допустимое число нитей для использования в следующей параллельной области.
Функция
int omp_get_num_procs ( );
возвращает количество процессоров, доступных для использования программе пользователя на момент вызова.
Слайд 7
![Переменные среды и вспомогательные функции Переменная среды OMP_NESTED, управляет возможностью](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-6.jpg)
Переменные среды и вспомогательные функции
Переменная среды OMP_NESTED, управляет возможностью вложения параллельных
областей.
Функции
omp_set_nested (int num);
int omp_get_nested ( );
позволяют задать и считать значение переменной
OMP_NESTED.
Слайд 8
![Пример #include #include int main(int argc, char *argv[]) { int](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-7.jpg)
Пример
#include
#include
int main(int argc, char *argv[])
{
int n;
omp_set_nested(1);
#pragma omp parallel private(n)
{
n=omp_get_thread_num();
#pragma
omp parallel
{
printf("Часть 1, нить %d - %d\n", n, omp_get_thread_num());
}
}
Слайд 9
![Пример omp_set_nested(0); #pragma omp parallel private(n) { n=omp_get_thread_num(); #pragma omp](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-8.jpg)
Пример
omp_set_nested(0);
#pragma omp parallel private(n)
{
n=omp_get_thread_num();
#pragma omp parallel
{
printf("Часть 2, нить %d -
%d\n", n, omp_get_thread_num());
}
}
}
Слайд 10
![omp_in_parallel() Функция int omp_in_parallel(void); возвращает 1, если она была вызвана из активной параллельной области программы.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-9.jpg)
omp_in_parallel()
Функция
int omp_in_parallel(void);
возвращает 1, если она была вызвана из активной параллельной
области программы.
Слайд 11
![Пример #include #include void mode(void) { if(omp_in_parallel()) printf("Параллельная область\n"); else printf("Последовательная область\n"); }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-10.jpg)
Пример
#include
#include
void mode(void)
{
if(omp_in_parallel())
printf("Параллельная область\n");
else printf("Последовательная область\n");
}
Слайд 12
![Пример int main(int argc, char *argv[]) { mode(); #pragma omp](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-11.jpg)
Пример
int main(int argc, char *argv[])
{
mode();
#pragma omp parallel
{
#pragma omp master
{
mode();
}
}
}
Слайд 13
![Директива single Директивой single выделяется участок кода в параллельной области,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-12.jpg)
Директива single
Директивой single выделяется участок кода в параллельной области, который должен
быть выполнен только один раз.
Возможные опции:
private(список)
firstprivate(список)
copyprivate(список)
nowait
Слайд 14
![Пример #include #include int main(int argc, char *argv[]) { #pragma](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-13.jpg)
Пример
#include
#include
int main(int argc, char *argv[])
{
#pragma omp parallel
{
printf("Сообщение 1\n");
#pragma omp
single nowait
{
printf("Одна нить\n");
}
printf("Сообщение 2\n");
}
}
Слайд 15
![Пример #include #include int main(int argc, char *argv[]) { int](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-14.jpg)
Пример
#include
#include
int main(int argc, char *argv[])
{
int n;
#pragma omp parallel private(n)
{
n=omp_get_thread_num();
printf("Значение
n (начало): %d\n", n);
#pragma omp single copyprivate(n)
{ n=100; }
printf("Значение n (конец): %d\n", n);
}
}
Слайд 16
![Директива master Директива master определяет участок кода, который будет выполнен только нитью-мастером. #pragma omp master](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-15.jpg)
Директива master
Директива master определяет участок кода, который будет выполнен только нитью-мастером.
#pragma
omp master
Слайд 17
![Пример #include int main(int argc, char *argv[]) { int n;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/373888/slide-16.jpg)
Пример
#include
int main(int argc, char *argv[])
{
int n;
#pragma omp parallel private(n)
{
n=1;
#pragma
omp master
{ n=2; }
printf("Первое значение n: %d\n", n);
#pragma omp barrier
#pragma omp master
{ n=3; }
printf("Второе значение n: %d\n", n);
}
}