- •Справочник по функциям mpi
- •Int mpi_Init (int *argc, char ***argv)
- •Int mpi_Finalize(void)
- •Int mpi_Comm_size(mpi_Comm comm, int *size)
- •Int mpi_Comm_rank (mpi_Comm comm, int *rank)
- •Mpi_Send
- •Int mpi_Send(void *buf, int count, mpi_Datatype datatype, int dest, int msgtag, mpi_Comm comm)
- •Int main(int argc, char **argv)
- •Int me, size;
- •Mpi_Get_count
- •Int mpi_Get_count(mpi_Status *status, mpi_Datatype datatype, int *count)
- •Mpi_Recv
- •Int mpi_Recv(void *buf, int count, mpi_Datatype datatype, int source, int msgtag, mpi_Comm comm, mpi_Status *status)
- •Mpi_Probe
- •Int mpi_Probe(int source, int msgtag, mpi_Comm comm, mpi_Status status)
- •Mpi_Isend
- •Int mpi_Isend(void *buf, int count, mpi_Datatype datatype, int dest, int msgtag, mpi_Comm comm, mpi_Request *request)
- •Mpi_Irecv
- •Int mpi_Irecv (void *buf, int count, mpi_Datatype datatype, int source, int msgtag, mpi_Comm comm, mpi_Request *request)
- •Mpi_Wait
- •Int mpi_Wait(mpi_Request *request, mpi_Status *status)
- •Mpi_Waitall
- •Int mpi_Waitall(int count, mpi_Request *requests, mpi_Status *statuses)
- •Int main(int argc, char **argv)
- •Mpi_Waitany
- •Int mpi_Waitany( int count, mpi_Request *requests, int *index, mpi_Status *status)
- •Mpi_Waitsome
- •Int mpi_Waitsome( int incount, mpi_Request *requests, int *outcount, int *indexes, mpi_Status *statuses)
- •Mpi_Test
- •Int mpi_Test(mpi_Request *request, int *flag, mpi_Status *status)
- •Mpi_Testall
- •Int mpi_Testall( int count, mpi_Request *requests, int *flag, mpi_Status *statuses)
- •Mpi_Testany
- •Int mpi_Testany(int count, mpi_Request *requests, int *index, int *flag, mpi_Status *status)
- •Mpi_Testsome
- •Int mpi_Testsome( int incount, mpi_Request *requests, int *outcount, int *indexes, mpi_Status *statuses)
- •Mpi_Iprobe
- •Int mpi_Iprobe( int source, int msgtag, mpi_Comm comm, int *flag, mpi_Status *status)
- •Mpi_Send_init
- •Int mpi_Send_init( void *buf, int count, mpi_Datatype datatype, int dest, int msgtag, mpi_Comm comm, mpi_Request *request)
- •Mpi_Recv_init
- •Int mpi_Recv_init( void *buf, int count, mpi_Datatype datatype, int source, int msgtag, mpi_Comm comm, mpi_Request *request)
- •Mpi_Startall
- •Int mpi_Startall(int count, mpi_Request *requests)
- •Mpi_Sendrecv
- •Int mpi_Sendrecv( void *sbuf, int scount, mpi_Datatype stype, int dest, int stag, void *rbuf, int rcount, mpi_Datatype rtype, int source, mpi_Datatype rtag, mpi_Comm comm, mpi_Status *status)
- •Mpi_Bcast
- •Int mpi_Bcast(void *buf, int count, mpi_Datatype datatype, int source, mpi_Comm comm)
- •Mpi_Gather
- •Int mpi_Gather( void *sbuf, int scount, mpi_Datatype stype, void *rbuf, int rcount, mpi_Datatype rtype, int dest, mpi_Comm comm)
- •Mpi_Scatter
- •Int mpi_Scatter(void *sbuf, int scount, mpi_Datatype stype, void *rbuf, int rcount, mpi_Datatype rtype, int source, mpi_Comm comm)
- •Int main(int argc, char **argv)
- •Mpi_Allreduce
- •Int mpi_Allreduce( void *sbuf, void *rbuf, int count, mpi_Datatype datatype, mpi_Op op, mpi_Comm comm)
- •Mpi_Reduce
- •Int mpi_Reduce( void *sbuf, void *rbuf, int count, mpi_Datatype datatype, mpi_Op op, int root, mpi_Comm comm)
- •Mpi_Barrier
- •Int mpi_Barrier(mpi_Comm comm)
- •Mpi_Comm_split
- •Int mpi_Comm_split(mpi_Comm comm, int color, int key, mpi_Comm *newcomm)
- •Mpi_Comm_free
- •Int mpi_Comm_free(mpi_Comm comm)
- •Список соответствия типов данных для языка с и mpi
Mpi_Recv
Int mpi_Recv(void *buf, int count, mpi_Datatype datatype, int source, int msgtag, mpi_Comm comm, mpi_Status *status)
out buf — адрес начала буфера для приема сообщения;
count — максимальное число элементов в принимаемом сообщении;
datatype — тип элементов принимаемого сообщения;
source — номер процесса-отправителя;
msgtag — идентификатор принимаемого сообщения;
comm — идентификатор коммуникатора;
out status — параметры принятого сообщения.
Прием сообщения с идентификатором msgtag от процесса source с блокировкой. Число элементов в принимаемом сообщении не должно превосходить значения count. Если число принятых элементов меньше значения count, то гарантируется, что в буфере buf изменятся только элементы, соответствующие элементам принятого сообщения. Если нужно узнать точное число элементов в принимаемом сообщении, то можно воспользоваться функцией MPI_Get_count. Блокировка гарантирует, что после возврата из функции все элементы сообщения уже будут приняты и расположены в буфере buf.
Ниже приведен пример программы, в которой нулевой процесс посылает сообщение процессу с номером один и ждет от него ответа. Если программа будет запущена с большим числом процессов, то реально выполнять пересылки все равно станут только нулевой и первый процессы. Остальные процессы после их порождения функцией MPI_Init сразу завершатся, выполнив функцию МРI_Finalize.
#include "mpi.h"
#include <stdio.h>
Int main(int argc, char **argv)
{
int numtasks, rank, dest, src, re, tag=l;
char inmsg, outmsg='x';
MPI_Status Stat;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numtasks); MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0) {
dest = 1;
src = 1;
rc = MPI_Send(&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);
rc = MPI_Recv(&inmsg, 1, MPI_CHAR, src, tag, MPI_COMM_WORLD, &Stat);
}
else
if (rank == 1) {
dest = 0;
src = 0;
rc = MPI_Recv(&inmsg, 1, MPI_CHAR, src, tag, MPI_COMM_WORLD, &Stat);
rc = MPI_Send(&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);
}
MPI_Finalize();
}
В следующем примере каждый процесс с четным номером посылает сообщение своему соседу с номером на единицу большим. Дополнительно поставлена проверка для процесса с максимальным номером, чтобы он не послал сообщение несуществующему процессу. Показана только схема программы.
#include "mpi.h"
#include <stdio.h> main(int argc, char**argv) {
Int me, size;
int SOME_TAG=0;
MPI_Status status;
MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &me); MPI_Comm_size (MPI_COMM_WORLD, &size);
if ((me % 2) == 0) {
if ((me+1) < size) /* посылают все процессы, кроме последнего */
MPI_Send (..., me+1, SOME_TAG, MPI_COMM_WORLD);
}
else
MPI_Recv (..., me-1, SOME_TAG, MPI_COMM_WORLD, &status);
MPI_Finalize();
}
Mpi_Get_count
Int mpi_Get_count(mpi_Status *status, mpi_Datatype datatype, int *count)
status — параметры принятого сообщения;
datatype — тип элементов принятого сообщения;
out count — число элементов сообщения.
По значению параметра status данная функция определяет число уже принятых (после обращения к MPI_Recv) или принимаемых (после обращения к МРI_Prоbе или MPI_Iprobe) элементов сообщения типа datatype. Данная функция, в частности, необходима для определения размера области памяти, выделяемой для хранения принимаемого сообщения.
