Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОСЫ / Parallelnoe_programmirovanie.doc
Скачиваний:
82
Добавлен:
15.02.2016
Размер:
273.92 Кб
Скачать
  1. Интерфейс передачи сообщений (MPI). Основные понятия и определения.

MPI является библиотекой функций обмена данными между процессами, реализованной для языков С и Fortran. Головной организацией проекта MPI является Аргоннская национальная лаборатория США. После появления первой версии стандарта MPI в мае 1994 года MPI получил широкое распространение. В настоящее время стандарт MPI адаптирован для большинства суперЭВМ и кластеров.

Под параллельной программой в рамках MPI понимается множество одновременно выполняемых процессов, имеющих раздельные адресные пространства. Каждый процесс параллельной программы порождается на основе копии одного и того же программного кода (модель SPMP - одна программа множество процессов single program multiple processes). Программный код, представленный в виде исполняемой программы, должен быть доступен в момент запуска параллельной программы на всех используемых процессорах.

Количество процессов и число используемых процессоров определяется в момент запуска параллельной программы средствами среды исполнения MPI и в ходе вычислений меняться не может (в стандарте MPI-2 предусматривается возможность динамического изменения количества процессов). Все процессы программы последовательно нумеруются от 0 до p-1, где p есть общее количество процессов. Номер процесса называется рангом процесса.

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

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

Парные операции передачи данных выполняются для процессов, принадлежащих одному и тому же коммуникатору. Коллективные операции применяются одновременно для всех процессов коммуникатора.

В ходе вычислений могут создаваться новые и удаляться существующие группы процессов и коммуникаторы. Один и тот же процесс может принадлежать разным группам и коммуникаторам. Все имеющиеся в параллельной программе процессы входят в состав создаваемого по умолчанию коммуникатора с идентификатором MPI_COMM_WORLD.

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

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

MPI содержит функции создания виртуальных топологий. Топология – это логическая организация процессов в группе (внутри коммуникатора).

Следует различать виртуальную и физическую топологию процессов. Виртуальная топология должна применяться к физическим процессам для организации логической структуры процессов с целью увеличения производительности обменов на данной вычислительной системе. Описание виртуальной топологии зависит от конкретного приложения и является машинно-независимой.

Наиболее общим видом топологии процессов является структура графа. Узлы графа соответствуют процессам, ребра соответствуют связям между процессами.

Наиболее часто в параллельных приложениях используется топология двумерных массивов или декартова топология. Эта структура полностью определяется количеством процессов по каждой координате (строки и столбцы). Координаты в декартовой топологии нумеруются от 0. Например, соотношение между номером процесса в группе и координатами в решетке [2, 2] для четырех процессов будет следующим:

coord (0,0): rank 0 сoord (0,1): rank 1

сoord (1,0): rank 2 сoord (1,1): rank 3

  1. Реализация интерфейса передачи данных (MPICH). Общая характеристика среды выполнения MPI программ.

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

Возможны два способа построения реализаций:

1) прямая реализация для конкретной ЭВМ и

2) реализация через ADI (интерфейс абстрактного устройства).

Т.к. типов параллельных систем довольно много, то количество реализаций в первом случае будет слишком велико. Во втором случае строится реализация для абстрактного устройства, а затем архитектура ADI, используя оборудование конкретной вычислительной системы реализуется в этой системе программно. Такая двухступенчатая реализация MPI уменьшает число вариантов и обеспечивает переносимость реализаций.

В Аргоннской национальной лаборатории США подготовлены и получили широкое распространение реализации MPI, получившие название MPICH (CH взята из названия пакета Сhameleon, который ранее использовался для систем с передачей сообщений, многое из этого пакета вошло в MPIСH).

Имеется три поколения MPIСH, связанных с развитием ADI.

ADI-1 было спроектировано для компьютеров с массовым параллелизмом, где механизм обмена между процессами принадлежал системе.

ADI-2 – добавлен эффективный коммуникационный механизм с большим набором функций.

ADI-3 – обеспечило адаптацию к различным коммуникационным архитектурам, удаленный доступ и поддержку операций MPI-2, таких как динамическое управление процессами.

Для обмена сообщениями ADI должен обеспечивать четыре набора функций:

1) описания передаваемых и получаемых сообщений;

2) перемещения данных между ADI и передающей аппаратурой;

3) управления списком сообщений (как посланных, так и принимаемых);

4) получения основной информации об исполнительной среде и ее состоянии.

ADI содержит процедуры для упаковки сообщений и подключения заголовочной информации, управления буферизацией, установления cоответствия приема передач сообщений и др.

Каждая реализация библиотеки функций MPI содержит ряд собственных протоколов, устанавливающих правила выполнения основных операций передачи данных. В реализации MPIСH используются 2 протокола: Eager и Rendezvous.

Eager. При отправке данных, с адресом начала буфера MPI должен включить информацию о тэге, коммуникаторе, длине, источнике и получателе сообщения. Эту дополнительную информацию называют оболочкой (envelope), которая следует за данными. Передачу данных вместе с оболочкой реализует eager протокол.

Когда сообщение прибывает на процесс получатель, соответствующая процедура приема может быть либо уже запущена, либо нет.

Если процедура приема запущена, предоставляется место для приходящих данных, если нет, принимающий процесс должен определить, что сообщение прибыло и сохранить его. Из пришедших сообщений формируется очередь, к которой обращается функция приема сообщений MPI_Recv. Если сообщение пришло, операция приема выполняется и обмен считается завершенным. В том случае, если сообщение не может быть принято немедленно, оно буферизуется и находится в состоянии ожидания обмена.

Rendezvous. Передачу “больших” (объем сообщения превышает установленный в MPI размер буфера приема-передачи) сообщений реализует протокол Rendezvous. В этом случае процесс получает только оболочку, содержащую служебную информацию о передаваемом сообщении. Только после того, как процесс отправитель получит подтверждение на возможность приема, данные будут отправлены.

Главное преимущество протокола «рандеву» состоит в том, что он позволяет принимать произвольно большие сообщения в любом количестве, для коротких сообщений он не используется. Возможно большое количество других протоколов и их модификаций

Канальный интерфейс является одним из наиболее важных уровней иерархии ADI и может иметь множественные реализации. Например, р4 – для систем с передачей сообщений, и p2 – для систем с общей памятью. Реализация Chameleon, построена на базе интерфейса p4, который частично используется в реализации MPICH.

Для разработки, компиляции, компоновки и выполнения параллельных программ требуется специальная среда. Если для разработки и сборки параллельных приложений достаточно возможностей таких средств разработки, как Visual Studio, то запуск требует ряда дополнительных возможностей. Например, средств планирования запуска заданий, определения и захвата необходимого задаче числа процессоров и т.д.

Как правило, средства запуска параллельных программ разрабатываются и поставляются с реализацией MPI-библиотек. Для версий MPICH – это скрипт с именем mpirun которому с помощью дополнительных ключей подается обязательные параметры, такие как количество процессов, которые необходимо создать для выполнения задачи и имя файла, содержащего исполняемый код параллельной программы. Дополнительные параметры могут подаваться в случае необходимости, например, список имен используемых для выполнения задачи процессоров.

Итак, MPICH является переносимой реализацией полного описания MPI для широкого круга параллельных вычислительных сред, включая кластеры рабочих станций и массово-параллельные системы. Кроме библиотеки функций MPI, MPICH содержит программную среду, которая включает мобильный механизм запуска параллельных программ, библиотеку функций для исследования эффективности выполнения MPI программ, графическую библиотеку MPE и программные средства визуализации полученных данных при выполнении профилирования.

  1. Особенности взаимодействия параллельных процессов с использованием блокирующих операций двухточечных обменов MPI. Коммуникационные режимы.

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

Передача и прием сообщений процессами – это базовый коммуникационный механизм MPI. Основными операциями парного обмена являются операции send (послать) и receive (получить).

Каждое сообщение, кроме передаваемых данных содержит информацию, которая используется, для того, чтобы идентифицировать сообщения. Эта информация состоит из фиксированного количества полей, которые в совокупности называются атрибутами сообщения. Это: source, destination, tag, communicator (номер процесса-отправителя сообщения, номер процесса-получателя, тэг, коммуникатор). Целочисленный аргумент тэг присваивает сообщению уникальный номер, по которому функция приема однозначно выбирает из очереди пришедших на процесс сообщений, только ей предназначенное сообщение. Диапазон значений тэга находится в пределах максимального целого значения машинного представления на используемом вычислительном комплексе.

Коммуникатор описывает контекст коммуникационной операции. Обмен сообщениями всегда выполняется только внутри одного контекста; сообщения, отправленные в различных контекстах (коммуникаторах), не взаимодействуют.

В MPI предопределен коммуникатор с именем MPI_COMM_WORLD. Он разрешает операции обмена в созданной после инициализации MPI группе процессов. При инициализации каждому процессу в группе коммуникатора MPI_COMM_WORLD автоматически присваивается уникальный номер, идентификация процессов в С реализации MPI начинается с нуля.

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

1) стандартный MPI_Send, при котором передаваемое сообщение перед отправкой может быть буферизовано, либо нет. Решение о необходимости буферизации принимает MPI, после завершения функции буфер может быть использован повторно, состояние отправленного сообщения может быть различным - сообщение может располагаться в процессе-отправителе, может находиться в процессе передачи, может храниться в процессе-получателе или же может быть принято процессом-получателем при помощи функции MPI_Recv.

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

3) буферизованный MPI_Bsend, предполагает обязательную буферизацию сообщения не зависимо от объема передаваемых данных, перед вызовом функции MPI_Bsend должна быть обязательно вызвана функция выделения системного буфера для копирования в него отправляемого сообщения; функция отправки сообщения завершается сразу же после копирования сообщения в системный буфер,

4) по готовности MPI_Rsend, при котором отправка сообщения начинается только в том случае, если операция приема сообщения на процессе получателе уже инициирована. При выполнении сообщение может быть буферизовано.

Практическое использование режимов:

1. Режим передачи по готовности формально является наиболее быстрым, но используется достаточно редко, т.к. обычно сложно гарантировать готовность операции приема,

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

3. Синхронный режим является наиболее медленным, т.к. требует подтверждения приема. В тоже время, этот режим наиболее надежен – можно рекомендовать его для передачи длинных сообщений.

Для функции приема MPI_Recv не существует различных режимов работы.

Семантика двухточечных обменов

Очередность. Если отправитель последовательно посылает два сообщения в один адрес, то на процессе получателе они должны быть приняты в том же порядке, в котором были отправлены, т.е. при таком порядке передачи, сообщения не обгоняют друг друга.

Если процесс имеет однопоточное исполнение, тогда любые два обмена, выполняемые этим процессом, упорядочены - это требование соответствия посылки и приема.

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

Ограничение по ресурсам. Любое выполнение операций обмена предполагает наличие ресурсов, которые могут быть ограниченными. В том случае, если при выполнении передачи ресурсов недостаточно, возникает ошибка. В операциях приема передачи сообщений размер приемного буфера не может быть меньше количества принимаемых данных, иначе возникнет ошибка переполнения. Если приемный буфер больше количества полученных данных, то его размер не изменяется и ошибки не возникает.

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

1. Формируется пакет сообщения, который включает передаваемые данные (информационную часть) и служебную информацию: source, destination, tag и communicator. Размер информационной части вычисляется в байтах и равен произведению значения MPI_Datatype (число байт типа передаваемых данных) на count (количество передаваемых элементов). Адрес начала буфера передачи задается первым параметром в функции MPI_Send. Информационная часть сообщения будет сформирована данными от указанного адреса, протяженностью, равной вычисленной длине в байтах.

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

3. Данные от пришедшего сообщения помещаются в приемный буфер, адрес начала которого задается первым параметром в функции MPI_Recv. Размер принимаемого сообщения вычисляется аналогично.

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

  1. Особенности взаимодействия параллельных процессов с использованием не блокирующих операций двухточечных обменов MPI. Коммуникационные режимы.

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

Имена функций, выполняющих не блокирующие операции передачи данных аналогичны именам соответствующих блокирующих функций с добавлением префикса I (Immediate). Список параметров не блокирующих функций содержит весь набор параметров блокирующих функций и дополнительный параметр request с типом MPI_Request (в функции MPI_Irecv отсутствует также параметр status):

MPI_Isend()

MPI_Ibsend() MPI_Irecv()

MPI_Issend()

MPI_Irsend()

Аналогично блокирующим, функции не блокирующей передачи могут использовать четыре режима: стандартный, буферизованный, синхронный и по готовности.

Вызов не блокирующей функции приема или передачи приводит к инициированию запрошенной операции, после чего функция завершается и процесс продолжает работу. При инициировании не блокирующая операция присваивает уникальное значение дескриптору запроса - переменной request. Наличие дескриптора запроса является очень важной характеристикой не блокирующих обменов и используется для завершения инициированной операции обмена. Все обмены на одном процессе должны иметь разные значения дескриптора запроса, чтобы обеспечить однозначность завершения обмена в соответствующих функциях. Завершение обменов выполняется явно вызовом специальных функций, где в качестве параметра подается уникальный номер дескриптора запроса, по уникальному значению которого однозначно определяется операция, требующая завершения.

Исключая режим по готовности, передачи в остальных трех режимах, могут стартовать вне зависимости от того, был ли инициирован соответствующий прием. Передача по готовности может быть начата, только если соответствующий прием инициирован. Во всех случаях вызов начала посылки сообщения является локальным: он заканчивается немедленно, безотносительно к состоянию других процессов.

Если при вызове операции приема обнаруживается нехватка некоторых системных ресурсов, то операция не может быть выполнена и возвращается код ошибки.

Дескриптор запроса (request)

Все не блокирующие вызовы и блокирующая операция приема создают объект коммуникационного запроса и связывают его с дескриптором запроса (request). Дескриптор запроса является коммуникационным объектом. Когда операция приема или передачи завершена, дескриптор запроса устанавливается в MPI_REQUEST_NULL, при этом статусный объект status, связанный с этим запросом, инициализируется (присваиваются значения элементам структуры status). Между дескриптором запроса и статусом существует взаимно однозначное соответствие. Состояние статуса может соответствовать пришедшему сообщению или быть empty (пусто), в этом случае tag = MPI_ANY_TAG, error = MPI_SUCCESS, source = MPI_ANY_SOURCE.

Завершение обмена

Чтобы завершить не блокирующий обмен, используются функции MPI_Wait, MPI_Waitall и MPI_Test, MPI_Testall. Операции MPI_Wait и MPI_Waitall являются блокирующими, MPI_Test (MPI_Testall) – не блокирующими.

Функции завершения обмена необходимы для правильной работы MPI указывая, что статусный объект установлен, приемный буфер содержит принятое сообщение и процесс-получатель может обращаться к нему, не опасаясь того, что данные будут испорчены.

Функции блокирующих и не блокирующих обменов могут использоваться совместно в любых комбинациях.

Семантика не блокирующих коммуникаций

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

5. Коллективные операции передачи данных. Основные определения. Принцип взаимодействия процессов при выполнении барьерной синхронизации, широковещательной передачи, операций сборки и рассылки данных.

Под коллективными операциями в MPI понимаются операции над данными, в которых принимают участие все процессы в группе, определяемой одним коммуникатором. В противном случае, происходит ошибка, и выполнение параллельной программы прекращается. Коммуникатор обеспечивает контекст коллективных операций в группе.

Вызов коллективной функции на процессе возвращает управление сразу после того, как только его участие в коллективной операции завершено. Завершение вызова не означает, что другие процессы в группе завершили коллективную операцию, а только показывает, что процесс может обращаться к буферу обмена. Таким образом, вызов коллективной операции имеет эффект синхронизации всех процессов в группе. Это утверждение не относится к барьерной функции (MPI_Barrier), которая при вызове блокирует процесс до тех пор, пока все процессы в группе не вызовут ее, выполняя тем самым явную синхронизацию.

Используемые в коллективных операциях типы данных, должны совпадать у процесса-отправителя и процесса получателя. Условия соответствия типов для коллективных операций более строгие, чем аналогичные условия для парных обменов. А именно, для коллективных операций количество и тип посланных данных должно точно соответствовать количеству и типу принятых данных. Коллективные операции могут иметь один процесс отправитель или получатель, или отправителями/получателями являются все процессы в группе. Различные коллективные операции (широковещание, рассылка или сбор данных) имеют единственный процесс-отправитель или процесс-получатель. Такой процесс называются корневым (root).

Некоторые аргументы в коллективных функциях определены как “существенные только для корневого процесса” и игнорируются для всех других участников операции.

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

1. Барьерная синхронизация mpi_Barrier (mpi_Comm comm)

В ряде ситуаций независимо выполняемые в процессах вычисления необходимо синхронизировать. Так, например, для измерения времени начала работы параллельной программы необходимо, чтобы для всех процессов одновременно были завершены все предварительные действия. Синхронизация процессов – это одновременное достижение процессами тех или иных точек процесса вычислений.

Функция барьерной синхронизации блокирует вызывающий процесс, пока все процессы группы не вызовут ее. В каждом процессе управление возвращается только тогда, когда все процессы в группе вызовут данную операцию.

Соседние файлы в папке ГОСЫ