Здавалка
Главная | Обратная связь

Интерфейс MPI. Функции инициализации MPI программ. Типы данных MPI. Двухточечные операции передачи данных.



Федеральное агентство по атомной энергии

Федеральное государственное образовательное учреждение высшего профессионального образования

Национальный исследовательский ядерный университет «МИФИ»

 

 

Факультет информационных технологий и электроники

Кафедра вычислительной и информационной техники

 

 

СРЕДСТВА РАЗРАБОТКИ ПАРАЛЛЕЛЬНЫХ ПРИЛОЖЕНИЙ НА ОБЩЕЙ И РАСПРЕДЕЛЕННОЙ ПАМЯТИ В СТАНДАРТЕ ИНТЕРФЕЙСА ПЕРЕДАЧИ ДАННЫХ MPI И OPENMP C РЕАЛИЗАЦИИ

КУРС ЛЕКЦИЙ

 

 

Составил: ст. преподаватель кафедры ВИТ Фролова Н.В.

 

 

Саров 2011


Лекция 1

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

На сегодняшний день широко используются три основные модели разработки параллельных приложений. Выбор модели определяется архитектурой вычислительной системы (ВС).

  1. SMP - модель общего адресного пространства – реализована в интерфейсах потокового программирования, примером которого является OpenMP, зависит от архитектуры памяти вычислительной системы и может быть использована только на общей памяти.
  2. MPP модель распределенного адресного пространства – реализована в библиотеке передачи сообщений MPI, не зависит от архитектуры памяти вычислительной системы и может быть использована как на общей, так и на распределенной памяти.
  3. Смешанные архитектуры (ВС кластерного типа с использование передачи данных между вычислительными узлами и безобменных средств распараллеливания внутри узла) эффективно использует смешанную архитектуру памяти вычислительных систем. Как правило, вычислительные узлы современных высокопроизводительных комплексов кластерного типа имеют многопроцессорную мультиядерную архитектуру. Большинство прикладных задач, выполняемых на многопроцессорных вычислительных комплексах с архитектурой распределенной памяти, использует технологию двухсторонних коммуникаций, реализованную в операциях приема/передачи MPI. Использование безобменных средств потокового распараллеливания при выполнении арифметической работы внутри вычислительного узла, потенциально, способно повысить производительность выполнения параллельных задач. Однако нередко эффективность использования потокового распараллеливания ограничена особенностями вычислительного алгоритма задачи, например, требует выполнения процедур синхронизации при обращении к общим ячейкам памяти.

 

Изучение принципа разработки параллельных программ начнем с распределенного адресного пространства и возможностей библиотеки MPI. MPI – Message Passing Interface, является библиотекой функций, в основу которой положен принцип обмена данными между логическими процессами параллельной задачи. Библиотека функций MPI реализована в С/C++ и Fortran интерфейсах. Первая версия библиотеки MPI разработана Аргонской национальной лабораторией США в 1994. В настоящее время стандарт MPI адаптирован для большинства высокопроизводительных вычислительных систем с архитектурой общей и распределенной памяти. На сегодняшний день MPI реализован в двух стандартах: MPI-1 и MPI-2. MPI-2 является расширенной версией MPI-1, предусматривается возможность динамического изменения количества процессов и разделяемого ввода/вывода.

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

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

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

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

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

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

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

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

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

 

MPI – Message Passing Interface, является библиотекой функций, которые обеспечивают в первую очередь обмен данными между процессами. Для использования функций библиотеки в некоторой исполнительной среде, необходима реализация MPI. В настоящее время разработкой реализаций MPI занимается множество компаний, наиболее известными являются Intel (реализация Intel-MPI), ANL(MPICH-реализация Аргонской Национальной Лаборатории), openmpi разрабатывается под GNU лицензией и т.д.

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

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) может быть либо уже запущена, либо нет.

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

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

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

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

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

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

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

В состав MPICH входят скриптовые (командные) файлы для компиляции и запуска параллельных программ, и несколько сервисных файлов (bin каталог). Lib каталог содержит требуемые для сборки приложения библиотеки кодов MPI-функций. Основными являются libmpich.a (libmpich.lib) и libfmpich.a (libfmpich.lib). Include каталог содержит требуемые для компиляции программы подключаемые файлы с прототипами MPI-функций (.h). Основными являются mpi.h (mpif.h для Фортран реализации).

 

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

Запуск приложений выполняет командный файл mpirun:

mpirun –np <кол-во_процессов> <имя_исполняемого_файла>

Лекция 2

Интерфейс MPI. Функции инициализации MPI программ. Типы данных MPI. Двухточечные операции передачи данных.

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

int MPI_Init(int *argc, char ***argv)

Значения аргументов argc и argv функция получает из функции main(int argc, char *argv[]). Функция вызывается в программе один раз и создает коммуникационное пространство выполняемой программы.

Int MPI_Finalize()

Функция освобождает все MPI состояния. После ее вызова ни одна MPI функция (даже MPI_Init) не может быть вызвана.

 

Коммуникатор MPI_COMM_WORLD включает все процессы, которые могут взаимодействовать после инициализации, он определяется после вызова MPI_Init.

 

Функции доступа к коммуникатору

Эти функции локальны и их выполнение не требует межпроцессорных обменов.

int MPI_Comm_size (MPI_Comm comm, int *size)

 

IN comm коммуникатор
OUT size количество процессов в группе коммуникатора comm

Функция в переменной size показывает число процессов, включаемых в коммуникатор. Для MPI_COMM_WORLD она показывает общее число процессов программы.

int MPI_Comm_rank (MPI_Comm comm, int *rank)

 

IN comm коммуникатор (handle)
OUT rank номер вызвавшего процесса в группе коммуникатора comm

 

Функция в переменной rank показывает ранг процесса, который его вызывает, в диапазоне 0,.., size-1, где size это величина, возвращаемая MPI_COMM_SIZE.

 

Пример использования функций С интерфейса:

#include<mpi.h>

#include<stdio.h>

void main(int argc, char *argv[] ){

int rank, size;

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

printf("rank=%d\n",rank);

MPI_Comm_size(MPI_COMM_WORLD, &size);

printf("size=%d\n",size);

MPI_Finalize();

}

Типы данных MPI

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

 

При выполнении передачи данных между процессами определяется буфер передачи данных и буфер приема данных. В операциях обмена указывается количество передаваемых/принимаемых данных в единицах данных и тип этих данных. На основании этой информации формируется буфер обмена, размер которого равен числу элементов, умноженному на размер типа данных в байтах. Если в принимающем процессе определить другой тип, что произойдет? Данные будут получены при достаточном размере приемного буфера, но получить правильное значение полученных данных будет проблематично.

При выполнении операций обмена типы данных типы переданных и полученных данных должны совпадать.

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.