Система поддержки выполнения OpenMP-программ. Переменные окружения, управляющие выполнением OpenMP-программы

Содержание

Слайд 2

Москва, 2009 г.

Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин

Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ ©
В.А.

из 27

Содержание

Внутренние переменные, управляющие выполнением OpenMP-программы (ICV-Internal Control Variables).
Задание/опрос значений ICV-переменных.
Функции работы со временем.

Слайд 3

из 27

Для параллельных областей:
nthreads-var
thread-limit-var
dyn-var
nest-var
max-active-levels-var
Для циклов:
run-sched-var
def-sched-var
Для всей программы:
stacksize-var
wait-policy-var

Internal Control Variables.

Москва, 2009 г.

Параллельное

из 27 Для параллельных областей: nthreads-var thread-limit-var dyn-var nest-var max-active-levels-var Для циклов:
программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

Слайд 4

из 27

void work();
int main () {
omp_set_num_threads(3);
#pragma omp parallel
{

из 27 void work(); int main () { omp_set_num_threads(3); #pragma omp parallel
omp_set_num_threads(omp_get_thread_num ()+2);
#pragma omp parallel
work();
}
}

Internal Control Variables. nthreads-var

Москва, 2009 г.

Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

Не корректно в OpenMP 2.5

Корректно в OpenMP 3.0

Слайд 5

из 27

Internal Control Variables. nthreads-var

Москва, 2009 г.

Параллельное программирование с OpenMP: Система

из 27 Internal Control Variables. nthreads-var Москва, 2009 г. Параллельное программирование с
поддержки выполнения OpenMP-программ © Бахтин В.А.

Определяет максимально возможное количество нитей в создаваемой параллельной области.
Начальное значение: зависит от реализации.
Существует одна копия этой переменной для каждой задачи.
Значение переменной можно изменить:
C shell:
setenv OMP_NUM_THREADS 16
Korn shell:
export OMP_NUM_THREADS=16
Windows:
set OMP_NUM_THREADS=16
void omp_set_num_threads(int num_threads);
Узнать значение переменной можно:
int omp_get_max_threads(void);

Слайд 6

из 27

Internal Control Variables. thread-limit-var

Москва, 2009 г.

Параллельное программирование с OpenMP: Система

из 27 Internal Control Variables. thread-limit-var Москва, 2009 г. Параллельное программирование с
поддержки выполнения OpenMP-программ © Бахтин В.А.

Определяет максимальное количество нитей, которые могут быть использованы для выполнения всей программы.
Начальное значение: зависит от реализации.
Существует одна копия этой переменной для всей программы.
Значение переменной можно изменить:
C shell:
setenv OMP_THREAD_LIMIT 16
Korn shell:
export OMP_THREAD_LIMIT=16
Windows:
set OMP_THREAD_LIMIT=16
Узнать значение переменной можно:
int omp_get_thread_limit(void)

Слайд 7

из 27

Internal Control Variables. dyn-var

Москва, 2009 г.

Параллельное программирование с OpenMP: Система

из 27 Internal Control Variables. dyn-var Москва, 2009 г. Параллельное программирование с
поддержки выполнения OpenMP-программ © Бахтин В.А.

Включает/отключает режим, в котором количество создаваемых нитей при входе в параллельную область может меняться динамически.
Начальное значение: Если компилятор не поддерживает данный режим, то false. Иначе – зависит от реализации.
Существует одна копия этой переменной для каждой задачи.
Значение переменной можно изменить:
C shell:
setenv OMP_DYNAMIC true
Korn shell:
export OMP_DYNAMIC=true
Windows:
set OMP_DYNAMIC=true
void omp_set_dynamic(int dynamic_threads);
Узнать значение переменной можно:
int omp_get_dynamic(void);

Слайд 8

из 27

Internal Control Variables. nest-var

Москва, 2009 г.

Параллельное программирование с OpenMP: Система

из 27 Internal Control Variables. nest-var Москва, 2009 г. Параллельное программирование с
поддержки выполнения OpenMP-программ © Бахтин В.А.

Включает/отключает режим поддержки вложенного параллелизма.
Начальное значение: false.
Существует одна копия этой переменной для каждой задачи.
Значение переменной можно изменить:
C shell:
setenv OMP_NESTED true
Korn shell:
export OMP_NESTED=false
Windows:
set OMP_NESTED=true
void omp_set_nested(int nested);
Узнать значение переменной можно:
int omp_get_nested(void);

Слайд 9

из 27

Internal Control Variables. max-active-levels-var

Москва, 2009 г.

Параллельное программирование с OpenMP: Система

из 27 Internal Control Variables. max-active-levels-var Москва, 2009 г. Параллельное программирование с
поддержки выполнения OpenMP-программ © Бахтин В.А.

Задает максимально возможное количество активных вложенных параллельных областей.
Начальное значение: зависит от реализации.
Существует одна копия этой переменной для всей программы.
Значение переменной можно изменить:
C shell:
setenv OMP_MAX_ACTIVE_LEVELS 2
Korn shell:
export OMP_MAX_ACTIVE_LEVELS=3
Windows:
set OMP_MAX_ACTIVE_LEVELS=4
void omp_set_max_active_levels (int max_levels);
Узнать значение переменной можно:
int omp_get_max_active_levels(void);

Слайд 10

из 27

Internal Control Variables. run-sched-var

Москва, 2009 г.

Параллельное программирование с OpenMP: Система

из 27 Internal Control Variables. run-sched-var Москва, 2009 г. Параллельное программирование с
поддержки выполнения OpenMP-программ © Бахтин В.А.

Задает способ распределения витков цикла между нитями, если указана клауза schedule(runtime).
Начальное значение: зависит от реализации.
Существует одна копия этой переменной для каждой задачи.
Значение переменной можно изменить:
C shell:
setenv OMP_SCHEDULE "guided,4"
Korn shell:
export OMP_SCHEDULE "dynamic,5"
Windows:
set OMP_SCHEDULE=static
void omp_set_schedule(omp_sched_t kind, int modifier);
Узнать значение переменной можно:
void omp_get_schedule(omp_sched_t * kind, int * modifier );

typedef enum omp_sched_t {
omp_sched_static = 1,
omp_sched_dynamic = 2,
omp_sched_guided = 3,
omp_sched_auto = 4
} omp_sched_t;

Слайд 11

из 27

Internal Control Variables. run-sched-var

Москва, 2009 г.

Параллельное программирование с OpenMP: Система

из 27 Internal Control Variables. run-sched-var Москва, 2009 г. Параллельное программирование с
поддержки выполнения OpenMP-программ © Бахтин В.А.

void work(int i);
int main () {
omp_sched_t schedules [] = {omp_sched_static, omp_sched_dynamic, omp_sched_guided, omp_sched_auto};
omp_set_num_threads (4);
#pragma omp parallel
{
omp_set_schedule (schedules[omp_get_thread_num()],0);
#pragma omp parallel for schedule(runtime)
for (int i=0;i }
}

Слайд 12

из 27

Internal Control Variables. def-sched-var

Москва, 2009 г.

Параллельное программирование с OpenMP: Система

из 27 Internal Control Variables. def-sched-var Москва, 2009 г. Параллельное программирование с
поддержки выполнения OpenMP-программ © Бахтин В.А.

Задает способ распределения витков цикла между нитями по умолчанию.
Начальное значение: зависит от реализации.
Существует одна копия этой переменной для всей программы.
void work(int i);
int main () {
#pragma omp parallel
{
#pragma omp for
for (int i=0;i }
}

Слайд 13

из 27

Internal Control Variables. stack-size-var

Москва, 2009 г.

Параллельное программирование с OpenMP: Система

из 27 Internal Control Variables. stack-size-var Москва, 2009 г. Параллельное программирование с
поддержки выполнения OpenMP-программ © Бахтин В.А.

Каждая нить представляет собой независимо выполняющийся поток управления со своим счетчиком команд, регистровым контекстом и стеком.
Переменная stack-size-var задает размер стека.
Начальное значение: зависит от реализации.
Существует одна копия этой переменной для всей программы.
Значение переменной можно изменить:
setenv OMP_STACKSIZE 2000500B
setenv OMP_STACKSIZE "3000 k "
setenv OMP_STACKSIZE 10M
setenv OMP_STACKSIZE " 10 M "
setenv OMP_STACKSIZE "20 m "
setenv OMP_STACKSIZE " 1G"
setenv OMP_STACKSIZE 20000

Слайд 14

из 27

Internal Control Variables. stack-size-var

Москва, 2009 г.

Параллельное программирование с OpenMP: Система

из 27 Internal Control Variables. stack-size-var Москва, 2009 г. Параллельное программирование с
поддержки выполнения OpenMP-программ © Бахтин В.А.

int main () {
int a[1024][1024];
#pragma omp parallel private (a)
{
for (int i=0;i<1024;i++)
for (int j=0;j<1024;j++)
a[i][j]=i+j;
}
}

icl /Qopenmp test.cpp
Program Exception – stack overflow
Linux: ulimit -a
ulimit -s
Windows: /F
-Wl,--stack,
setenv KMP_STACKSIZE 10m
setenv GOMP_STACKSIZE 10000
setenv OMP_STACKSIZE 10M

Слайд 15

из 27

Internal Control Variables. wait-policy-var

Москва, 2009 г.

Параллельное программирование с OpenMP: Система

из 27 Internal Control Variables. wait-policy-var Москва, 2009 г. Параллельное программирование с
поддержки выполнения OpenMP-программ © Бахтин В.А.

Подсказка OpenMP-компилятору о желаемом поведении нитей во время ожидания.
Начальное значение: зависит от реализации.
Существует одна копия этой переменной для всей программы.
Значение переменной можно изменить:
setenv OMP_WAIT_POLICY ACTIVE
setenv OMP_WAIT_POLICY active
setenv OMP_WAIT_POLICY PASSIVE
setenv OMP_WAIT_POLICY passive

IBM AIX
SPINLOOPTIME=100000
YIELDLOOPTIME=40000

Слайд 16

из 27

Internal Control Variables. Приоритеты

Москва, 2009 г.

Параллельное программирование с OpenMP: Система

из 27 Internal Control Variables. Приоритеты Москва, 2009 г. Параллельное программирование с
поддержки выполнения OpenMP-программ © Бахтин В.А.

Слайд 17

из 27

int omp_get_num_threads(void);
возвращает количество нитей в текущей параллельной области
#include
void work(int

из 27 int omp_get_num_threads(void); возвращает количество нитей в текущей параллельной области #include
i);
void test()
{
int np;
np = omp_get_num_threads(); /* np == 1*/
#pragma omp parallel private (np)
{
np = omp_get_num_threads();
#pragma omp for schedule(static)
for (int i=0; i < np; i++)
work(i);
}
}

Система поддержки выполнения OpenMP-программ.

Москва, 2009 г.

Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

Слайд 18

из 27

int omp_get_thread_num(void);
возвращает номер нити в группе [0: omp_get_num_threads()-1]
#include
void work(int

из 27 int omp_get_thread_num(void); возвращает номер нити в группе [0: omp_get_num_threads()-1] #include
i);
void test()
{
int iam;
iam = omp_get_thread_num(); /* iam == 0*/
#pragma omp parallel private (iam)
{
iam = omp_get_thread_num();
work(iam);
}
}

Система поддержки выполнения OpenMP-программ.

Москва, 2009 г.

Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

Слайд 19

из 27

int omp_get_num_procs(void);
возвращает количество процессоров, на которых программа выполняется
#include
void work(int

из 27 int omp_get_num_procs(void); возвращает количество процессоров, на которых программа выполняется #include
i);
void test()
{
int nproc;
nproc = omp_get_num_ procs();
#pragma omp parallel num_threads(nproc)
{
int iam = omp_get_thread_num();
work(iam);
}
}

Система поддержки выполнения OpenMP-программ.

Москва, 2009 г.

Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

Слайд 20

из 27

int omp_get_level(void)
- возвращает уровень вложенности для текущей параллельной области.
#include

из 27 int omp_get_level(void) - возвращает уровень вложенности для текущей параллельной области.

void work(int i) {
#pragma omp parallel
{
int ilevel = omp_get_level ();
}
}
void test()
{
int ilevel = omp_get_level (); /*ilevel==0*/
#pragma omp parallel private (ilevel)
{
ilevel = omp_get_level ();
int iam = omp_get_thread_num();
work(iam);
}
}

Система поддержки выполнения OpenMP-программ.

Москва, 2009 г.

Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

Слайд 21

из 27

int omp_get_active_level(void)
- возвращает количество активных параллельных областей (выполняемых 2-мя

из 27 int omp_get_active_level(void) - возвращает количество активных параллельных областей (выполняемых 2-мя
или более нитями).
#include
void work(int iam, int size) {
#pragma omp parallel
{
int ilevel = omp_get_active_level ();
}
}
void test()
{
int size = 0;
int ilevel = omp_get_active_level (); /*ilevel==0*/
scanf("%d",&size);
#pragma omp parallel if (size>10)
{
int iam = omp_get_thread_num();
work(iam, size);
}
}

Система поддержки выполнения OpenMP-программ.

Москва, 2009 г.

Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

Слайд 22

из 27

int omp_get_ancestor_thread_num (int level)
- для нити, вызвавшей данную функцию,

из 27 int omp_get_ancestor_thread_num (int level) - для нити, вызвавшей данную функцию,
возвращается номер нити-родителя, которая создала указанную параллельную область.
omp_get_ancestor_thread_num (0) = 0
If (level==omp_get_level()) {
omp_get_ancestor_thread_num (level) == omp_get_thread_num ();
}
If ((level<0)||(level>omp_get_level())) {
omp_get_ancestor_thread_num (level) == -1;
}

Система поддержки выполнения OpenMP-программ.

Москва, 2009 г.

Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

Слайд 23

из 27

int omp_get_team_size(int level);
- количество нитей в указанной параллельной области.
omp_get_team_size

из 27 int omp_get_team_size(int level); - количество нитей в указанной параллельной области.
(0) = 1
If (level==omp_get_level()) {
omp_get_team_size (level) == omp_get_num _threads ();
}
If ((level<0)||(level>omp_get_level())) {
omp_get_team_size (level) == -1;
}

Система поддержки выполнения OpenMP-программ.

Москва, 2009 г.

Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

Слайд 24

из 27

double omp_get_wtime(void);
возвращает для нити астрономическое время в секундах, прошедшее с

из 27 double omp_get_wtime(void); возвращает для нити астрономическое время в секундах, прошедшее
некоторого момента в прошлом. Если некоторый участок окружить вызовами данной функции, то разность возвращаемых значений покажет время работы данного участка. Гарантируется, что момент времени, используемый в качестве точки отсчета, не будет изменен за время выполнения программы.
double start;
double end;
start = omp_get_wtime();
/*... work to be timed ...*/
end = omp_get_wtime();
printf("Work took %f seconds\n", end - start);
double omp_get_wtick(void);
- возвращает разрешение таймера в секундах (количество секунд между последовательными импульсами таймера).

Система поддержки выполнения OpenMP-программ. Функции работы со временем

Москва, 2009 г.

Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

Слайд 25

из 27

Спасибо за внимание!
Вопросы?

Москва, 2009 г.

Параллельное программирование с OpenMP: Система поддержки

из 27 Спасибо за внимание! Вопросы? Москва, 2009 г. Параллельное программирование с
выполнения OpenMP-программ © Бахтин В.А.

Слайд 26

из 27

Наиболее часто встречаемые ошибки в OpenMP-программах. Функциональная отладка OpenMP-программ.

Следующая тема

Москва,

из 27 Наиболее часто встречаемые ошибки в OpenMP-программах. Функциональная отладка OpenMP-программ. Следующая
2009 г.

Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

Имя файла: Система-поддержки-выполнения-OpenMP-программ.-Переменные-окружения,-управляющие-выполнением-OpenMP-программы.pptx
Количество просмотров: 138
Количество скачиваний: 0