Вы находитесь на странице: 1из 11

7.

Технологии параллельного программирования

7.1. Введение
7.2. Классификация технологии параллельного программирования
7.3. Краткие сведения о наиболее известных технологиях
7.3.1. Программирование с использованием потоков
7.3.1.1. Потоковая модель в Java
7.3.1.2. Потоковая модель .NET Framework
7.3.2. Технология программирования ОрепМР
7.3.3. Технология программирования МРI
7.3.3.1. Общие сведения
7.3.3.2. Виртуальные топологии MPI
7.3.3.3. Достоинства и недостатки MPI

7.1. Введение

Технология может давать пользователю полный контроль над использованием


ресурсов вычислительной системы и ходом выполнения его программы. Для этого ему
предлагается набор из нескольких сотен конструкций и функций, предназначенных "на
все случаи жизни". Он может создать действительно эффективную программу, если
правильно воспользуется предложенными средствами.

Основные критерии выбора технологии:


- возможность создания эффективных программ
- возможность быстрого создания программ
-возможность сохранения эффективности созданных программ при их
переносе

7.2. Классификация технологий параллельного программирования

Выбор технологии параллельного программирования — это и в самом деле вопрос


не простой. Если попытаться сделать обзор средств, которые могут помочь в решении
задач на параллельном компьютере, то даже поверхностный анализ приведет к списку из
более 100 наименований.
На практике существуют несколько технологических подходов к
программированию для параллельных вычислительных систем [1-3].

1. Программирование с использованием традиционных последовательных языков


программирования
Программирование с использованием потоковых систем Java и С#..

2. Программирование на стандартных и широко распространённых языках


программирования с использованием высокоуровневых коммуникационных библиотек и
интерфейсов (API) для организации межпроцессного взаимодействия.
Типичные представители
MPI [Message Passing Interface],
OpenMP - программный интерфейс (API) для программирования
компьютеров с разделяемой памятью и др.
3.  Введение специальных "распараллеливающих" конструкций в язык
программирования. При этом могут создаваться оригинальные параллельные языки или
параллельные расширения существующих последовательнs[ (с сохранением
преемственности).
Параллельные языки.
Ada - универсальный язык программирования, включающий в себя средства
для создания параллельных программ. Официальный язык программирования
министерства обороны США. Существует множество компиляторов для самых
разных платформ.
Linda - параллельный язык программирования. Программа рассматривается
как совокупность процессов, которые могут обмениваться данными через
пространство кортежей. В чистом виде практически не встречается, чаще всего
используется совместно с другими языками высокого уровня как средство общения
параллельных процессов
Occam - язык параллельного программирования, ориентированный в первую
очередь на написание программ для транспьютерных систем
Параллельные расширения и диалекты языков Fortran и С
-- Fortran-DVM и C-DVM - позволяют разрабатывать параллельные
программы на языках Фортран 95 и ANSI-C с вызовами функций системы
поддержки параллельного выполнения (Lib-DVM).(DVM [Distributed Virtual Memory
и Distributed Virtual Machine] )

4. Использование средств автоматического распараллеливания последовательных


программ.
VAST / Parallel - набор программных продуктов для автоматического
распараллеливания Fortran/C-программ для SMP (симметричных мульти
процессорных)-платформ. Есть возможность генерации OpenMP-кода
(VAST/toOpenMP).
BERT 77 - средство автоматического распараллеливания Fortran-программ, с
генерацией параллельного кода в модели обмена сообщениями (PVM [Parallel Virtual
Machine] или MPI [MessagePassing Interface]).

5. Программирование на стандартных языках. Использование в качестве


конструктивных элементов заранее распараллеленных процедур из специализированных
библиотек.
ATLAS [Automatically Tuned Linear Algebra Software] - библиотека,
позволяющая автоматически генерировать и оптимизировать численное
программное обеспечение для процессоров с многоуровневой организацией памяти
и конвейерными функциональными устройствами.
Aztec - параллельная библиотека итерационных методов для решения систем
линейных уравнений. Позволяет описывать части распределенной матрицы с
использованием глобальной адресации.
BlockSolve95 - параллельная библиотека для решения разреженных систем
систем линейных уравнений. Реализована с помощью MPI

6. Использование инструментальных систем, облегчающих создание и


проектирование параллельных программ
CODE - графическая система создания параллельных программ.
Параллельная программа представляется в виде графа, вершинами которого
являются последовательные участки, а дуги соответствуют пересылкам данных.
Последовательные участки могут быть написаны на любом языке, для пересылок
используется PVM или MPI.
DEEP [DEvelopment Environment for Parallel Programming] - интегрированная
среда для параллельного программирования. Обеспечивает графический интерфейс,
который связывает средства анализа производительности и отладки с исходным
кодом программы. Помогает понять структуру и поведение параллельной
программы. Поддерживаются языки Fortran (77, 90, 95) и C).
Платформы: UNIX и Windows NT.
Модели программирования: общая память, параллелизм по данным, передача
сообщений (MPI).
Reactor - среда разработки распределенных и клиент-серверных приложений.
Включает поддержку управления ресурсами, обработку исключительных
ситуаций, поддержку нитей (multi-threading), сборку мусора и другие компоненты.

7. Использование специализированных прикладных пакетов.


Задачи инженерного анализа, прочности, теплофизики, деформации,
упругости, пластичности, электромагнетизма (ANSYS, MSC.NASTRAN, ABAQUS,
LS-DYNA).
Задачи аэро- и гидродинамики, механики жидкостей и газов, горения и
детонации (CFX, FLUENT, STAR-CD, FLOWVISION, FLOW-3D, GDT).
Задачи акустического анализа (LMS Virtual Lab. Acoustic,
COMET/Acoustics).

7.3. Краткие сведения о наиболее известных технологиях

7.3.1. Программирование с использованием потоков [4]

Многозадачность поддерживается практически всеми современными


операционными системами. Есть два типа многозадачности: многозадачность, основанная
на процессах и многозадачность, основанная на потоках.
Многозадачность на основе использования процессов позволяет одновременно
выполнять несколько программ на компьютере. При этом программа является самой
малой единицей, которой может управлять планировщик операционной системы. Каждый
процесс требует отдельного адресного пространства.
Многозадачность, основанная на потоках, требует меньших затрат вычислительных
ресурсов, поскольку потоки одного процесса используют общее адресное пространство.
Переключение и коммуникации между потоками также требуют значительно меньшего
количества ресурсов. Минимальным элементом управляемого кода при многозадачности
на основе потоков является поток (thread).
В Java и C# присутствует встроенная поддержка программирования с
использованием нескольких потоков. Программа может содержать несколько частей,
выполняемых одновременно. К примеру, текстовый редактор может форматировать текст
и параллельно печатать его на принтере. Каждая такая часть программы называется
потоком и каждый поток задает отдельный путь выполнения программы. То есть
многопоточность является специализированной формой многозадачности.
Поддержка многопоточности позволяет писать эффективные программы за счет
использования всех ресурсов процессора. Еще одним преимуществом многопоточного
программирования является уменьшение времени ожидания. Это важно для
интерактивных сетевых систем, для которых ожидания и простой являются привычным
явлением.
Например, скорость передачи данных по сети существенно ниже скорости
обработки данных в пределах локальной файловой системы, которая в свою очередь
значительно ниже скорости обработки данных центральным процессором системы.
В равно потоковых программах следует ожидать завершения медленных операций
обработки данных. Поэтому время простоя может быть значительным. В
многопоточных программах за это же время можно параллельно выполнить ряд
"быстрых" операций.

При этом многопоточные программы используются как на одно-, так и


многоядерных системах.

7.3.1.1. Потоковая модель в Java

Вся библиотека классов Java спроектирована таким образом, чтобы обеспечить


поддержку многопоточности.
Преимущество многопоточности состоит в том, что не используется механизм
циклического опроса очереди событий. Один поток может быть приостановлен без
остановки других.
Потоки существуют в нескольких состояниях:
1. поток выполняется;
2. поток готовится к исполнению;
3. поток приостановлен (с возможностью восстановления);
4. работа потока возобновлена;
5. поток заблокирован
6. поток прерван (не может быть восстановлен).

Java присваивает каждому потоку приоритет, определяющий поведение этого


потока по отношению к другим потокам. Приоритеты потоков задаются целыми числами,
указывающими на относительный приоритет потока по отношению к другим потокам.
Следует отметить, что скорость выполнения потока с низким приоритетом не отличается
от скорости выполнения высокоприоритетного потока, если поток является единственным
потоком на данный момент. Но приоритет оказывает существенное влияние на процесс
перехода от выполнения одного потока к другому в случае многопоточных программ.
Этот процесс носит название переключения контекста. Правила переключения контекста:
1. Поток может добровольно передать управление. Для этого можно явно уступить
место в очереди выполнения, приостановить поток или блокировать на время выполнения
ввода-вывода. При этом все остальные потоки проверяются и ресурсы процессора
передаются готовому к выполнению потока с максимальным приоритетом.
2. Поток может быть прерван другим более приоритетным потоком. В этом случае
низкоприоритетный поток, не занимающий процессор, приостанавливается
высокоприоритетным потоком независимо от того, что он делает. Этот механизм
называется многозадачностью с вытеснением (или многозадачностью с приоритетом).
В случае, когда два потока с одинаковым приоритетом претендуют на то, чтобы
использовать процессор, ситуация усложняется. В операционной системе Windows эти
потоки разделяют между собой время процессора. В других операционных системах
потоки должны принудительно передавать управление своим "родственникам".

Синхронизация. Многопоточность предоставляет программам возможность


асинхронного поведения. Однако во многих случаях при совместном использовании
данных несколькими потоками возникает потребность в синхронизации. Например, при
совместном использовании связного списка нужно предусмотреть возможность запрета
одному потоку изменять данные этого списка, пока другой поток считывает элементы
этого списка. Для этого в Java используется хорошо известный по теории межпроцессной
синхронизации механизм, который называется "монитор". Монитор был разработан Ч.
Хоаром. Неформально можно воспринимать монитор как очень маленький сундук, в
который в единицу времени можно "поместить" лишь один поток. Как только поток
"вошел" в монитор, все остальные потоки должны ждать, пока поток не выйдет из
монитора. Таким образом, монитор может быть использован для защиты общих ресурсов
от одновременного использования более чем одним потоком.

Класс Thread и интерфейс Runnable. Многопоточная система Java встроена в


класс Thread, его методы и дополняющий его Runnable интерфейс. Класс Thread
инкапсулирует поток выполнения. Для того чтобы создать новый поток, нужно или
расширить класс Thread (путем подражания от него) или реализовать в классе интерфейс
Runnable.
Класс Thread определяет ряд методов, помогающих управлять потоками.
Некоторые из них приведены в следующей таблице
Таблица 1
Методы управления потоками класса Thread
Метод Назначение
getName Получить имя потока
getPriority Получить приоритет потока
isAlive Определить, выполняется ли поток
join Ожидать завершения выполнения потока
run Входящая точка потока
sleep Приостановить выполнение потока на заданный интервал времени
start Запустить поток на выполнение вызовом его метода run

7.3.1.2. Потоковая модель .NET Framework

Потоковая модель .NET Framework имеет много общего с потоковой системой Java.
Для подключения средств обработки потоков нужно использовать средства пространства
имен System.Threading [5].
В нем определен класс, представляющий отдельный поток - класс Thread.
Класс Thread определяет ряд методов и свойств, которые позволяют управлять
потоком и получать информацию о нем.
Основные свойства класса:
Статическое свойство CurrentContext позволяет получить контекст, в котором
выполняется поток
Статическое свойство CurrentThread возвращает ссылку на выполняемый
поток
Свойство IsAlive указывает, работает ли поток в текущий момент
Свойство IsBackground указывает, является ли поток фоновым
Свойство Name содержит имя потока
Свойство Priority хранит приоритет потока - значение перечисления
ThreadPriority
Свойство ThreadState возвращает состояние потока - одно из значений
перечисления ThreadState

Некоторые методы класса Thread:


 Статический метод GetDomain возвращает ссылку на домен приложения;
 Статический метод GetDomainID возвращает id домена приложения, в
котором выполняется текущий поток;
 Статический метод Sleep останавливает поток на определенное количество
миллисекунд;
 Метод Abort уведомляет среду CLR о том, что надо прекратить поток,
однако прекращение работы потока происходит не сразу, а только тогда, когда это
становится возможно. Для проверки завершенности потока следует опрашивать его
свойство ThreadState;
 Метод Interrupt прерывает поток, который находится в состоянии
WaitSleepJoin;
 Метод Join блокирует выполнение вызвавшего его потока до тех пор, пока
не завершится поток, для которого был вызван данный метод;
 Метод Start запускает поток/

7.3.2. Технология программирования ОрепМР [Open Multi-Processing].

Одним из наиболее популярных средств программирования компьютеров с общей


памятью, построенных на подобных принципах, в настоящее время является технология
ОрепМР [Open Multi-Processing].
OpenMP – это интерфейс прикладной программы, расширяющий
последовательный язык программирования набором директив компилятора, вызовов
функций библиотеки поддержки выполнения и переменных среды.
В рассматриваемом стандарте соответствующая алгоритму решения
последовательная программа служит основой для применения параллельных вычислений.
Для этого используются директивы, процедуры и переменные окружения. Стандарт
ОреnМР разработан для языков Fortran (77, 90, и 95), С и С++. Реализации стандарта
доступны как на многих UNIX-платформах, так и в среде Windows NT.
Технология ОреnМР опирается на понятие общей памяти, и поэтому она, в
значительной степени, ориентирована на SМР-компьютеры. На подобных архитектурах
возможна эффективная поддержка нитей, исполняющихся на различных процессорах, что
позволяет избежать значительных накладных расходов на поддержку классических UNIХ
процессов.
Термин «нить» следует понимать как легковесный процесс, поток. На рис. 7.1
представлен процесс исполнения программы. Текст программы делится на
последовательные и параллельные секции. Затем инициируется нить-мастер, которая
обеспечивает выполнение программы
Рис. 7.1. Разбиение текста программы на последовательные и параллельные
области

Все последовательные секции выполняет нить-мастер. Параллелизм


обеспечивается схемой FORK/JOIN. Нить-мастер порождает дополнительные нити при
входе в параллельную область (выполняется операция FORK). При этом каждая
порожденная нить получает свой уникальный номер, причем нить-мастер всегда имеет
номер 0. Все порожденные нити исполняют одинаковый код, который соответствует
параллельной области.
Основная нить дожидается завершения остальных нитей при выходе из
параллельной области и она же обеспечивает последующее выполнение программы
(выполняется операция JOIN).
В параллельной секции происходит разделение переменных программы на общий
(SHARED) и локальный (PRIVATE) классы.
Глобальные переменные могут использоваться всеми нитями. Для локальных
переменных создается экземпляр на каждой нити.
Таким образом, за выполнение параллельных секций отвечает набор нитей, у
которых есть доступ к глобальным и локальным переменным.
Преимущества технологии OpenMP:
1. Технология предоставляет пользователю возможность работать как с
параллельной так и с последовательной секциями программы.
Директивы ОреnМР не обрабатываются компилятором последовательного
вычислительного устройства. Переменные окружения и специальные функции защищены
механизмами, предусмотренными стандартом.
2. Технология предоставляет возможность постепенного перехода к параллельной
версии.

7.3.3. Технология программирования МРI [Message Passing Interface]

7.3.3.1. Общие сведения

Технология MPI является наиболее распространенной технологией


программирования параллельных компьютеров с распределенной памятью. Основным
способом взаимодействия параллельных процессов в таких системах является передача
сообщений друг другу. Это и отражено в названии технологии – Message Passing Interface.

Под параллельной программой в рамках MPI понимается множество


одновременно выполняемых процессов. Процессы могут выполняться на разных
процессорах (виртуальных компьютерах), но на одном процессоре могут располагаться и
несколько процессов (в этом случае их исполнение осуществляется в режиме разделения
времени). В предельном случае для выполнения параллельной программы может
использоваться один процессор – как правило, такой способ применяется для начальной
проверки правильности параллельной программы.
Каждый процесс параллельной программы порождается на основе копии одного и
того же программного кода. Данный программный код, представленный в виде
исполняемой программы, должен быть доступен в момент запуска параллельной
программы на всех используемых процессорах.
Исходный программный код для исполняемой программы разрабатывается на
алгоритмических языках C (С++) или Fortran с применением той или иной реализации
библиотеки MPI.
Количество процессов и число используемых процессоров определяется в момент
запуска параллельной программы средствами среды исполнения MPI программ и в ходе
вычислений не может меняться без применения специальных, но редко задействуемых
средств динамического порождения процессов и управления ими, появившихся в
стандарте MPI версии 2.0.
Все процессы программы последовательно перенумерованы от 0 до p-1, где p есть
общее количество процессов. Номер процесса именуется рангом процесса.

Основу MPI составляют операции передачи сообщений. Среди предусмотренных в


составе MPI функций различаются парные (pointtopoint) операции между двумя
процессами и коллективные (collective) коммуникационные действия для одновременного
взаимодействия нескольких процессов.
Для выполнения парных операций могут использоваться разные режимы
передачи, среди которых синхронный, блокирующий и др.
Процессы параллельной программы объединяются в группы.

Другим важным понятием MPI, описывающим набор процессов, является понятие


коммуникатора. Под коммуникатором в MPI понимается специально создаваемый
служебный объект, который объединяет в своем составе группу процессов и ряд
дополнительных параметров (контекст), используемых при выполнении операций
передачи данных.
Парные операции передачи данных выполняются только для процессов,
принадлежащих одному и тому же коммуникатору.
Коллективные операции применяются одновременно для всех процессов одного
коммуникатора. Как результат, указание используемого коммуникатора является
обязательным для операций передачи данных в MPI.
В ходе вычислений могут создаваться новые и удаляться существующие группы
процессов и коммуникаторы. Один и тот же процесс может принадлежать разным
группам и коммуникаторам. Все имеющиеся в параллельной программе процессы входят
в состав конструируемого по умолчанию коммуникатора с идентификатором
MPI_COMM_WORLD.
При выполнении операций передачи сообщений для указания передаваемых или
получаемых данных в функциях MPI необходимо указывать тип пересылаемых данных.
MPI содержит большой набор базовых типов данных, во многом совпадающих с типами
данных в алгоритмических языках C и Fortran. Кроме того, в MPI имеются возможности
создания новых производных типов данных для более точного и краткого описания
содержимого пересылаемых сообщений

Итак, если сформулировать коротко, MPI – это библиотека функций,


обеспечивающая взаимодействие параллельных процессов с помощью механизма
передачи сообщений. Это библиотека, состоящая примерно из 130 функций, в число
которых входят:
 Функции инициализации и закрытия MPI-процессов;
 Функции, реализующие парные операции;
 Функции, реализующие коллективные операции;
 Функции для работы с группами процессов и коммуникаторами;
 Функции для работы со структурами данных;
 Функции формирования топологии процессов.
7.3.3.2. Виртуальные топологии MPI

Топология – это механизм сопоставления процессам некоторого коммуникатора


альтернативной схемы адресации. В MPI топологии виртуальны, то есть они не связаны с
физической топологией коммуникационной сети.
Топология может использоваться
- программистом для более удобного обозначения процессов, и таким образом,
приближения параллельной программы к структуре математического алгоритма
- системой для оптимизации распределения процессов по физическим процессорам
используемого параллельного компьютера при помощи изменения порядка нумерации
процессов внутри коммуникатора.
В MPI предусмотрены два типа топологий[6]:
• декартова топология (прямоугольная решетка произвольной размерности);
• топология графа.

Процедура определения типа топологии, связанной с коммуникатором COMM


записывается следующим образом.

MPI_TOPO_TEST(COMM, TYPE, IERR)


INTEGER COMM, TYPE, IERR
Возможные возвращаемые значения параметра TYPE:
• MPI_GRAPH для топологии графа;
• MPI_CART для декартовой топологии;
• MPI_UNDEFINED – с коммуникатором COMM не связана никакая топология.

Декартова топология имеет следующий набор функций:


- функция, конструирующая декартову топологию путем создания коммуникатора
COMM_CART (используется для описания декартовой структуры произвольного
измерения);
- функция задания решетки (позволяет пользователю выбрать сбалансированное
распределение процессов по направлению координат, в зависимости от числа процессов,
включая определения числа элементов в каждом измерении декартовой решетки);
- информационные функции (возвращают число измерений декартовой топологии,
связанной с заданным коммуникатором или информацию относительно декартовой
топологии, связанной с заданным коммуникатором: массив значений, указывающих
количество процессов, периодичность в каждом измерении, координаты вызвавшего
процесса);
- функции транслирования (перевод декартовых логических координат процессов
в их номера (ранги) процессов или перевод номеров (рангов) процессов в коммуникаторе
в декартовые логические координаты процессов);
- функция разбиения (расщепление коммуникатора, с которым связана декартова
топология, на подгруппы, соответствующие декартовым подрешеткам меньшей
размерности);
- функция смещения (получение номеров посылающего и принимающего
процессов в декартовой топологии конкретного коммуникатора для осуществления сдвига
вдоль некоторой координаты).

Топология графа имеет такие процедуры:


- создание коммуникатора COMM_GRAPH, обладающего топологией графа;
- определение количества непосредственных соседей процесса с заданным рангом ;
- определение рангов непосредственных соседей процесса с заданным рангом;
- определение числа вершин и числа ребер графовой топологии, связанной с с
заданным коммуникатором ;
- определение информации о топологии графа, связанной с заданным
коммуникатором.

7.3.3.3. Достоинства и недостатки MPI

В числе основных достоинств MPI по сравнению с интерфейсами других


коммуникационных библиотек обычно называют следующие его возможности:
• Возможность использования в языках Фортран, Си, Си++;
• Предоставление возможностей для совмещения обменов сообщениями и
вычислений;
• Предоставление режимов передачи сообщений, позволяющих избежать
излишнего копирования информации для буферизации;
• Широкий набор коллективных операций (например, широковещательная
рассылка информации, сбор информации с разных процессоров), допускающих гораздо
более эффективную реализацию, чем использование соответствующей
последовательности пересылок точка-точка;
• Широкий набор редукционных операций (например, суммирование
расположенных на разных процессорах данных, или нахождение их максимальных или
минимальных значений), не только упрощающих работу программиста, но и
допускающих гораздо более эффективную реализацию, чем это может сделать
прикладной программист, не имеющий информации о характеристиках
коммуникационной системы;
• Удобные средства именования адресатов сообщений, упрощающие разработку
стандартных программ или разделение программы на функциональные блоки;
• Возможность задания типа передаваемой информации, что позволяет обеспечить
ее автоматическое преобразование в случае различий в представлении данных на разных
узлах системы.
Однако разработчики MPI подвергаются и суровой критике за то, что интерфейс
получился слишком громоздким и сложным для прикладного программиста. Интерфейс
оказался сложным и для реализации, в итоге, в настоящее время практически не
существует реализаций MPI, в которых в полной мере обеспечивается совмещение
обменов с вычислениями.
Появившийся в 1997 проект стандарта MPI-2 выглядит еще более громоздким и
неподъемным для полной реализации. Он предусматривает развитие в следующих
направлениях:
• Динамическое создание и уничтожение процессов;
• Односторонние коммуникации и средства синхронизации для организации
взаимодействия процессов через общую память (для эффективной работы на системах с
непосредственным доступом процессоров к памяти других процессоров);
• Параллельные операции ввода-вывода (для эффективного использования
существующих возможностей параллельного доступа многих процессоров к различным
дисковым устройствам).

[1] https://parallel.ru/tech/tech_dev
[2] https://myslide.ru/presentation/obzor-texnologij-parallelnogo-programmirovaniya
[3] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. СПб.: БХВ-
Петербург, 2002. — 608 с.
[4] [Коцовський В.М. Теорія паралельних обчислень: Методичний посібник для
студентів спеціальності "Програмне забезпечення систем" / В. М. Коцовський. —
Ужгород: Видавництво УжНУ "Говерла", 2015. — 44 с.
[5] https://metanit.com/sharp/tutorial/11.1.php
[6] Антонов А.С.Параллельное программирование с использованием технологии
MPI: уч. пособие. – М.: Изд-во МГУ, 2004. -71 с.
https://parallel.ru/sites/default/files/tech/tech_dev/MPI/mpibook.pdf

Вам также может понравиться