Россия, г. Саранск |
Параллельное программирование с использованием OpenMP
7.9. Краткий обзор раздела
Данный раздел посвящен рассмотрению методов параллельного программирования для вычислительных систем с общей памятью с использованием технологии OpenMP.
В самом начале раздела отмечается, что технология OpenMP является в настоящий момент времени одним из основных подходов для разработки параллельных программ для вычислительных систем с общей памятью (в т.ч. и для систем с активно развиваемыми в последнее время многоядерными процессорами ). В рамках данной технологии программист при разработке параллельной программы добавляет в программный код специальные директивы параллелизма для выделения в программе параллельных фрагментов, в которых последовательный исполняемый код может быть разделен на несколько раздельных командных потоков ( threads ). Далее эти потоки могут исполняться на разных процессорах (процессорных ядрах) вычислительной системы.
В подразделе 7.1 рассматривается ряд понятий и определений, являющихся основополагающими для стандарта OpenMP. Так, дается представление параллельной программы как набора последовательных ( однопотоковых ) и параллельных ( многопотоковых ) участков программного кода. Далее обсуждаются вопросы организации взаимодействия потоков с использованием общих данных и связанные с этим многие классические аспекты параллельного программирования - гонка потоков, взаимное исключение, критические секции, синхронизация. В подразделе приводится также структура и формат директив OpenMP.
В подразделе 7.2 проводится быстрое и простое введение в разработку параллельных программ с использованием OpenMP. Дается описание директивы parallel и приводится пример первой параллельной программы с использованием OpenMP. В подразделе обсуждаются важные для дальнейшего рассмотрения понятия фрагмента, области и секции параллельной программы.
В подразделе 7.3 рассматриваются вопросы распределения вычислительной нагрузки между потоками на примере распараллеливания циклов по данным. Дается описание директивы for и описываются способы управления распределением итераций цикла между потоками.
В подразделе 7.4 подробно обсуждаются вопросы управления данными для параллельно выполняемых потоков. Дается понятие общих и локальных переменных для потоков. Приводится описание важной и часто встречающейся при обработке общих данных операции редукции.
В подразделе 7.5 рассматриваются вопросы организации взаимоисключения при использовании общих переменных. Среди описываемых подходов - использование атомарных ( неделимых ) операций, определение критических секций, применение семафоров специального типа ( замков ).
В подразделе 7.6 излагаются вопросы распределения вычислительной нагрузки между потоками на основе распараллеливания задач. Дается описание директивы sections, приводятся примеры использования данной директивы.
В подразделе 7.7 рассматриваются расширенные возможности технологии OpenMP. Дается описание ряда новых директив ( master, single, barrier, flush, threadprivate, copyin ), обсуждаются возможности управления потоками (количество создаваемых потоков, динамический режим создания потоков, вложенность параллельных фрагментов).
В завершающем подразделе 7.8 даются дополнительные сведения о технологии OpenMP - рассматриваются правила разработки параллельных программ с использованием OpenMP на алгоритмическом языке Fortran, описывается возможность компиляции программы как обычного последовательного программного кода и приводится краткий перечень компиляторов, обеспечивающих поддержку OpenMP.
7.10. Обзор литературы
В наиболее полном виде информация по параллельному программированию для вычислительных систем с общей памятью с использованием OpenMP содержится в Chandra et al. (2000). Краткое описание OpenMP приводится в Воеводин В.В. и Воеводин Вл.В. (2002) и Немнюгин и Стесик (2002), полезная информация представлена также в Kumar et al. (1994), Quinn (2004).
Достаточно много информации о технологии OpenMP содержится в сети Интернет. Так, могут быть рекомендованы информационно-аналитический портал www.parallel.ru и, конечно же, ресурс www.openmp.org.
Для рассмотрения общих вопросов параллельного программирования для вычислительных систем с общей памятью может быть рекомендована работа Andrews (2000).
7.11. Контрольные вопросы
- Какие компьютерные платформы относятся к числу вычислительных систем с общей памятью?
- Какие подходы используются для разработки параллельных программ?
- В чем состоят основы технологии OpenMP?
- В чем состоит важность стандартизации средств разработки параллельных программ?
- В чем состоят основные преимущества технологии OpenMP?
- Что понимается под параллельной программой в рамках технологии OpenMP?
- Что понимается под понятием потока (thread)?
- Какие возникают проблемы при использовании общих данных в параллельно выполняемых потоках?
- Какой формат записи директив OpenMP?
- В чем состоит назначение директивы parallel?
- В чем состоит понятие фрагмента, области и секции параллельной программы?
- Какой минимальный набор директив OpenMP позволяет начать разработку параллельных программ?
- Как определить время выполнения OpenMP программы?
- Как осуществляется распараллеливание циклов в OpenMP? Какие условия должны выполняться, чтобы циклы могли быть распараллелены?
- Какие возможности имеются в OpenMP для управления распределением итераций циклов между потоками?
- Как определяется порядок выполнения итераций в распараллеливаемых циклах в OpenMP?
- Какие правила синхронизации вычислений в распараллеливаемых циклах в OpenMP?
- Как можно ограничить распараллеливание фрагментов программного кода с невысокой вычислительной сложностью?
- Как определяются общие и локальные переменные потоков?
- Что понимается под операцией редукции?
- Какие способы организации взаимоисключения могут быть использованы в OpenMP?
- Что понимается под атомарной (неделимой) операцией?
- Как определяется критическая секция?
- Какие операции имеются в OpenMP для переменных семафорного типа (замков)?
- В каких ситуациях следует применять барьерную синхронизацию?
- Как осуществляется в OpenMP распараллеливание по задачам (директива sections )?
- Как определяются однопотоковые участки параллельных фрагментов (директивы single и master )?
- Как осуществляется синхронизация состояния памяти (директива flush )?
- Как используются постоянные локальные переменные потоков (директивы threadprivate и copyin )?
- Какие средства имеются в OpenMP для управления количеством создаваемых потоков?
- Что понимается под динамическим режимом создания потоков?
- Как осуществляется управление вложенностью параллельных фрагментов?
- В чем состоят особенности разработки параллельных программ с использованием OpenMP на алгоритмическом языке Fortran?
- Как обеспечивается единственность программного кода для последовательного и параллельного вариантов программы?
- Какие компиляторы обеспечивают поддержку технологии OpenMP?
7.12. Задачи и упражнения
- Разработайте программу для нахождения минимального (максимального) значения среди элементов вектора.
- Разработайте программу для вычисления скалярного произведения двух векторов.
- Разработайте программу для задачи вычисления определенного интеграла с использованием метода прямоугольников
- .
(описание методов интегрирования дано, например, в Kahaner, Moler and Nash (1988)).
- Разработайте программу решения задачи поиска максимального значения среди минимальных элементов строк матрицы (такая задача имеет место для решения матричных игр)
,
- Разработайте программу для задачи 4 при использовании матриц специального типа (ленточных, треугольных и т.п.). Определите время выполнения программы и оцените получаемое ускорение. Выполните вычислительные эксперименты при разных правилах распределения итераций между потоками и сравните эффективность параллельных вычислений (выполнение таких экспериментов целесообразно выполнить для задач, в которых вычислительная трудоемкость итераций циклов является различной).
- Реализуйте операцию редукции с использованием разных способов организации взаимоисключения (атомарные операции, критические секции, синхронизацию при помощи замков). Оцените эффективность разных подходов. Сравните полученные результаты с быстродействием операции редукции, выполняемой посредством параметра reduction директивы for.
- Разработайте программу для вычисления скалярного произведения для последовательного набора векторов (исходные данные можно подготовить заранее в отдельном файле). Ввод векторов и вычисление их произведения следует организовать как две раздельные задачи, для распараллеливания которых используйте директиву sections.
- Выполните вычислительные экспериментами с ранее разработанными программами при различном количестве потоков (меньше, равно или больше числа имеющихся вычислительных элементов). Определите время выполнения программ и оцените получаемое ускорение.
- Уточните, поддерживает ли используемый Вами компилятор вложенные параллельные фрагменты. При наличии такой поддержки разработайте программы с использованием и без использования вложенного параллелизма. Выполните вычислительные эксперименты и оцените эффективность разных подходов.
- Разработке программу для задачи 4 с использованием распараллеливания циклов разного уровня вложенности. Выполните вычислительные эксперименты и сравните полученные результаты. Оцените величину накладных расходов на создание и завершение потоков.
Приложение: Справочные сведения об OpenMP
П1. Сводный перечень директив OpenMP
Для справки приведем перечень директив OpenMP с кратким пояснением их назначения.
П2. Сводный перечень параметров директив OpenMP
Для справки приведем перечень параметров директив OpenMP с кратким пояснением их назначения.
Приведем для наглядности сводную таблицу использования параметров в директивах OpenMP.
П3. Сводный перечень функций OpenMP
Для справки приведем перечень функций библиотеки OpenMP с кратким пояснением их назначения.
П4. Сводный перечень переменных окружения OpenMP
Для справки приведем перечень переменных окружения OpenMP с кратким пояснением их назначения.