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

Презентация:



Advertisements
Похожие презентации
Интернет Университет Суперкомпьютерных технологий Конструкции для синхронизации нитей. Система поддержки выполнения OpenMP- программ. Учебный курс Параллельное.
Advertisements

Интернет Университет Суперкомпьютерных технологий Отладка эффективности OpenMP- программ. Учебный курс Параллельное программирование с OpenMP Бахтин В.А.,
Интернет Университет Суперкомпьютерных технологий Конструкции для синхронизации нитей. Система поддержки выполнения OpenMP- программ. Учебный курс Параллельное.
Технология параллельного программирования OpenMP Шальнов Евгений Вадимович Автор слайдов: Бахтин Владимир Александрович.
Отладка эффективности OpenMP- программ. Параллельное программирование с OpenMP Бахтин Владимир Александрович Ассистент кафедры системного программированния.
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 2 Томский политехнический.
МГУ им. М.В. Ломоносова, Москва, 21 октября 2011г. КОНСОРЦИУМ УНИВЕРСИТЕТОВ РОССИИ Курс: «Технология параллельного программирования OpenMP» Лабораторная.
Интернет Университет Суперкомпьютерных технологий Основные понятия Учебный курс Параллельное программирование с OpenMP Бахтин В.А., кандидат физ.-мат.
Интернет Университет Суперкомпьютерных технологий Отладка эффективности OpenMP- программ. Параллельное программирование с OpenMP Бахтин Владимир Александрович.
Отладка эффективности OpenMP- программ. Технология параллельного программирования OpenMP Бахтин Владимир Александрович Ассистент кафедры системного программированния.
Интернет Университет Суперкомпьютерных технологий Основные понятия Учебный курс Параллельное программирование с OpenMP Бахтин В.А., кандидат физ.-мат.
Многопоточное программирование в OpenMP Киреев Сергей ИВМиМГ.
Интернет Университет Суперкомпьютерных технологий Конструкции для синхронизации нитей Учебный курс Параллельное программирование с OpenMP Бахтин В.А.,
Вложенные параллельные области Если переменная среды OMP_NESTED имеет значение true, то любая нить параллельной области может породить новую параллельную.
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Томский политехнический университет.
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 3 Томский политехнический.
OpenMP. Различие между тредами и процессами ПроцессыТреды.
OpenMPOpenMPРазличие между тредами и процессами ПроцессыТреды.
Технология параллельного программирования OpenMP Бахтин Владимир Александрович к.ф.-м.н., зав. сектором Института прикладной математики им М.В.Келдыша.
Разработка параллельных приложений для многоядерных систем С.В. Ковальчук НИИ Наукоемких компьютерных технологий, СПбГУ ИТМО.
Транксрипт:

Интернет Университет Суперкомпьютерных технологий Система поддержки выполнения OpenMP- программ. Переменные окружения, управляющие выполнением OpenMP- программы Учебный курс Параллельное программирование с OpenMP Бахтин В.А., кандидат физ.-мат. наук, заведующий сектором, Институт прикладной математики им. М.В.Келдыша РАН

Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А. 2 из 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 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

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 из 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 из 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 из 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 из 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 из 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 из 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 из 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 из 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 из 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 из 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 из 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 из 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 из 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 из 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 из 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 из 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 из 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) - для нити, вызвавшей данную функцию, возвращается номер нити- родителя, которая создала указанную параллельную область. 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 из 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 из 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: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

26 из 27 Наиболее часто встречаемые ошибки в OpenMP- программах. Функциональная отладка OpenMP- программ. Следующая тема Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.

27 из 27 Бахтин В.А., кандидат физ.-мат. наук, заведующий сектором, Институт прикладной математики им. М.В.Келдыша РАН Контакты Москва, 2009 г. Параллельное программирование с OpenMP: Система поддержки выполнения OpenMP-программ © Бахтин В.А.