Главная страница

С. антоновпараллельноепрограммированиесиспользованиемтехнологииopenMP


Скачать 0.55 Mb.
НазваниеС. антоновпараллельноепрограммированиесиспользованиемтехнологииopenMP
Дата03.04.2022
Размер0.55 Mb.
Формат файлаpdf
Имя файлаOpenMP.pdf
ТипУчебное пособие
#438994
страница1 из 8
  1   2   3   4   5   6   7   8

А
.С. АНТОНОВ
ПАРАЛЛЕЛЬНОЕ
ПРОГРАММИРОВАНИЕ
С
ИСПОЛЬЗОВАНИЕМТЕХНОЛОГИИ
OpenMP
ИЗДАТЕЛЬСТВО МОСКОВСКОГО УНИВЕРСИТЕТА
2009

Московский государственный университет имени М.В. Ломоносова
Научно-исследовательский вычислительный центр
А.С. Антонов
Параллельное программирование с использованием технологии
OpenMP
ИЗДАТЕЛЬСТВО МОСКОВСКОГО УНИВЕРСИТЕТА
2009

УДК 681.3.06
ББК 22.20
А72
Рецензенты: зам. директора НИВЦ МГУ, член-корреспондент РАН Вл.В. Воеводин, зав. кафедрой механико-математического факультета МГУ, член- корреспондент РАН Ю.В. Нестеренко.
А72
АнтоновА.С.
Параллельное программирование с использованием технологии
OpenMP: Учебное пособие. – М.: Изд-во МГУ, 2009. – 77 с.
ISBN 978-5-211-05702-9
Учебное пособие предназначено для освоения практического курса парал- лельного программирования с использованием технологии OpenMP. В настоящее время технология OpenMP является основным средством программирования для компьютеров с общей памятью. Книга включает в себя описание большинства ос- новных директив, функций и переменных окружения стандарта OpenMP 3.0 с при- мерами их применения, а также практические сведения, которые могут потребо- ваться при написании реальных программ. Некоторые детали описания стандарта опускаются для простоты изложения и восприятия материала. Описание ведётся с использованием вызовов процедур OpenMP из программ на языках Си и Фортран.
Приводятся примеры небольших законченных параллельных программ, тексты ко- торых доступны в сети
Интернет на странице http://parallel.ru/tech/tech_dev/OpenMP/examples/. В конце разделов приводятся кон- трольные вопросы и задания, которые можно использовать в процессе обучения.
Для студентов, аспирантов и научных сотрудников, чья деятельность связа- на с параллельными вычислениями.
УДК 681.3.06
ББК 22.20
ISBN 978-5-211-05702-9
© Антонов А.С., 2009
© НИВЦ МГУ, 2009

3
Содержание
Алфавитный указатель по директивам, функциям, опциям и переменным окружения OpenMP................................................................................................. 4
Директивы............................................................................................................. 4
Опции .................................................................................................................... 4
Функции................................................................................................................ 4
Переменные окружения ...................................................................................... 5
Введение................................................................................................................... 6
Основные понятия................................................................................................... 8
Компиляция программы...................................................................................... 8
Модель параллельной программы ..................................................................... 9
Директивы и функции ....................................................................................... 10
Выполнение программы.................................................................................... 11
Замер времени .................................................................................................... 11
Задания................................................................................................................ 12
Параллельные и последовательные области ...................................................... 14
Директива parallel
....................................................................................... 14
Сокращённая запись .......................................................................................... 17
Переменные среды и вспомогательные функции .......................................... 17
Директива single
............................................................................................ 24
Директива master
............................................................................................ 27
Задания................................................................................................................ 28
Модель данных...................................................................................................... 29
Задания................................................................................................................ 35
Распределение работы .......................................................................................... 36
Низкоуровневое распараллеливание ............................................................... 36
Параллельные циклы......................................................................................... 37
Параллельные секции........................................................................................ 47
Директива workshare
..................................................................................... 52
Задачи (
tasks
) .................................................................................................. 53
Задания................................................................................................................ 54
Синхронизация ...................................................................................................... 55
Барьер.................................................................................................................. 55
Директива ordered
......................................................................................... 56
Критические секции .......................................................................................... 57
Директива atomic
............................................................................................ 59
Замки67 ................................................................................................................... 61
Директива flush
.............................................................................................. 66
Задания................................................................................................................ 66
Дополнительные переменные среды и функции ............................................... 68
Использование OpenMP ....................................................................................... 71
Примеры программ ............................................................................................... 73
Литература ............................................................................................................. 76

4
Алфавитный указатель по директивам
,
функциям
,
опци
-
ям и
переменным окружения
OpenMP
Директивы
atomic
59, 60
barrier
55
critical
57, 58
do
38, 41, 43, 44
end critical
57, 59
end do
38, 41, 43, 44
end master
27, 28
end parallel
14, 15, 16
end sections
48, 49
end single
24, 26
flush
66
for
38, 40, 42, 44
master
27
ordered
56
parallel
14, 15, 16
section
48, 49
sections
47, 48, 49
single
24, 25, 26
task
53
taskwait
54
threadprivate 33
Опции
collapse
38
copyin
15, 35
copyprivate
24, 26
default
14, 53
firstprivate
15, 24, 32, 38,
48, 53
if
14, 53
lastprivate
38, 48, 50
nowait
25, 39, 48, 52
num_threads
14, 17
ordered
39, 56
private
14, 24, 29, 38,
48, 53
reduction
15, 16, 38, 48
schedule
38, 41, 42, 44
shared
15, 29, 30, 53
untied
53
Функции
omp_destroy_lock
62,
63, 64
omp_destroy_nest_lock
62
omp_get_active_level
69
omp_get_ancestor_thread_num
68
omp_get_dynamic
19
omp_get_level
68
omp_get_max_active_levels
68
omp_get_max_threads
20
omp_get_nested
23
omp_get_num_procs
20
omp_get_num_threads
36
omp_get_schedule
47
omp_get_team_size
69
omp_get_thread_limit
70
omp_get_thread_num
36
omp_get_wtick
12
omp_get_wtime
11
omp_in_parallel
23
omp_init_lock
61,
63, 64
omp_init_nest_lock
61
omp_set_dynamic
19
omp_set_lock
62,
63
omp_set_max_active_levels
68
omp_set_nest_lock
62
omp_set_nested
21
omp_set_num_threads
17
omp_set_schedule
46
omp_test_lock
64
omp_test_nest_lock
64
omp_unset_lock
62,
63, 64
omp_unset_nest_lock
62

5
Переменные окружения
OMP_DYNAMIC
18
OMP_MAX_ACTIVE_LEVELS
68
OMP_NESTED
21
OMP_NUM_THREADS
11
OMP_SCHEDULE
42
OMP_STACKSIZE
69
OMP_THREAD_LIMIT
70
OMP_WAIT_POLICY
70

6
Введение
Одним из наиболее популярных средств программирования для компьютеров с общей памятью, базирующихся на традиционных языках программирова- ния и использовании специальных комментариев, в настоящее время являет- ся технология OpenMP. За основу берётся последовательная программа, а для создания её параллельной версии пользователю предоставляется набор ди- ректив, функций и переменных окружения. Предполагается, что создаваемая параллельная программа будет переносимой между различными компьюте- рами с разделяемой памятью, поддерживающими OpenMP API.
Технология OpenMP нацелена на то, чтобы пользователь имел один вариант программы для параллельного и последовательного выполнения. Однако возможно создавать программы, которые работают корректно только в па- раллельном режиме или дают в последовательном режиме другой результат.
Более того, из-за накопления ошибок округления результат вычислений с ис- пользованием различного количества нитей может в некоторых случаях раз- личаться.
Разработкой стандарта занимается некоммерческая организация OpenMP
ARB (Architecture Review Board) [1], в которую вошли представители круп- нейших компаний – разработчиков SMP-архитектур и программного обеспе- чения. OpenMP поддерживает работу с языками Фортран и Си/Cи++. Первая спецификация для языка Фортран появилась в октябре 1997 года, а специфи- кация для языка Си/Cи++ – в октябре 1998 года. На данный момент послед- няя официальная спецификация стандарта – OpenMP 3.0 [3] (принята в мае
2008 года).
Интерфейс OpenMP задуман как стандарт для программирования на масшта- бируемых SMP-системах (SSMP, ccNUMA и других) в моделиобщейпамяти
(shared memory model). В стандарт OpenMP входят спецификации набора ди- ректив компилятора, вспомогательных функций и переменных среды.
OpenMP реализует параллельные вычисления с помощью многопоточности, в которой «главный» (master) поток создает набор «подчиненных» (slave) по- токов, и задача распределяется между ними. Предполагается, что потоки вы- полняются параллельно на машине с несколькими процессорами, причём ко- личество процессоров не обязательно должно быть больше или равно количеству потоков.
POSIX-интерфейс для организации нитей (Pthreads) поддерживается практи- чески на всех UNIX-системах, однако по многим причинам не подходит для практического параллельного программирования: в нём нет поддержки языка
Фортран, слишком низкий уровень программирования, нет поддержки па-

7 раллелизма по данным, а сам механизм нитей изначально разрабатывался не для целей организации параллелизма. OpenMP можно рассматривать как вы- сокоуровневую надстройку над Pthreads (или аналогичными библиотеками нитей); в OpenMP используется терминология и модель программирования, близкая к Pthreads, например, динамически порождаемые нити, общие и раз- деляемые данные, механизм «замков» для синхронизации.
Согласно терминологии POSIX threads, любой UNIX-процесс состоит из не- скольких нитейуправления, которые имеют общее адресное пространство, но разные потоки команд и раздельные стеки. В простейшем случае процесс со- стоит из одной нити. Нити иногда называют также потоками, легковесными процессами, LWP (light-weight processes).
Важным достоинством технологии OpenMP является возможность реализа- ции так называемого инкрементальногопрограммирования, когда програм- мист постепенно находит участки в программе, содержащие ресурс паралле- лизма, с помощью предоставляемых механизмов делает их параллельными, а затем переходит к анализу следующих участков. Таким образом, в программе нераспараллеленная часть постепенно становится всё меньше. Такой подход значительно облегчает процесс адаптации последовательных программ к па- раллельным компьютерам, а также отладку и оптимизацию.
Описание функциональности OpenMP в данном пособии снабжено большим количеством примеров. Все примеры протестированы сотрудниками лабора- тории
Параллельных информационных технологий
Научно- исследовательского вычислительного центра МГУ имени М.В. Ломоносова на суперкомпьютере СКИФ МГУ «ЧЕБЫШЁВ» [9] с использованием компи- ляторов Intel Fortran/C++ 11.0.
Дополнительную информацию об интерфейсе OpenMP можно найти на тема- тической странице Информационно-аналитического центра по параллельным вычислениям в сети Интернет Parallel.ru [4].

8
Основные понятия
Компиляция программы
Для использования механизмов OpenMP нужно скомпилировать программу компилятором, поддерживающим OpenMP, с указанием соответствующего ключа (например, в icc/ifort используется ключ компилятора
–openmp
, в gcc
/gfortran
–fopenmp
, Sun Studio
-xopenmp
, в Visual C++
-
/openmp
, в PGI
-mp
).
Компилятор интерпретирует директивы OpenMP и создаёт параллельный код. При использовании компиляторов, не поддерживающих OpenMP, дирек- тивы OpenMP игнорируются без дополнительных сообщений.
Компилятор с поддержкой OpenMP определяет макрос
_OPENMP
, который может использоваться для условной компиляции отдельных блоков, харак- терных для параллельной версии программы. Этот макрос определён в фор- мате
yyyymm
, где
yyyy
и
mm
– цифры года и месяца, когда был принят под- держиваемый стандарт OpenMP. Например, компилятор, поддерживающий стандарт OpenMP 3.0, определяет
_OPENMP
в
200805
Для проверки того, что компилятор поддерживает какую-либо версию
OpenMP, достаточно написать директивы условной компиляции
#ifdef
или
#ifndef
. Простейшие примеры условной компиляции в программах на язы- ках Си и Фортран приведены в примере 1.
#include
int main(){
#ifdef _OPENMP
printf("OpenMP is supported!\n");
#endif
}
Пример 1a. УсловнаякомпиляциянаязыкеСи.
program example1b
#ifdef _OPENMP
print *, "OpenMP is supported!"
#endif
end
Пример 1b. УсловнаякомпиляциянаязыкеФортран.
Для условной компиляции программ на Фортране строки могут также начи- наться с пары символов
!$
,
C$
или
*$
. В этом случае компилятор, поддержи- вающий OpenMP, заменит пару этих символов на два пробела, таким образом
«раскомментировав» их. Пример 1с показывает использование такого вари- анта условной компиляции.

9
program example1c
!$ print *, "OpenMP is supported!"
end
Пример 1c. УсловнаякомпиляциянаязыкеФортран.
Модель параллельной программы
Распараллеливание в OpenMP выполняется явно при помощи вставки в текст программы специальных директив, а также вызова вспомогательных функ- ций. При использовании OpenMP предполагается SPMD-модель (Single Pro-
gram Multiple Data) параллельного программирования, в рамках которой для всех параллельных нитей используется один и тот же код.
Программа начинается с последовательнойобласти – сначала работает один процесс (нить), при входе в параллельнуюобласть порождается ещё некото- рое число процессов, между которыми в дальнейшем распределяются части кода. По завершении параллельной области все нити, кроме одной (нити- мастера), завершаются, и начинается последовательная область. В программе может быть любое количество параллельных и последовательных областей.
Кроме того, параллельные области могут быть также вложенными друг в друга. В отличие от полноценных процессов, порождение нитей является от- носительно быстрой операцией, поэтому частые порождения и завершения нитей не так сильно влияют на время выполнения программы.
Для написания эффективной параллельной программы необходимо, чтобы все нити, участвующие в обработке программы, были равномернозагружены полезной работой. Это достигается тщательной балансировкой загрузки, для чего предназначены различные механизмы OpenMP.
Существенным моментом является также необходимость синхронизации доступакобщимданным. Само наличие данных, общих для нескольких ни- тей, приводит к конфликтам при одновременном несогласованном доступе.
Поэтому значительная часть функциональности OpenMP предназначена для осуществления различного рода синхронизаций работающих нитей.
OpenMP не выполняет синхронизацию доступа различных нитей к одним и тем же файлам. Если это необходимо для корректности программы, пользо- ватель должен явно использовать директивы синхронизации или соответст- вующие библиотечные функции. При доступе каждой нити к своему файлу никакая синхронизация не требуется.

10
Директивы и
функции
Значительная часть функциональности OpenMP реализуется при помощи ди-
рективкомпилятору. Они должны быть явно вставлены пользователем, что позволит выполнять программу в параллельном режиме. Директивы OpenMP в программах на языке Фортран оформляются комментариями и начинаются с комбинации символов
  1   2   3   4   5   6   7   8


написать администратору сайта