С. антоновпараллельноепрограммированиесиспользованиемтехнологииopenMP
Скачать 0.55 Mb.
|
А .С. АНТОНОВ ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМТЕХНОЛОГИИ 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 в программах на языке Фортран оформляются комментариями и начинаются с комбинации символов |