Коллективные коммуникации в MPI


 

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

· Барьерная синхронизация процессов коммуникатора

 

· Рассылка одних и тех же данных от одного процесса всем (broadcast)

 

· Сбор данных одним процессом от остальных (gather)

 

· Разделение данных одного процесса между всеми процессами (scatter)

 

· Вариация сбора данных, при которой все процессы получают результат (allgather)

 

· Обмен данными "каждый с каждым" (alltoall)

 

· Редукционные операции

 

· Комбинированные операции редукции и разделения

 

· Частичные редукционные операции

 

Барьерная синхронизация процессов коммуникатора int MPI_Barrier( MPI_Comm comm ) – после ее вызова вызвавший процесс блокируется до тех пор, пока все процессы коммуникатора не вызовут эту функцию.

int MPI_Bcast( void *buffer, int count, MPI_Datatype datatype, int root,

MPI_Comm comm ) – рассылает данные, находящиеся по адресу buffer процесса с рангом root всем процессам коммуникатора comm.

int MPI_Gather ( void *sendbuf, int sendcnt, MPI_Datatype sendtype,

void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm )

Данные из буферов sendbuf в количестве sendcount всех процессов в порядке возрастания рангов копируются в буфер recvbuf процесса с рангом root.

int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,

void *recvbuf, int recvcnt, MPI_Datatype recvtype, int root, MPI_Comm comm) – Функция MPI_Scatter выполняет действия, обратные функциям MPI_Gather, а именно, рассылает данные, находящиеся по адресу sendbuf процесса с рангом root, всем процессам коммуникатора.

int MPI_Allgather ( void *sendbuf, int sendcount, MPI_Datatype sendtype,

void *recvbuf, int recvcount, MPI_Datatype recvtype,

MPI_Comm comm ) - Отличие этой функции от MPI_Gather в том, что итоговый массив получают все процессы коммуникатора.

int MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype,

void *recvbuf, int recvcount, MPI_Datatype recvtype,

MPI_Comm comm ) - все процессы обмениваются данными со всеми.

 

Действия перечисленных функций коллективных коммуникаций показаны на рисунке 2.

 

Иногда бывает необходимо вычислить значение какой-то величины на основании частичных ее значений, вычисленных в нескольких процессах программы. Например, каждый процесс может вычислить частичную сумму, и на основании этих значений необходимо вычислить полную сумму. Или необходимо выбрать минимум из локальных минимумов и т. д.

 

В MPI есть следующие встроенные редукционные операции

· MPI_MAX - максимум

· MPI_MIN - минимум

· MPI_SUM - сумма

· MPI_PROD - произведение

· MPI_LAND - логическое «и»

· MPI_BAND - побитовое «и»

· MPI_LOR - логическое «или»

· MPI_BOR - побитовое «или»

· MPI_LXOR - логическое «исключающее или»

· MPI_BXOR - побитовое «исключающее или»

· MPI_MAXLOC - максимум и его расположение

· MPI_MINLOC - минимум и его расположение

 

int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,

MPI_Op op, int root, MPI_Comm comm)

 

 

 

Рис. 2 – функции коллективных коммуникаций в MPI

Параметры:

sendbuf - адрес, по которому находятся отправляемые данные

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

datatype - тип данных

op - редукционная операция

root - ранг процесса, который получит итоговое значение (корневого процесса)

comm - коммуникатор

recvbuf - адрес, по которому будет записано итоговое значение (запись произойдет только в процессе с рангом root).

Более подробное описание основных функций MPI находится в приложении А.



Дата добавления: 2016-05-31; просмотров: 1988;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.