Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Краткий справочник по функциям MPI (С++).doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
189 Кб
Скачать
☆

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. Данная функция, в частности, необходима для определения размера области памяти, выделяемой для хранения принимаемого сообщения.