MPI: назначение и организация пакета MPI, принципы построения программ для MPI. Классификация функций MPI. Функции MPI_BCAST, MPI_BARRIER, MPI_GATHER, MPI_SCATTER.
Ранее было установлено: при создании кластера используется стандартные описания средства, сетевые решения и популярные арифметические системы. Таким образом, возникает вопрос о том, что же превращает обычную ЛС в кластер. Этот эффект достигается благодаря использованию ПС, которое осуществляет распространение процессов и подпроцессов между вычислительными узлами, а такие обмены данными и сообщениям между процессами. Кроме того, подобные программы должны обеспечивать пользователя независимостью решения его задач. Относительно архитектурных особенностей кластерной системы, особенностей аппаратного обеспечения, особенностей ОС, количества имеющихся реальных процессорных элементов. В качестве такой программы может использоваться реализация MPI:
MPI (message passing interface)
В настоящее время MPI реализуется стандартами: 1) MPI 1.0 2) MPI 2.0
Эти стандарты реализуются несколькими программными средствами: 1) MPIСМ 2)LAM 3)MPVM
Общая структура взаимодействия программных и аппаратных средств:
Пар приложения
Стандарт MPI
Средства ОС, сетевое ПО, сетевая файловая система
Аппаратное обеспечение
MPI фактически представляет собой технологию программирования, которая предоставляет пользователю набор функция для разработки параллельных программ.
В состав пакета, реализующего MPI, в min варианте входят: 1)библиотека программирования 2)загрузка приложений.
В соответствии с технологией MPI, параллельное приложение состоит из независимых ветвей или процессов.
Сообщения имеют атрибуты. Для хранения этих атрибутов создается структура MPI_states имеющая след-е ос-е поля:
MPI_sourse – код процесса – отправителя
MPI_tag _№ сообщения
MPI_error – код ошибки
Основные функции MPI все идентификаторы, объявленные в самом начале MPI, начинаются с префикса MPI_. Таким образом, чтобы в прикладных программах не возникли дополнительные ошибки, пользовательские идентификаторы не должны начинаться с этого префикса.
Об успешности выполнения той или иной функции MPI можно судить по возвращаемому ей цело численному значению. В случае успеха все функции MPI возвращают код, который мнемонически обозначается как MPI_SUCCESS. Во всех остальных случаях – код ошибки.
Функции MPI можно разделить на группы в соответствии со следующими критериями: 1)критерий блокирования 2)критерий локальности 3)критерий коллективности
В соответствии с 1) функции делятся на блокирующие и не блокирующие. Блокирующая функция возвращает управление только после полного завершения их выполнения. Не блокирующая функция возвращает управление немедленно после своего вызова, выполняется в фоновом режиме, а за их завершением необходимо дополнительно проследить
Критерий 2)подразделяет ф-ю на те, которые позволяют рассылке данных др-м ветвям и те, которые этого не делают.
В соответствии с 3) коллективными считаются функции, которые выполняются всеми процессами, подключаемыми к заданной области связи с одним и теми же номером коммуникатора заданного в качестве аргумента функции:
Int MPI_init (int arge,char*argv);
Функция является первой функцией, с которой начинается работа параллельной программы и которая выполняется инициализацию рабочей части приложения. Инициализация MPI производится только один раз в течении выполнения программы. Попытка повторной инициализации вызывает ошибку. Обращение к функции MPI возможно только после выполнения инициализации.
Функции: int MPI_Barrier (MPI_Comm comm);
Функция реализует механизм барьерной синхронизации, все процессы, выполняющие данную функцию, будут его задерживать до тех пор, пока MPI_Barrier не будет выполнена всеми вызывающими ее процессами.
Int MPI_Bcast (void*buf,
Int count,
MPI_Datatype datatype,
Int source;
MPI_Comm comm.);
Buf-адрес канала буфера приема сообщения
Count – число переданных элементов сообщения
Datatype – тип элементов сообщения
Source – номер передающего процесса
Comm – идентификатор группы
Разрешается передача сообщения самому себе. Сообщение может иметь нулевую длину. Элементы сообщения могут иметь нулевую длину. Элементы сообщения располагаются друг за другом.
Получи ли адресаты это сообщение - неизвестно, но параметры, переданные заданной функцией, уже можно использовать, и это не будет некорректно. Значение параметров count, datatype, source должны быть одинаковыми у всех процессов.
Int MPI_Scatter (void*sbuf,
Int scount,
MPI_datatypes datatype,
Void*zbuf,
Int zcount,
MPI_datatype *datatype,
Int sourse,
MPI_Comm comm);
Sbuf –адрес начала буфера посылки сообщения
scount – число передаваемых элементов сообщения
sdatatypes – тип элементов сообщения
Void*zbuf - адрес канала буфера приема сообщения
Zcount - число переданных элементов сообщения
zdatatype - тип принятых элементов сообщения
sourse – номер посылаемого процесса
comm – идентификатор проги
Массив sbuf делится на n равные части, состоящие из элементов типа zdatatype, в каждую из которых входит scount элементов. Каждое i - ая порция посылается i_му процессу. Для процесса source должны быть определены все параметры. Для всех остальных процессов достаточно параметров zbuf, zcount, zdatatype, source и comm. Параметры source и comm. Должны быть одинаковыми для всех участвующих процессов.
Int MPI_Gather (void*sbuf,
int scount,
MPI _datatype sdatatype,
MPI _datatype zdatatype,
int dest,
MPI_comm comm);
Dest – номер собирающего процесса.
Каждый процесс, вызывающий функцию Gather, включая процесс dest, посылает содержимое своего буфера sbuf процессу dest. Сбор данных осуществляется в буфере rbufx собираемым процессом dest. Данные располагаются в порядке возрастания номеров процессов. Параметр rbuf имеет значения только у собирающего процесса. У остальных игнорируется, но значения параметров scount, rcount,sdatatype, rdatatype, а так же параметры dest должны быть идентичными у всех процессов группы.