Сборка распределенных данных
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 с.