Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 02.10.2012 | Доступ: свободный | Студентов: 1753 / 198 | Длительность: 17:47:00
Специальности: Программист
Лекция 4:

Введение в технологии параллельного программирования (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. Контрольные вопросы

  1. Какие компьютерные платформы относятся к числу вычислительных систем с общей памятью?
  2. Какие подходы используются для разработки параллельных программ?
  3. В чем состоят основы технологии OpenMP?
  4. В чем состоит важность стандартизации средств разработки параллельных программ?
  5. В чем состоят основные преимущества технологии OpenMP?
  6. Что понимается под параллельной программой в рамках технологии OpenMP?
  7. Что понимается под понятием потока (thread)?
  8. Какие проблемы возникают при использовании общих данных в параллельно выполняемых потоках?
  9. Какой формат записи директив OpenMP?
  10. В чем состоит назначение директивы parallel?
  11. В чем состоят понятия фрагмента, области и секции параллельной программы?
  12. Какой минимальный набор директив OpenMP позволяет начать разработку параллельных программ?
  13. Как определить время выполнения OpenMP программы?
  14. Как осуществляется распараллеливание циклов в OpenMP? Какие условия должны выполняться, чтобы циклы могли быть распараллелены?
  15. Какие возможности имеются в OpenMP для управления распределением итераций циклов между потоками?
  16. Как определяется порядок выполнения итераций в распараллеливаемых циклах в OpenMP?
  17. Какие правила синхронизации вычислений в распараллеливаемых циклах в OpenMP?
  18. Как можно ограничить распараллеливание фрагментов программного кода с невысокой вычислительной сложностью?
  19. Как определяются общие и локальные переменные потоков?
  20. Что понимается под операцией редукции?
  21. Какие способы организации взаимоисключения могут быть использованы в OpenMP?
  22. Что понимается под атомарной (неделимой) операцией?
  23. Как определяется критическая секция?
  24. Какие операции имеются в OpenMP для переменных семафорного типа (замков)?
  25. В каких ситуациях следует применять барьерную синхронизацию?
  26. Как осуществляется в OpenMP распараллеливание по задачам (директива sections)?
  27. Как определяются однопотоковые участки параллельных фрагментов (директивы single и master)?
  28. Как осуществляется синхронизация состояния памяти (директива flush)?
  29. Как используются постоянные локальные переменные потоков (директивы threadprivate и copyin)?
  30. Какие средства имеются в OpenMP для управления количеством создаваемых потоков?
  31. Что понимается под динамическим режимом создания потоков?
  32. Как осуществляется управление вложенностью параллельных фрагментов?
  33. В чем состоят особенности разработки параллельных программ с использованием OpenMP на языке Fortran?
  34. Как обеспечивается единственность программного кода для последовательного и параллельного вариантов программы?
  35. Какие компиляторы обеспечивают поддержку технологии OpenMP?

Задачи и упражнения

  1. Разработайте программу для нахождения минимального (максимального) значения среди элементов вектора.
  2. Разработайте программу для вычисления скалярного произведения двух векторов.
  3. Разработайте программу для задачи вычисления определенного интеграла с использованием метода прямоугольников y=\int\limits_a^b f(x) dx $\approx$h\sum^{n-1}_{i=0}f_{i},f_{i}=f_{x_{i}},x_{i}=ih,h=(b-a)/N.
  4. Разработайте программу решения задачи поиска максимального значения среди минимальных элементов строк матрицы (такая задача имеет место для решения матричных игр) 
        y=\min_{1 \le i \le N}  \min_{1 \le j \le N}a_{ij}
  5. Разработайте программу для задачи 4 при использовании матриц специального типа (ленточных, треугольных и т. п.). Определите время выполнения программы и оцените получаемое ускорение. Выполните вы числительные эксперименты при разных правилах распределения итераций между потоками и сравните эффективность параллельных вычислений (выполнение таких экспериментов целесообразно выполнить для задач, в которых вычислительная трудоемкость итераций циклов различна).
  6. Реализуйте операцию редукции с использованием разных способов организации взаимоисключения (атомарные операции, критические секции, синхронизацию при помощи замков). Оцените эффективность разных подходов. Сравните полученные результаты с быстродействием операции редукции, выполняемой посредством параметра reduction директивы for.
  7. Разработайте программу для вычисления скалярного произведения для последовательного набора векторов (исходные данные можно подготовить заранее в отдельном файле). Ввод векторов и вычисление их произведения следует организовать как две раздельные задачи, для распараллеливания которых используйте директиву sections.
  8. Выполните вычислительные экспериментами с ранее разработанными программами при различном количестве потоков (меньше, равно или больше числа имеющихся вычислительных элементов). Определите время выполнения программ и оцените получаемое ускорение.
  9. Уточните, поддерживает ли используемый Вами компилятор вложенные параллельные фрагменты. При наличии такой поддержки разработайте программы с использованием и без использования вложенного параллелизма. Выполните вычислительные эксперименты и оцените эффективность разных подходов.
  10. Разработайте программу для задачи 4 с использованием распараллеливания циклов разного уровня вложенности. Выполните вычислительные эксперименты и сравните полученные результаты. Оцените величину накладных расходов на создание и завершение потоков.

Приложение: Справочные сведения об OpenMP

П1. Сводный перечень директив OpenMP
Таблица 4.2. Таблица П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.

Таблица 4.3. Таблица П3 Сводная таблица по использованию параметров в директивах 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 с кратким пояснением их назначения.

Таблица 4.4. Таблица П4 Сводный перечень функций 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 с кратким пояснением их назначения.

Таблица 4.5. Таблица П5 Сводный перечень переменных окружения 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.
Дмитрий Остапенко
Дмитрий Остапенко

поддерживаю выше заданые вопросы

 

Павел Каширин
Павел Каширин

Скачал архив и незнаю как ничать изучать материал. Видео не воспроизводится (скачено очень много кодеков, различных плееров -- никакого эффекта. Максимум видно часть изображения без звука). При старте ReplayMeeting и Start в браузерах google chrome, ie возникает script error с невнятным описанием. В firefox ситуация еще интереснее. Выводится: 

Meet Now: Кукаева Светлана Александровна. 

Meeting Start Time: 09.10.2012, 16:58:04
Meeting Stop Time: 09.10.2012, 18:45:18
Recording Duration:01:47:14

Downloading...

Your Web browser is not configured to play Windows Media audio/video files.

Make sure the features are enabled and available.