Параллельное программирование с использованием OpenMP
Покупка
Тематика:
Программирование и алгоритмизация
Издательство:
ИНТУИТ
Автор:
Левин Михаил Петрович
Год издания: 2016
Кол-во страниц: 97
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-94774-857-4
Артикул: 108604.05.99
В курсе изложены сведения о параллельном программировании с использованием OpenMP для современных параллельных высокопроизводительных вычислительных систем с общей памятью.
Курс может быть использован в процессе подготовки и переподготовки специалистов в области информационных технологий и программирования, а также в процессе обучения студентов и аспирантов высших учебных заведений по аналогичным направлениям.
Тематика:
ББК:
УДК:
- 004: Информационные технологии. Вычислительная техника...
- 681: Точная механика. Автоматика. Приборостроение
ОКСО:
- ВО - Бакалавриат
- 02.03.01: Математика и компьютерные науки
- 02.03.02: Фундаментальная информатика и информационные технологии
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- ВО - Магистратура
- 02.04.01: Математика и компьютерные науки
- 02.04.02: Фундаментальная информатика и информационные технологии
- 09.04.01: Информатика и вычислительная техника
- 09.04.02: Информационные системы и технологии
- 09.04.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Параллельное программирование с использованием OpenMP 2-е издание, исправленное Левин М.П. Национальный Открытый Университет “ИНТУИТ” 2016 2
УДК [004.272:004.42](07) ББК 15 Л36 Параллельное программирование с использованием OpenMP / Левин М.П. - M.: Национальный Открытый Университет “ИНТУИТ”, 2016 (Основы информационных технологий) ISBN 978-5-94774-857-4 В курсе изложены сведения о параллельном программировании с использованием OpenMP для современных параллельных высокопроизводительных вычислительных систем с общей памятью. Курс может быть использован в процессе подготовки и переподготовки специалистов в области информационных технологий и программирования, а также в процессе обучения студентов и аспирантов высших учебных заведений по аналогичным направлениям. (c) ООО “ИНТУИТ.РУ”, 2008-2016 (c) Левин М.П., 2008-2016 3
Введение В настоящей лекции будут кратко рассмотрены основные типы современных параллельных вычислительных систем и средства параллельного программирования для них. Классификация параллельных архитектур Подробный анализ и обзор современных архитектур параллельных вычислительных систем можно найти в книгах [1.1-1.2]. В этой лекции рассматриваются лишь те особенности архитектур, которые необходимо учитывать при создании параллельных программ. Отметим, что эти особенности в значительной мере определяют инструментарий параллельного программирования. Под инструментарием параллельного программирования понимается набор алгоритмических языков (в том числе и расширения стандартных алгоритмических языков), использующихся для написания параллельных программ, а также специализированные библиотеки функций, адаптированные к архитектуре конкретной параллельной вычислительной системы. Кроме того, к инструментарию параллельного программирования относятся средства отладки и оптимизации быстродействия параллельных программ, а также средства визуализации и представления результатов параллельных вычислений. В настоящее время различные производители системного программного обеспечения предлагают множество разнообразных инструментов, которые могут быть использованы в процессе создания параллельных программ. Поэтому для получения максимального эффекта необходимо хорошо ориентироваться при выборе конкретных инструментов параллельного программирования среди множества существующих. В настоящее время существуют различные методы классификации архитектур параллельных вычислительных систем. Подробно различные методы классификации архитектур параллельных вычислительных систем изложены в [1.3]. Одна из возможных классификаций архитектур параллельных вычислительных систем состоит в разделении параллельных вычислительных систем по типу памяти (классификация Джонсона). В этом случае в качестве одного из классов можно выделить параллельные вычислительные системы с распределенной памятью (distributed memory) или массивно-параллельные системы (MPP). Обычно такие системы состоят из набора вычислительных узлов - каждый из них содержит один или несколько процессоров, локальную память, прямой доступ к которой невозможен из других узлов, коммуникационный процессор или сетевой адаптер, а также может содержать жесткие диски и устройства ввода/вывода. В массивнопараллельных системах могут быть и специализированные управляющие узлы и узлы ввода/вывода. Узлы в массивно-параллельных системах связаны между собой через коммуникационную среду (высокоскоростная сеть, коммутаторы либо их различные комбинации). В качестве второго класса можно выделить архитектуры параллельных вычислительных систем с общей памятью (shared memory) или симметричные мультипроцессорные системы (SMP). Такие системы, как правило, состоят из 4
нескольких однородных процессоров и массива общей памяти. Каждый из процессоров имеет прямой доступ к любой ячейке памяти, причем скорость доступа к памяти для всех процессоров одинакова. Обычно процессоры подключаются к памяти с помощью общей шины либо с помощью специальных коммутаторов. Однако кроме двух вышеперечисленных классов существуют и некоторые их гибриды. В качестве первого гибридного класса назовем системы с неоднородным доступом к памяти (Non-Uniform Memory Access) - так называемые NUMA-системы. Такие параллельные вычислительные системы обычно состоят из однородных модулей, каждый из которых содержит один или несколько процессоров и локальный для каждого модуля блок памяти. Объединение модулей между собой осуществляется при помощи специальных высокоскоростных коммутаторов (Numalink). В таких вычислительных системах адресное пространство является общим. Прямой доступ к удаленной памяти, т. е. к локальной памяти других модулей, поддерживается аппаратно. Однако время доступа процессора одного модуля к памяти другого модуля заметно больше времени доступа к локальной памяти исходного модуля. Это время может существенно различаться и зависит главным образом от топологии соединения модулей. Очевидно, что этот третий класс является некоторой комбинацией первого и второго классов. В качестве второго гибридного класса отметим различные комбинации соединения систем трех вышеперечисленных типов. Такие соединения могут иметь весьма сложный иерархический характер. Возможно также соединение кластеров или их отдельных частей через Интернет. Такие вычислительные системы развиваются в рамках международного проекта GRID (см., например, [1.4-1.5]). Современные направления развития параллельных вычислительных систем В настоящее время началось широкое использование двуядерных микропроцессоров Pentium D, Xeon, Itanium 2, Opteron и IBM POWER5. В ближайшей перспективе ожидается появление процессоров и с большим количеством ядер. Представители компании Intel уже объявили о предстоящем начале выпуска в ближайшее время 6ядерных процессоров Clovertown. К 2009 году компания Intel предполагает начать производство 256- ядерных процессоров. Фирма IBM в 2007 году начала выпуск процессора Cell с 9 ядрами, каждое из которых выполняет одновременно по два потока. Кластер, построенный на этих процессорах, был продемонстрирован на выставке CeBIT в марте 2006 года в Ганновере. Отметим, что все ядра - как некоторых уже выпускаемых процессоров, например Pentium D и IBM POWER5, так и перспективных процессоров Cell - могут выполнять одновременно по два параллельных потока. Таким образом, даже персональный компьютер с одним процессором Pentium D позволяет выполнять одновременно до 4 процессов. То есть обычный персональный компьютер с одним из таких процессоров является параллельной вычислительной системой с общей памятью (SMP-системой). Поэтому освоение эффективного инструментария для программирования на таких 5
системах является очень актуальной и важной задачей подготовки и переподготовки специалистов в области программирования. В связи с развитием параллельных возможностей современных микропроцессоров в настоящее время можно выделить три основных направления в развитии параллельных вычислительных систем. Во-первых, это многоядерность (Multicore), когда несколько ядер находятся в корпусе одного процессора. Во-вторых, это технологии с явным параллелизмом команд (EPIC - Explicitly Parallel Instruction Computing). Архитектура всех современных 64-разрядных процессоров Intel построена на использовании технологии EPIC. Параллелизм сегодня стал главным ресурсом наращивания вычислительной мощности компьютеров. Существенным препятствием к параллельному выполнению программ являются так называемые точки ветвления, в которых решается вопрос, по какому из нескольких возможных путей пойдет выполнение программы после этой точки. Чем более совершенным является механизм предсказания ветвлений, тем лучше может быть распараллелена программа. При наличии избыточных вычислительных ресурсов можно начать выполнять сразу два возможных направления работы программы, не дожидаясь, пока ее основная ветвь дойдет до точки ветвления. После того как программа достигнет точки ветвления, можно уже окончательно выбрать результаты, полученные по одной из возможных ветвей. Сущность EPIC заключается в том, что блок предсказаний ветвлений выносится из аппаратной логики процессора в компилятор. Анализируя программу, компилятор сам определяет параллельные участки и дает процессору явные инструкции по их выполнению - отсюда и следует название архитектуры EPIC. Модернизация компилятора гибче и проще, чем модификация аппаратной части параллельной вычислительной системы. Например, можно установить новую версию компилятора и посмотреть, как это отразится на скорости работы прикладных программ, создаваемых с помощью этого компилятора. При этом следует иметь в виду, что изменить устройство процессора в уже работающей вычислительной системе невозможно. Установленный процессор можно только заменить на новый, подходящий для данной системы процессор, если таковой имеется в наличии. Поэтому архитектура EPIC позволяет более эффективно модифицировать работающие вычислительные системы за счет установки более совершенных версий компилятора. В-третьих, это многопоточность (TLP - Thread Level Parallelism), когда в каждом ядре процессора выполняется одновременно несколько потоков, конкурирующих между собой. Главная задача в развитии вышеперечисленных направлений - существенное повышение производительности вычислительных систем. Без развития параллельных технологий решить задачу повышения производительности вычислительных систем в настоящее время не представляется возможным, поскольку современные технологии микроэлектроники подошли к технологическому барьеру, препятствующему дальнейшему существенному увеличению тактовой частоты работы процессора и изготовлению процессоров по технологиям, существенно меньшим 15 нанометров. 6
Межузловые соединения в параллельных системах Большую роль в современных высокопроизводительных вычислительных системах играют топологии соединения процессоров и межузловые соединения. На рис. 1.1 представлены некоторые типичные топологии соединения вычислительных узлов в высокопроизводительных вычислительных системах. Отметим, что выбор топологии в соответствии со спецификой решаемых задач зачастую позволяет существенно повысить быстродействие системы при решении конкретного класса задач. Естественно, переход к решению другого класса задач может потребовать изменения топологии соединения узлов системы. Коммуникационные технологии играют важную роль в быстродействии вычислительных систем. В настоящее время на практике получили распространение следующие типы протоколов межузловых соединений: Ethernet, Myrinet, Infiniband, SCI, Quadrics и Numalink для систем с NUMA-памятью, разрабатываемых фирмой Silicon Graphics. На физическом уровне межузловые соединения организованы с помощью специальных кабелей, коммутаторов и интерфейсных плат, соответствующих конкретному типу межузлового соединения. Интерфейсные платы должны быть установлены в каждый узел кластера. Как правило, протоколу межузлового соединения соответствуют специальные системные библиотеки функций обмена сообщениями, поставляемые в комплекте с кабелями и интерфейсными платами. Для получения максимальной производительности вычислительной системы необходимо использовать именно эти библиотеки в процессе разработки программного обеспечения, поскольку применение иных библиотек может порой привести к весьма значительному снижению производительности вычислительной системы. Рис. 1.1. Топологии соединения вычислительных узлов в высокопроизводительных вычислительных системах Инструменты создания параллельных программ В настоящее время при создании параллельных программ, которые предназначены для многопроцессорных вычислительных систем MPP с распределенной памятью, для обмена данными между параллельными процессами, работающими в разных узлах 7
системы, широко применяется интерфейс обмена сообщениями (Message Passing Interface, MPI). При использовании этого интерфейса обмен данными между различными процессами в программе осуществляется с помощью механизма передачи и приемки сообщений. Кроме MPI при создании параллельных программ возможны и другие методы обмена, например, основанные на использовании функций программной системы PVM (Parallel Virtual Machine) или функций библиотеки SHMEM, разработанной компаниями Cray и Silicon Graphics. При создании параллельных программ, предназначенных для многопроцессорных вычислительных систем с общей памятью, в настоящее время для обмена данными между процессорами обычно используются либо методы многопоточного программирования с помощью нитей ( threads ), либо директивы OpenMP [1.6-1.13]. Директивы OpenMP являются специальными директивами для компиляторов. Они создают и организуют выполнение параллельных процессов (нитей), а также обмен данными между процессами. Отметим также, что обмен данными между процессами в многопроцессорных вычислительных системах с общей памятью может осуществляться и с применением функций MPI и SHMEM. В конце 2005 года компания Intel объявила о создании приложения Cluster OpenMP для компьютеров с процессорами собственного производства. Cluster OpenMP реализует расширение OpenMP, позволяет объявлять области данных доступными всем узлам кластера и тем самым распространяет методы OpenMP на создание параллельных программ для параллельных вычислительных систем с разделенной памятью. Это средство обладает рядом преимуществ по сравнению с MPI, главным из которых является простота разработки программ для Cluster OpenMP, поскольку передача данных между узлами кластера происходит неявно, по протоколу Lazy Release Consistency. Отметим, что компания Intel не является изобретателем этого подхода ранее такие попытки предпринимались в Японии (см., например, [1.14]) и некоторых других странах). Основными алгоритмическими языками параллельного программирования с использованием OpenMP в настоящее время являются Fortran и C/C++. Существуют многочисленные версии компиляторов, разработанные различными производителями программного обеспечения, позволяющие быстро и легко организовать параллельные вычисления с помощью методов OpenMP. Обычно директивы распараллеливания OpenMP применяются для распараллеливания последовательных программ. При этом последовательные программы не теряют своей работоспособности. Вернуться к последовательной версии очень просто: достаточно просто убрать опцию - openmp в вызове компилятора при компиляции программы. Кроме компиляторов, при создании параллельных программ широко используются специализированные отладчики и средства настройки и оптимизации программ, а также различные средства автоматического распараллеливания. В настоящее время на рынке программного обеспечения представлен достаточно широкий спектр коммерческих программных продуктов для автоматического распараллеливания. Как правило, эти системы состоят из графических средств представления параллельных программ, препроцессоров для генерации программ на 8
языках Fortran (77, 90, 95) и C/С++, специализированных трассировщиков и отладчиков, а также средств визуализации. Компания Intel разрабатывает не только процессоры для параллельных вычислительных систем, но и целый спектр инструментов для отладки, оптимизации и настройки эффективной работы параллельных программ. В настоящее время в компании разработаны компиляторы Fortran и C/C++ с возможностями создания параллельных программ средствами OpenMP на платформах Linux и Windows, а также средства анализа производительности программ VTune Performance Analyzer и Intel Thread Checker, позволяющие находить критические секции в многопоточных программах и существенно ускорять их выполнение. Кроме того, разработаны библиотеки стандартных функций Intel Math Kernel Library, Intel Cluster Math Kernel Library и Intel Integrated Performance Primitives, позволяющие существенно ускорить работу параллельных программ по обработке как числовой, так и графической информации. В конце 2005 года компания анонсировала появление продукта Intel Cluster OpenMP, позволяющего распространить технологии OpenMP на кластерные системы с разделенной памятью. При отладке параллельных программ также используется целый ряд специализированных отладчиков. Среди них отметим: idb - символический отладчик, разработанный корпорацией Intel. Поставляется вместе с компиляторами. Поддерживает отладку программ, написанных на алгоритмических языках Fortran и C/C++; gdb - свободно распространяемый отладчик GNU. Поддерживает отладку программ, написанных на алгоритмических языках C/C++ и Modula-2, а также на алгоритмическом языке Fortran 95 при установке дополнительного модуля gdb95; ddd - графический интерфейс к отладчику gdb и некоторым другим отладчикам; TotalView - лицензионный графический отладчик для отладки приложений в средах OpenMP и MPI. 9
Основные конструкции OpenMP Настоящая лекция посвящена изложению основ параллельного программирования с использованием OpenMP. В начале обсуждаются основные принципы программирования в OpenMP и рассматривается принципиальная схема программирования. Приводятся конкретные реализации управляющих директив OpenMP для программ, написанных на алгоритмических языках Fortran и C/C++. Перечисляются основные правила применения директив OpenMP, использующихся для описания данных и организации параллельных вычислений. Обсуждаются вопросы видимости данных и корректности доступа к данным. Рассматриваются методы распараллеливания циклов и контроля распределения работы между процессорами. Приводятся способы балансировки работы процессоров с помощью директив OpenMP, а также задания внешних переменных окружения с помощью функций OpenMP. Основные принципы OpenMP OpenMP - это интерфейс прикладного программирования для создания многопоточных приложений, предназначенных в основном для параллельных вычислительных систем с общей памятью. OpenMP состоит из набора директив для компиляторов и библиотек специальных функций. Стандарты OpenMP разрабатывались в течение последних 15 лет применительно к архитектурам с общей памятью. Описание стандартов OpenMP и их реализации при программировании на алгоритмических языках Fortran и C/C++ можно найти в [2.1-2.6]. Наиболее полно вопросы программирования на OpenMP рассмотрены в монографиях [2.7-2.8]. В последние годы весьма активно разрабатывается расширение стандартов OpenMP для параллельных вычислительных систем с распределенной памятью (см., например, работы [2.9]). В конце 2005 года компания Intel анонсировала продукт Cluster OpenMP, реализующий расширение OpenMP для вычислительных систем с распределенной памятью. Этот продукт позволяет объявлять области данных, доступные всем узлам кластера, и осуществлять передачу данных между узлами кластера неявно с помощью протокола Lazy Release Consistency. OpenMP позволяет легко и быстро создавать многопоточные приложения на алгоритмических языках Fortran и C/C++. При этом директивы OpenMP аналогичны директивам препроцессора для языка C/C++ и являются аналогом комментариев в алгоритмическом языке Fortran. Это позволяет в любой момент разработки параллельной реализации программного продукта при необходимости вернуться к последовательному варианту программы. В настоящее время OpenMP поддерживается большинством разработчиков параллельных вычислительных систем: компаниями Intel, Hewlett-Packard, Silicon Graphics, Sun, IBM, Fujitsu, Hitachi, Siemens, Bull и другими. Многие известные компании в области разработки системного программного обеспечения также уделяют значительное внимание разработке системного программного обеспечения с OpenMP. Среди этих компаний отметим Intel, KAI, PGI, PSR, APR, Absoft и некоторые другие. Значительное число компаний и научно-исследовательских организаций, разрабатывающих прикладное программное обеспечение, в настоящее время 10