Тип данных MPI_Status - это структура, содержащая следующие поля: MPI_SOURCE (источник), MPI_TAG (метка), MPI_ERROR (ошибка).
Пример вызова:
… MPI_Status status; int source; … MPI_Recv(buf,N,MPI_INT,1,10,MPI_COMM_WORLD,&status); source = status.MPI_SOURCE; … |
Совмещенные прием/передача сообщений
int MPI_Sendrecv(void *sbuf, int scount, MPI_Datatype stype, int dest, int stag, void *rbuf, int rcount, MPI_Datatype rtype, int source, MPI_Dtatype rtag, MPI_Comm comm, MPI_Status *status)
Данная операция объединяет в едином запросе посылку и прием сообщений. Принимающий и отправляющий процессы могут являться одним и тем же процессом. Сообщение, отправленное операцией MPI_Sendrecv, может быть принято обычным образом, и точно также операция MPI_Sendrecv может принять сообщение, отправленное обычной операцией MPI_Send. Буфера приема и посылки обязательно должны быть различными.
· sbuf - адрес начала буфера посылки сообщения
· scount - число передаваемых элементов в сообщении
· stype - тип передаваемых элементов
· dest - номер процесса-получателя
· stag - метка посылаемого сообщения
· выходной параметр rbuf - адрес начала буфера приема сообщения
· rcount - число принимаемых элементов сообщения
· rtype - тип принимаемых элементов
· source - номер процесса-отправителя
· rtag - метка принимаемого сообщения
· comm - идентификатор группы
· выходной параметр status - параметры принятого сообщения
Пример вызова:
… #define N 10 … int rank,buf[N], buf1[N]; MPI_Status status; … MPI_Sendrecv(buf,N,MPI_INT,1,10,buf1,N,MPI_INT,0,10,MPI_COMM_WORLD,&status); … |
Проверка приемного буфера
int MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status status)
Функция возвращает управление, когда в системном буфере процесса появляется сообшение с указанными параметрами. Если использовать аргументы-джокеры ("любой источник", "любая метка"), как в примере ниже, то с помощью этой функции можно проверять наличие сообщений в системном буфере.
· source номер процесса-отправителя
· tag метка сообщения
· comm - идентификатор группы
· выходной параметр status - параметры принятого сообщения
Пример вызова:
… MPI_Status status; … MPI_Probe(MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status); … |
Определение размера сообщения
int MPI_Get_count(MPI_Status status, MPI_Datatype datatype, int *count)
Через параметр count возвращает длину сообщения. Обычно вызывается после MPI_Probe.
· status информация о сообщении
· datatype тип принимаемых элементов
· выходной параметр count - число элементов сообщения
Пример вызова:
… MPI_Status status; int count; … MPI_Get_count(&status,MPI_INT,&count); … |
Рассылка данных
int MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int source, MPI_Comm comm)
Эта функция должна вызываться одновременно всеми процессами приложения. Рассылка сообщения от процесса source всем процессам, включая рассылающий процесс. При возврате из процедуры содержимое буфера buf процесса source будет скопировано в локальный буфер процесса. Значения параметров count, datatype и source должны быть одинаковыми у всех процессов.
· выходной параметр buf - адрес начала буфера посылки сообщения
· count - число передаваемых элементов в сообщении
· datatype - тип передаваемых элементов
· source - номер рассылающего процесса
· comm - идентификатор группы
Пример вызова:
… #define N 10 … int buf[N]; … MPI_Bcast(buf,N,MPI_INT,0,MPI_COMM_WORLD); … |
Распределение данных
int MPI_Scatter(void *sbuf, int scount, MPI_Datatype stype, void *rbuf, int rcount, MPI_Datatype rtype, int dest, MPI_Comm comm)
Части передающего буфера из задачи root распределяются по приемным буферам всех задач. Эта функция должна вызываться одновременно всеми процессами приложения.
· sbuf - адрес начала буфера посылки
· scount - число элементов в посылаемом сообщении; этот параметр должен быть равен размеру буфера, деленному на число процессов
· stype - тип элементов отсылаемого сообщения
· выходной параметр rbuf - адрес начала буфера сборки данных
· rcount - число элементов в принимаемом сообщении
· rtype - тип элементов принимаемого сообщения
· dest - номер процесса, на котором происходит сборка данных
· comm - идентификатор группы
Пример вызова:
… #define N 10 #define PROCS 5 … int buf[N],buf1[N/PROCS],size; … MPI_Scatter(buf,N/PROCS,MPI_INT, buf1,N/PROCS,MPI_INT,0,MPI_COMM_WORLD); … |