Е.Ю. Алексеева Механико-математический факультет Южно-Уральского государственного университета.

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



Advertisements
Похожие презентации
Параллельное программирование для ресурсоёмких задач численного моделирования в физике В.О. Милицин, Д.Н. Янышев, И.А. Буткарев Центр компьютерной физики.
Advertisements

Многопоточное программирование в OpenMP Киреев Сергей ИВМиМГ.
OpenMP. Различие между тредами и процессами ПроцессыТреды.
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 3 Томский политехнический.
OpenMPOpenMPРазличие между тредами и процессами ПроцессыТреды.
Разработка параллельных приложений для многоядерных систем С.В. Ковальчук НИИ Наукоемких компьютерных технологий, СПбГУ ИТМО.
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 2 Томский политехнический.
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Томский политехнический университет.
Гергель В.П. Общий курс Теория и практика параллельных вычислений Лекция 16 Методы разработки параллельных программ для многопроцессорных систем с общей.
Основы OpenMP Nikita Panov
POSIX Threads & OpenMP Общая память Сергей Петрович Нечаев, Сибирский Суперкомпьютерный центр.
Е.Ю. Алексеева Механико-математический факультет Южно-Уральского государственного университета.
Нижегородский государственный университет им. Н.И.Лобачевского Факультет Вычислительной математики и кибернетики Введение в OpenMP Гергель В.П., Сысоев.
Интернет Университет Суперкомпьютерных технологий Система поддержки выполнения OpenMP- программ. Переменные окружения, управляющие выполнением OpenMP-
Система автоматизации распараллеливания: отображение на мультипроцессор Выполнил: студент 528 группы Лойко Михаил Юрьевич Научный руководитель: профессор,
Гергель В.П. Общий курс Теория и практика параллельных вычислений Лекция 15 Методы разработки параллельных программ для многопроцессорных систем с общей.
Вложенные параллельные области Если переменная среды OMP_NESTED имеет значение true, то любая нить параллельной области может породить новую параллельную.
Программирование многоядерных архитектур (слайды для лекции 2013/04/20) Киреев С.Е., Маркова В.П., Остапкевич М.Б., Перепелкин В.А. МО ВВС ИВМиМГ СО РАН.
Интернет Университет Суперкомпьютерных технологий Отладка эффективности OpenMP- программ. Учебный курс Параллельное программирование с OpenMP Бахтин В.А.,
Интернет Университет Суперкомпьютерных технологий Конструкции для синхронизации нитей Учебный курс Параллельное программирование с OpenMP Бахтин В.А.,
Транксрипт:

Е.Ю. Алексеева Механико-математический факультет Южно-Уральского государственного университета

Содержание лекции n Основные принципы OpenMP (продолжение) n Синхронизация в OpenMP n Дополнительные возможности OpenMP n Обзор Cluster OpenMP Механико-математический факультет Южно-Уральского государственного университета

Использование потоков (общее адресное пространство) Пульсирующий (fork-join) параллелизм Главный поток по мере необходимости инициирует параллельные потоки Параллелизм включается в обычную последовательную программу, которая сохраняет свою работоспособность в обычном режиме Принцип организации Механико-математический факультет Южно-Уральского государственного университета

Разделение работы (work-sharing constructs) Do/for - распараллеливание циклов (параллелизм данных) Sections - функциональное распараллеливание Single - директива для указания последовательного выполнения кода Механико-математический факультет Южно-Уральского государственного университета

Совместимость директив и их параметров Механико-математический факультет Южно-Уральского государственного университета

Переменные окружения OpenMP OMP_NUM_THREADS - определяет число нитей для исполнения параллельных областей приложения. OMP_SCHEDULE - определяет способ распределения итераций в цикле, если в директиве DO использовано предложение SCHEDULE(RUNTIME). OMP_DYNAMIC - разрешает или запрещает динамическое изменение числа нитей. OMP_NESTED - разрешает или запрещает вложенный параллелизм. Пример Механико-математический факультет Южно-Уральского государственного университета

Задание переменных окружения с помощью функций runtime OpenMP (void) omp_set_num_threads(int num_threads) – задает число потоков в области параллельных вычислений int omp_get_num_threads() – возвращает количество потоков в текущий момент int omp_get_max_threads() – возвращает максимальное количество потоков, которое может быть возвращено функцией omp_get_num_threads int_omp_get_thread_num() – возвращает номер потока от 0 до количество потоков - 1 int omp_get_num_procs() – возвращает количество процессоров доступных программе (int/logical) omp_in_parallel() – возвращает TRUE из параллельной области программы и FALSE из последовательной (void) omp_set_dynamic( TRUE | FALSE ) – определяет или отменяет динамический режим (int/logical) omp_get_dynamic() – возвращает TRUE, если режим динамический, и FALSE в противном случае (void) omp_set_nested( TRUE | FALSE ) – определяет или отменяет вложенный режим для параллельной обработки (int/logical) omp_get_nested() – возвращает TRUE, если режим вложенный, и FALSE в противном случае Механико-математический факультет Южно-Уральского государственного университета

Синхронизация в OpenMP Типы синхронизации в OpenMP critical atomic barrier master ordered flush Механико-математический факультет Южно-Уральского государственного университета

Синхронизация в OpenMP: тип critical Поток описанный как critical section выполняется в монопольном режиме процессора Синтаксис C/C++ #pragma omp critical [ (name) ] structured_block FORTRAN !$omp critical [ (name) ] structured_block !$omp end critical [ (name) ] Разные критические секции независимы, если они имеют разные имена Не поименованные критические секции относятся к одной и той же секции Механико-математический факультет Южно-Уральского государственного университета

Синхронизация в OpenMP: тип atomic Предотвращает прерывания доступа, чтения и записи данных, находящихся в общей памяти, со стороны других потоков Синтаксис C/C++ #pragma omp atomic statement FORTRAN !$omp atomic statement Является альтернативой reduction Применяется только для операторов следующих непосредственно за описанием Очень дорогая операция с точки зрения временных затрат при выполнении программы Выполняется автоматически по умолчанию при завершении циклов в параллельном режиме. Исключается командой nowait Механико-математический факультет Южно-Уральского государственного университета

Синхронизация в OpenMP: тип barrier Устанавливает режим ожидания завершения работы всех потоков по достижению barrier Синтаксис C/C++ #pragma omp barrier FORTRAN !$omp barrier Механико-математический факультет Южно-Уральского государственного университета

Синхронизация в OpenMP: тип master В этом случае следующий за описанием блок выполняется только в главном потоке. Остальные потоки обходят этот блок без неявного режима barrier Синтаксис C/C++ #pragma omp master structured_block FORTRAN !$omp master structured_block !$omp end master Механико-математический факультет Южно-Уральского государственного университета

Синхронизация в OpenMP: тип ordered В этом случае в следующем за описанием блоке циклы выполняются в порядке, как в последовательной программе Синтаксис C/C++ #pragma omp ordered structured_block FORTRAN !$omp ordered structured_block !$omp end ordered Механико-математический факультет Южно-Уральского государственного университета

Синхронизация в OpenMP: тип flush В этом случае значения всех общих переменных потоков должны быть сброшены в память Синтаксис C/C++ #pragma omp flush(var1 [, var2]…) FORTRAN !$omp flush(var1 [, var2]…) Механико-математический факультет Южно-Уральского государственного университета

Дополнительные возможности Механико-математический факультет Южно-Уральского государственного университета

Дополнительные возможности: миграция данных с помощью директивы threadprivate в Fortran Директива threadprivate позволяет сохранять данные параллельных потоков на протяжении всей программы Для этого необходимо поместить переменные в common блок, а затем описать этот блок с помощью директивы threadprivate В процессе миграции сохраняется соответствие между значениями мигрирующих переменных и номерами потоков Синтаксис FORTRAN !$omp threadprivate (/cb/[,/cb2/…]) Механико-математический факультет Южно-Уральского государственного университета

Дополнительные возможности: миграция данных с помощью директивы threadprivate в С/С++ Синтаксис С/С++ #pragma omp threadprivate (cb1 [, cb2]…) Элементами списка не могут быть ссылки или переменные не полностью определенные, а также адреса констант Нельзя использовать элементы списка в всех директивах OpenMP кроме copyin, schedule и if Нельзя использовать threadprivate в динамическом режиме работы программы Механико-математический факультет Южно-Уральского государственного университета

Дополнительные возможности OpenMP: передача данных при миграции С помощью выражения copyin можно просто передавать данные из главного потока в параллельный Синтаксис C/C++ copyin (var1 [,var2]…) FORTRAN copyin (/cb/[,/cb2/…]) На FORTRAN в copyin задаются имена common блоков, в которых описаны мигрирующие переменные, а в С/C+ - имена самих переменных Механико-математический факультет Южно-Уральского государственного университета

Дополнительные возможности OpenMP: функции блокировки C/C++ void omp_init_lock(omp_lock_t *lock) – блокирует объект с указателем lock void omp_destroy_lock(omp_lock_t *lock) – гарантирует, что объект с указателем lock не инициализирован void omp_set_lock(omp_lock_t *lock) – блокирует выполнение потока до тех пор, пока объект открыт для операций чтения или записи, после их завершения блокирует объект и продолжает выполнение потока void omp_unset_lock(omp_lock_t *lock) – открывает заблокированный объект int omp_test_lock(omp_lock_t *lock) – пытается заблокировать объект не прерывая выполнения потока (возвращает TRUE или ненулевое значение, если попытка завершилась успешно, в противном случае возвращает 0) необходимо включение #include FORTRAN subroutine omp_init_lock(omp_lock_t lock) subroutine omp_destroy_lock(omp_lock_t lock) subroutine omp_set_lock(omp_lock_t lock) subroutine omp_unset_lock(omp_lock_t lock) logical omp_test_lock(omp_lock_t *lock) переменная lock должна быть целочисленной типа KIND и иметь размерность достаточную для записи адреса Механико-математический факультет Южно-Уральского государственного университета

Общие рекомендации Механико-математический факультет Южно-Уральского государственного университета

Зависимость по данным Для эффективного распараллеливания необходимо обеспечить независимость по данным между петлями (итерациями) циклов операторов do/for Если зависимости по данным между петлями циклов отсутствуют, то они называются независимыми по данным Часто зависимости по данным между петлями циклов могут быть исключены с помощью модификации алгоритмов Пример рекурсии с зависимостью по данным Элементарное распараллеливание Механико-математический факультет Южно-Уральского государственного университета

Зависимость по данным Reduction Распараллеливание осуществляется с помощью применения конструкции reduction к циклу do Механико-математический факультет Южно-Уральского государственного университета

Зависимость по данным Циклы с условными выходами не распараллеливаются Вложенные циклы: в следующем примере Распараллеливание возможно только на самом верхнем уровне по k Механико-математический факультет Южно-Уральского государственного университета

Проблемы отладки OpenMP программ: условия состязательности (race conditions) При работе программ с общей памятью возникает ряд специфических ошибок, одна из которых связана с так называемыми условиями состязательности (race conditions) Эти ошибки состоят в непредсказуемом времени завершении параллельных потоков и возникновении в результате этого непредсказуемых результатов вычислений Пример Результат в этом примере зависит от того как и в какой последовательности выполняются параллельные потоки Механико-математический факультет Южно-Уральского государственного университета

Проблемы отладки OpenMP программ: мертвая блокировка (deadlock) В процессе выполнения программ с общей памятью возможна ситуация, когда поток ожидает освобождения доступа к объекту, который никогда не будет открыт В следующем примере видно, что такая ситуация возникает, когда объект А заблокирован в одном потоке, а объект В в другом В случае, если оба объекта заблокированы в одном потоке, то возникает условие состязательности Пример Механико-математический факультет Южно-Уральского государственного университета

Проблемы отладки OpenMP программ: некоторые дополнительные опасные ситуации Используемые в программах библиотеки должны быть безопасны с точки зрения потокового выполнения. Стандартные библиотеки всегда удовлетворяют этому требованию Следует иметь ввиду, что операции ввода/вывода в параллельных потоках завершаются в непредсказуемом порядке Следует внимательно прослеживать пересечение в параллельных потоках переменных типа private с глобальными переменными Следует тщательно отслеживать однозначность значений переменных в общей памяти. Для этого при необходимости следует пользоваться функцией FLUSH Следует помнить, что предложение NOWAIT удаляет неявные барьеры (barriers) Средства отладки OpenMP программ: Intel Thread Checker и Intel VTune Performance Analyzer (работает под Windows и Linux и позволяет вести отладку с Windows-компьютера на удаленных Linux кластерах) Механико-математический факультет Южно-Уральского государственного университета

Настройка программ в OpenMP: основные стратегии Если есть возможность, то сперва следует воспользоваться средством авто-распараллеливания программы Для нахождения наиболее трудоемких участков программы следует воспользоваться возможностью профилирования (profiling) Затем следует добавить в программу инструкции OpenMP для распараллеливания наиболее затратных участков программы В случае неэффективного распараллеливания конструкций do/for следует учесть Высокую стоимость инициализации параллельных потоков (порядка 1000 операций деления) Неэффективность распараллеливания небольших циклов Несбалансированность потоков Многочисленные ссылки к переменным в общей памяти Ограниченный объем кэша Высокую стоимость операции синхронизации Высокую стоимость доступа к удаленной общей памяти (на NUMA-компьютерах) При распараллеливании вложенных циклов следует сперва распараллеливать внешние петли При распараллеливании циклов следует иметь в виду, что петли циклов по объему вычислений могут быть зачастую треугольными и порождать несбалансированные параллельные потоки. Чтобы избежать несбалансированности при работе программы следует использовать инструкцию schedule Механико-математический факультет Южно-Уральского государственного университета

Настройка программ в OpenMP: пример распараллеливания Исходная программа Параллельная программа Механико-математический факультет Южно-Уральского государственного университета

Настройка программ в OpenMP: автоматическое распараллеливание Основные современные языки программирования имеют возможности автоматического распараллеливания программ в OpenMP: –openmp –parallel – par_report[0|1|2|3] – par_threshold[x], (0

Настройка программ в OpenMP: иерархия памяти Современные параллельные системы имеют следующую иерархию памяти Регистры Кэш 1-го уровня Кэш 2-го уровня Кэш 3-го уровня Локальную память Удаленную память (с доступом через interconnect) Время доступа к памяти существенно возрастает при движении по иерархии сверху вниз В связи с этим становиться актуальной задачи эффективности загрузки кэша и регистров, а также минимизация доступа к удаленной памяти Для более эффективной загрузки кэша следует принимать дополнительные меры по выравниванию строк (в C/C++) или столбцов (в FORTRAN) массивов Для более эффективного распараллеливания циклов следует по возможности обеспечить независимость петель вложенных циклов Механико-математический факультет Южно-Уральского государственного университета

Настройка программ в OpenMP: настройка кэша Для эффективного использования кэш памяти рекомендуется использовать многомерные массивы в одномерном виде Вложенные циклы следует модифицировать так, чтобы обеспечить последовательный быстрый доступ к элементам массива без скачков по индексам На NUMA (non-uniform memory access) платформах важно учитывать следующие особенности Где запущены потоки Какие данные загружены в локальную память Стоимость доступа к удаленной памяти Для NUMA платформ вышеперечисленные возможности сильно зависят от архитектуры систем OpenMP предоставляет следующие возможности по управлению потоками Запуск потока на определенном процессоре Размещение данных в определенном месте памяти Эти задачи решаются с помощью системных инструкций, которые могут быть различными на различных платформах и зависеть от загруженного системного программного обеспечения Механико-математический факультет Южно-Уральского государственного университета

Обзор Intel Cluster OpenMP Механико-математический факультет Южно-Уральского государственного университета

Intel Cluster OpenMP - простое средство, требующее незначительного изменения кода для расширения параллелелизма OpenMP на кластерные системы под ОС Linux, базирующиеся на 64-разрядной архитектуре Intel. Директива sharable определяет переменные, на которые ссылаются несколько нитей, и доступ к которым должен обрабатываться как раз механизмом DSM. Механизм DSM синхронизации переменных на разных узлах Механико-математический факультет Южно-Уральского государственного университета

Преимущества Cluster OpenMP Переносимость и гибкость упрощает и снижает стоимость разработки приложений: Упрощает распределение последовательного или OpenMP кода по узлам. Позволяет использовать один и тот же код приложений для последовательных, многоядерных и кластерных систем. Требует совсем незначительного изменения кода, что упрощает отладку. Позволяет слегка измененному коду OpenMP выполняться на большем числе процессоров без вложений в аппаратную составляющую SMP. Представляет собой альтернативу MPI, которая может быть быстрее освоена и применена. Механико-математический факультет Южно-Уральского государственного университета

Пример #include main() { #pragma omp parallel { #pragma omp critical printf(hello world\n); } icc -cluster-openmp hello.c –o hello./hello hello world Механико-математический факультет Южно-Уральского государственного университета

Механизм DSM Механико-математический факультет Южно-Уральского государственного университета

Пример #include static int x; #pragma intel omp sharable(x) int main() { x = 0; #pragma omp parallel { #pragma omp critical x++; } printf("%d should equal %d\n", omp_get_max_threads(), x); } Механико-математический факультет Южно-Уральского государственного университета