поддерживаю выше заданые вопросы
|
Введение в технологии параллельного программирования (OpenMP)
4.9. Краткий обзор главы
Данная глава посвящена рассмотрению методов параллельного программирования для вычислительных систем с общей памятью с использованием технологии OpenMP.
В самом начале главы отмечается, что технология OpenMP является в настоящее время одним из основных подходов для разработки параллельных программ для вычислительных систем с общей памятью (в т. ч. и для систем с активно развиваемыми в последнее время многоядерными процессорами). В рамках данной технологии программист при разработке параллельной программы добавляет в программный код специальные директивы параллелизма для выделения в программе параллельных фрагментов, в которых последовательный исполняемый код может быть разделен на несколько раздельных командных потоков (threads). Далее эти потоки могут исполняться на разных процессорах (процессорных ядрах) вычислительной системы.
В разд. 5.1 рассмотрен ряд понятий и определений, являющихся основополагающими для стандарта OpenMP. Так, дается представление параллельной программы как набора последовательных (однопотоковых) и параллельных (многопотоковых) участков программного кода. Далее обсуждаются вопросы организации взаимодействия потоков с использованием общих данных и связанные с этим многие классические аспекты параллельного программирования – гонка потоков, взаимное исключение, критические секции, синхронизация. Приводится также структура и формат директив OpenMP.
В разд. 5.2 проведено быстрое и простое введение в разработку параллельных программ с использованием OpenMP. Дается описание директивы parallel и приводится пример первой параллельной программы с использованием OpenMP. В разделе обсуждаются важные для дальнейшего рассмотрения понятия фрагмента, области и секции параллельной программы.
В разд. 5.3 рассматриваются вопросы распределения вычислительной нагрузки между потоками на примере распараллеливания циклов по данным. Дается описание директивы for и описываются способы управления распределением итераций цикла между потоками.
В разд. 5.4 подробно обсуждаются вопросы управления данными для параллельно выполняемых потоков. Дается понятие общих и локальных переменных для потоков. Приведено описание важной и часто встречающейся при обработке общих данных операции редукции.
В разд. 5.5 рассмотрены вопросы организации взаимоисключения при использовании общих переменных. Среди описываемых подходов – использование атомарных (неделимых) операций, определение критических секций, применение семафоров специального типа (замков).
В разд. 5.6 изложены вопросы распределения вычислительной нагрузки между потоками на основе распараллеливания задач. Дается описание директивы sections, приведены примеры использования данной директивы.
В разд. 5.7 рассматриваются расширенные возможности технологии OpenMP. Дано описание ряда новых директив (master, single, barrier, flush, threadprivate, copyin), обсуждаются возможности управления потоками (количество создаваемых потоков, динамический режим создания потоков, вложенность параллельных фрагментов).
В разд. 5.8 даны дополнительные сведения о технологии OpenMP – рассматриваются правила разработки параллельных программ с использованием OpenMP на алгоритмическом языке Fortran, описывается возможность компиляции программы как обычного последовательного программного кода и приводится краткий перечень компиляторов, обеспечивающих поддержку OpenMP.
4.10. Обзор литературы
В наиболее полном виде информация по параллельному программированию для вычислительных систем с общей памятью с использованием OpenMP содержится в [48]. Краткое описание OpenMP приводится в [8, 21], полезная информация представлена также в [1,72,85].
Достаточно много информации о технологии OpenMP содержится в сети Интернет. Так, можно рекомендовать информационно-аналитический портал www.parallel.ru и, конечно же, ресурс www.openmp.org.
Дополнительная информация по разработке многопоточных программ содержится в [7] (для ОС Windows) и [46] (стандарт POSIX Threads).
Для рассмотрения общих вопросов параллельного программирования для вычислительных систем с общей памятью можно рекомендовать работу [39].
4.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?
Задачи и упражнения
- Разработайте программу для нахождения минимального (максимального) значения среди элементов вектора.
- Разработайте программу для вычисления скалярного произведения двух векторов.
- Разработайте программу для задачи вычисления определенного интеграла с использованием метода прямоугольников
- Разработайте программу решения задачи поиска максимального значения среди минимальных элементов строк матрицы (такая задача имеет место для решения матричных игр)
- Разработайте программу для задачи 4 при использовании матриц специального типа (ленточных, треугольных и т. п.). Определите время выполнения программы и оцените получаемое ускорение. Выполните вы числительные эксперименты при разных правилах распределения итераций между потоками и сравните эффективность параллельных вычислений (выполнение таких экспериментов целесообразно выполнить для задач, в которых вычислительная трудоемкость итераций циклов различна).
- Реализуйте операцию редукции с использованием разных способов организации взаимоисключения (атомарные операции, критические секции, синхронизацию при помощи замков). Оцените эффективность разных подходов. Сравните полученные результаты с быстродействием операции редукции, выполняемой посредством параметра reduction директивы for.
- Разработайте программу для вычисления скалярного произведения для последовательного набора векторов (исходные данные можно подготовить заранее в отдельном файле). Ввод векторов и вычисление их произведения следует организовать как две раздельные задачи, для распараллеливания которых используйте директиву sections.
- Выполните вычислительные экспериментами с ранее разработанными программами при различном количестве потоков (меньше, равно или больше числа имеющихся вычислительных элементов). Определите время выполнения программ и оцените получаемое ускорение.
- Уточните, поддерживает ли используемый Вами компилятор вложенные параллельные фрагменты. При наличии такой поддержки разработайте программы с использованием и без использования вложенного параллелизма. Выполните вычислительные эксперименты и оцените эффективность разных подходов.
- Разработайте программу для задачи 4 с использованием распараллеливания циклов разного уровня вложенности. Выполните вычислительные эксперименты и сравните полученные результаты. Оцените величину накладных расходов на создание и завершение потоков.
Приложение: Справочные сведения об OpenMP
П1. Сводный перечень директив OpenMP
Директива | Описание |
---|---|
private (list) | Параметр для создания локальных копий для перечисленных в списке переменных для каждого имеющегося потока (п. 5.4.1). Исходные значения копий не определены. Директивы: parallel, for, sections, single |
firstprivate (list) | Тоже что и параметр private и дополнительно инициализация создаваемых копий значениями, которые имели перечисленные в списке переменные перед началом параллельного фрагмента (п. 5.4.1). Директивы: parallel, for, sections, single |
lastprivate (list) | Тоже что и параметр private и дополнительно запоминание значений локальных переменных после завершения параллельного фрагмента (п. 5.4.1). Директивы: for, sections |
shared (list) | Параметр для определения общих переменных для всех имеющихся потоков (п. 5.4.1). Директивы: parallel |
default (shared | none) | Параметр для установки правила по умолчанию на использование переменных в потоках (п. 5.4.1). Директивы: parallel |
reduction (operator: list) | Параметр для задания операции редукции (п. 5.4.2). Директивы: parallel, for, sections |
nowait | Параметр для отмены синхронизации при завершении директивы. Директивы: for, sections, single |
if (expression) | Параметр для задания условия, только при выполнении которого осуществляется создание параллельного фрагмента (п. 5.3.4). Директивы: parallel |
ordered | Параметр для задания порядка вычислений в распараллеливаемом цикле (п. 5.3.2). Директивы: for |
schedule (type [, chunk]) | Параметр для управления распределением итераций распараллеливаемого цикла между потоками (п. 5.3.1). Директивы: for |
copyin (list) | Параметр для инициализации постоянных переменных потоков (п. 5.7.4). Директивы: parallel |
copyprivate (list) | Копирование локальных переменных потоков после выполнения блока директивы single (п. 5.7.1). Директивы: single |
num_treads | Параметр для задания количества создаваемых потоков в параллельной области (п. 5.7.5). Директивы: parallel |
Приведем для наглядности сводную таблицу использования параметров в директивах OpenMP.
Параметр | Шапка таблицы | |||||
---|---|---|---|---|---|---|
parallel | for | sections | single | parallel for | parallel sections | |
if | x | x | x | |||
private | x | x | x | x | x | x |
shared | x | x | x | x | ||
default | x | x | x | |||
firstprivate | x | x | x | x | x | x |
lastprivate | x | x | x | x | ||
reduction | x | x | x | x | x | |
copyin | x | x | x | |||
schedule | x | x | ||||
ordered | x | x | ||||
nowait | x | x | x | |||
num_threads | x | x | ||||
copypri-vate | x |
П3. Сводный перечень функций OpenMP
Для справки приведем перечень функций библиотеки OpenMP с кратким пояснением их назначения.
Функция | Описание |
---|---|
void omp_set_num_threads (int num_threads) | Установить количество создаваемых потоков (п. 5.7.5) |
int omp_get_max_threads (void) | Получение максимально-возможного количества потоков (п. 5.7.5) |
int omp_get_num_threads (void) | Получение количества потоков в параллельной области программы (п. 5.7.5) |
int omp_get_thread_num (void) | Получение номера потока (п. 5.7.5) |
int omp_get_num_procs (void) | Получение числа вычислительны элементов (процессоров или ядер), доступных приложению (п. 5.7.5) |
void omp_set_dynamic (int dynamic) | Установить режим динамического создания потоков (п. 5.7.6) |
int omp_get_dynamic (void) | Получение состояние динамического режима (п. 5.7.6) |
void omp_set_nested (int nested) | Установить режим поддержки вложенных параллельных фрагментов (п. 5.7.7) |
int omp_get_nested (void) | Получения состояние режима поддержки вложенных параллельных фрагментов (п. 5.7.7) |
void omp_init_lock(omp_lock_t *lock) void omp_init_nest_lock(omp_nest_lock_t *lock) |
Инициализировать замок (п. 5.5.3) |
void omp_set_lock (omp_lock_t &lock) void omp_set_nest_lock (omp_nest_lock_t &lock) |
Установить замок (п. 5.5.3) |
void omp_unset_lock (omp_lock_t &lock) void omp_unset_nest_lock (omp_nest_lock_t &lock) |
Освободить замок (п. 5.5.3) |
int omp_test_lock (omp_lock_t &lock) int omp_test_nest_lock (omp_nest_lock_t &lock) |
Установить замок без блокировки (п. 5.5.3) |
void omp_destroy_lock(omp_lock_t &lock) void omp_destroy_nest_lock(omp_nest_lock_t &lock) |
Перевод замка в неинициализированное состояние (п. 5.5.3) |
double omp_get_wtime (void) | Получение времени текущего момента выполнения программы (п. 5.2.5) |
double omp_get_wtick (void) | Получение времени в секундах между двумя последовательными показателями времени аппаратного таймера (п. 5.2.5) |
int omp_in_parallel (void) | Проверка нахождения программы в параллельном фрагменте |
П4. Сводный перечень переменных окружения OpenMP
Для справки приведем перечень переменных окружения OpenMP с кратким пояснением их назначения.
Переменная | Описание |
---|---|
OMP_SHEDULE | Переменная для задания способа управления распределением итераций распараллеливаемого цикла между потоками (п. 5.3.1). Значение по умолчанию: static |
OMP_NUM_THREADS | Переменная для задания количество потоков в параллельном фрагменте (п. 5.7.5). Значение по умолчанию: количество вычислительных элементов (процессоров/ядер) в вычислительной системе. |
OMP_DYNAMIC | Переменная для задания динамического режима создания потоков (п. 5.7.6). Значение по умолчанию: false. |
OMP_NESTED | Переменная для задания режима вложенности параллельных фрагментов (п. 5.7.7). Значение по умолчанию: false. |