Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методическое пособие - MPI.docx
Скачиваний:
21
Добавлен:
04.09.2019
Размер:
2.42 Mб
Скачать

Коллективные коммуникации в 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 находится в приложении А.