Сборка распределенных данных

int MPI_Gather( void *sbuf, int scount, MPI_Datatype stype, void *rbuf, int rcount, MPI_Datatype rtype, int dest, MPI_Comm comm)

int MPI_Allgather( void *sbuf, int scount, MPI_Datatype stype, void *rbuf, int rcount, MPI_Datatype rtype, int dest, MPI_Comm comm)

int MPI_Allgatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, MPI_Comm comm)

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

Для функции allgather и allgatherv все процессы собирают один вектор. Пусть у нас имеется вектор размером 8, который разделён между тремя процессами на 3 части размерами 3, 3 и 2 соответственно. Тогда массивы длин частей для векторного варианта функции примут следующий вид: recvcounts [3] = {3, 3, 2}, displs [3] = {0, 3, 6}.

· sbuf - адрес начала буфера посылки

· scount - число элементов в посылаемом сообщении; этот параметр должен быть равен размеру буфера, деленному на число процессов.

· stype - тип элементов отсылаемого сообщения

· выходной параметр rbuf - адрес начала буфера сборки данных

· rcount - число элементов в принимаемом сообщении (этот параметр должен быть равным scount)

· rtype - тип элементов принимаемого сообщения

· dest - номер процесса, на котором происходит сборка данных

· recvcounts массив, указывающий количество принимаемых элементов от процессов

· displs целочисленный массив смещений пакетов данных друг относительно друга

· comm - идентификатор группы

Пример вызова:

… #define N 10 #define PROCS 5 … int buf[N],buf1[N/PROCS],size; … MPI_Gather(buf1,N/PROCS,MPI_INT, buf,N/PROCS,MPI_INT,0,MPI_COMM_WORLD); …

Синхронизация процессов

int MPI_Barrier( MPI_Comm comm)

Блокирует работу процессов, вызвавших данную процедуру, до тех пор, пока все оставшиеся процессы группы comm также не выполнят эту процедуру.

· comm - идентификатор группы

Пример вызова:

… MPI_Barrier( MPI_COMM_WORLD); …

Поэлементные операции

int MPI_Reduce (void *sbuf, void *rbuf, int count, MPI_Datatype stype; MPI_Op op, int dest, MPI_Comm comm)

int MPI_Allreduce (void *sbuf, void *rbuf, int count, MPI_Datatype stype; MPI_Op op, MPI_Comm comm)

Эта функция должна вызываться одновременно всеми процессами приложения. Все процессы подают на вход функции массивы buf одинаковой размерности count. Над этими массивами поэлементно выполняется операция op. Массив - результат помещается в процесс dest. Для операция allreduce массив размещается во всех процессах.

· sbuf - адрес начала буфера посылки

· rbuf - адрес начала буфера приема

· count - число элементов в посылаемом/принимаемом сообщении

· stype - тип элементов отсылаемого сообщения

· op - операция, выполняемая над элементами буфера

· dest - номер процесса, на котором происходит сборка данных

· comm - идентификатор группы

Виды поэлементных операций:

  • MPI_MAX Выбор максимального элемента
  • MPI_MIN Выбор минимального элемента
  • MPI_SUM Суммирование
  • MPI_PROD Вычисление произведения

Пример вызова:

… #define N 10 int v[N],u[N]; … MPI_Reduce(v,u,N,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD); …

Литература

1. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. – СПб:. БХВ-Петербург, 2002, – 608с. (2-е издание 2004)

2. Шпаковский Г.И., Серикова Н.В. Программирование для многопроцессорных систем в стандарте MPI: Пособие. – Мн.: БГУ, 2002. -323 с.

3. А.С.Антонов. Параллельное программирование с использованием технологии MPI: Учебное пособие. – М.: Изд-во МГУ, 2004.-71 с.

Наши рекомендации