Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 12 лет назад пользователемwww.hpcu.ru
1 Интернет Университет Суперкомпьютерных технологий Система поддержки выполнения OpenMP- программ. Переменные окружения, управляющие выполнением OpenMP- программы Учебный курс Параллельное программирование с OpenMP Бахтин В.А., кандидат физ.-мат. наук, заведующий сектором, Институт прикладной математики им. М.В.Келдыша РАН
2 Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А. 2 из 27 Содержание Внутренние переменные, управляющие выполнением OpenMP-программы (ICV-Internal Control Variables). Задание/опрос значений ICV-переменных. Функции работы со временем.
3 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 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.
4 4 из 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 5 из 27 Internal Control Variables. nthreads-var Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения 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 6 из 27 Internal Control Variables. thread-limit-var Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения 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 7 из 27 Internal Control Variables. dyn-var Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения 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 8 из 27 Internal Control Variables. nest-var Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения 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 9 из 27 Internal Control Variables. max-active-levels-var Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения 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 10 из 27 Internal Control Variables. run-sched-var Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения 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 11 из 27 Internal Control Variables. run-sched-var Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения 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 12 из 27 Internal Control Variables. def-sched-var Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А. Задает способ распределения витков цикла между нитями по умолчанию. Начальное значение: зависит от реализации. Существует одна копия этой переменной для всей программы. void work(int i); int main () { #pragma omp parallel { #pragma omp for for (int i=0;i
13 13 из 27 Internal Control Variables. stack-size-var Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А. Каждая нить представляет собой независимо выполняющийся поток управления со своим счетчиком команд, регистровым контекстом и стеком. Переменная stack-size-var задает размер стека. Начальное значение: зависит от реализации. Существует одна копия этой переменной для всей программы. Значение переменной можно изменить: setenv OMP_STACKSIZE B 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 14 из 27 Internal Control Variables. stack-size-var Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А. int main () { int a[1024][1024]; #pragma omp parallel private (a) { for (int i=0;i
15 15 из 27 Internal Control Variables. wait-policy-var Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения 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= YIELDLOOPTIME=40000
16 16 из 27 Internal Control Variables. Приоритеты Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А. клаузавызов функциипеременная окруженияICV omp_set_dynamic()OMP_DYNAMICdyn-var omp_set_nested()OMP_NESTEDnest-var num_threadsomp_set_num_threads()OMP_NUM_THREADSnthreads-var scheduleomp_set_schedule()OMP_SCHEDULErun-sched-var scheduledef-sched-var OMP_STACKSIZEstacksize-var OMP_WAIT_POLICYwait-policy-var OMP_THREAD_LIMITthread-limit-var omp_set_max_active_ levels() OMP_MAX_ACTIVE_ LEVELS max-active-levels-var
17 17 из 27 int omp_get_num_threads(void); - возвращает количество нитей в текущей параллельной области #include void work(int 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 18 из 27 int omp_get_thread_num(void); - возвращает номер нити в группе [0: omp_get_num_threads()-1] #include void work(int 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 19 из 27 int omp_get_num_procs(void); - возвращает количество процессоров, на которых программа выполняется #include void work(int 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 20 из 27 int omp_get_level(void) - возвращает уровень вложенности для текущей параллельной области. #include 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 21 из 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-программ © Бахтин В.А. 10) { int iam = omp_get_thread_num(); work(iam, size); } Система поддержки выполнения OpenMP- программ. Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.">
22 22 из 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 omp_get_level())) { omp_get_ancestor_thread_num (level) == -1; } Система поддержки выполнения OpenMP- программ. Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.
23 23 из 27 int omp_get_team_size(int level); - количество нитей в указанной параллельной области. omp_get_team_size (0) = 1 If (level==omp_get_level()) { omp_get_team_size (level) == omp_get_num _threads (); } If ((level omp_get_level())) { omp_get_team_size (level) == -1; } Система поддержки выполнения OpenMP- программ. Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.
24 24 из 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 25 из 27 Спасибо за внимание! Вопросы? Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.
26 26 из 27 Наиболее часто встречаемые ошибки в OpenMP- программах. Функциональная отладка OpenMP- программ. Следующая тема Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.
27 27 из 27 Бахтин В.А., кандидат физ.-мат. наук, заведующий сектором, Институт прикладной математики им. М.В.Келдыша РАН Контакты Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.