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

Mpi_Probe

Int mpi_Probe(int source, int msgtag, mpi_Comm comm, mpi_Status status)

  • source — номер процесса-отправителя или MPIANYSOURCE;

  • msgtag — идентификатор ожидаемого сообщения или MPI_ANY_TAG;

  • comm — идентификатор коммуникатора;

  • out status — параметры найденного подходящего сообщения.

Получение информации о структуре ожидаемого сообщения с блокировкой. Возврата из функции не произойдет до тех пор, пока сообщение с подходящим идентификатором и номером процесса отправителя не будет доступно для получения. Атрибуты доступного сообщения можно определить обычным образом с помощью параметра status. Следует особо обратить внимание на то, что функция определяет только факт прихода сообщения, но реально его не принимает.

Mpi_Isend

Int mpi_Isend(void *buf, int count, mpi_Datatype datatype, int dest, int msgtag, mpi_Comm comm, mpi_Request *request)

  • buf — адрес начала буфера c посылаемым сообщением;

  • count — число передаваемых элементов в сообщении;

  • datatype — тип передаваемых элементов;

  • dest — номер процесса-получателя;

  • msgtag — идентификатор сообщения;

  • comm — идентификатор коммуникатора,

  • out request — идентификатор асинхронной операции передачи.

Mpi_Irecv

Int mpi_Irecv (void *buf, int count, mpi_Datatype datatype, int source, int msgtag, mpi_Comm comm, mpi_Request *request)

  • OUT buf — адрес начала буфера для приема сообщения.

  • count — максимальное число элементов в принимаемом сообщении;

  • datatype — тип элементов принимаемого сообщения;

  • source — номер процесса-отправителя;

  • msgtag — идентификатор принимаемого сообщения;

  • comm — идентификатор коммуникатора;

  • out request — идентификатор операции асинхронного приема.

Mpi_Wait

Int mpi_Wait(mpi_Request *request, mpi_Status *status)

Ожидание завершения асинхронной операции, ассоциированной с идентификатором request и запущенной вызовом процедуры MPI_Isend или MPI_Irecv. Пока асинхронная операция не будет завершена, процесс, выполнивший процедуру MPI_Wait, будет заблокирован. Для операции не блокирующего приема определяется параметр status. После выполнения

процедуры идентификатор не блокирующей операции request устанавливается в значение MPI_REQUEST_NULL.

Mpi_Waitall

Int mpi_Waitall(int count, mpi_Request *requests, mpi_Status *statuses)

  • count — число идентификаторов асинхронных операций;

  • requests — идентификаторы операций асинхронного приема или передачи;

  • out statuses — параметры сообщений.

Выполнение процесса блокируется до тех пор, пока все операции обмена, ассоциированные с указанными идентификаторами, не будут завершены. Если во время одной или нескольких операций обмена возникли ошибки, то поле ошибки в элементах массива statuses будет установлено в соответствующее значение.

Ниже показан пример программы, в которой все процессы обмениваются сообщениями с ближайшими соседями в соответствии с топологией кольца.

#include "mpi.h"

#include <stdio.h>

Int main(int argc, char **argv)

{

int numtasks, rank, next, prev, buf[2], tagl=l, tag2=2;

MPI_Request reqs[4];

MPI_Status stats[4];

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD, &numtasks);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

prev = rank - 1;

next = rank + 1;

if (rank == 0) prev = numtasks - 1;

if (rank == (numtasks - 1)) next = 0;

MPI_Irecv(&buf[0], 1, MPI_INT, prev, tagl, MPI_COMM_WORLD, &reqs[0]);

MPI_Irecv(&buf[1], 1, MPI_INT, next, tag2, MPI_COMM_WORLD, &reqs[1]);

MPI_Isend(&rank, 1, MPI_INT, prev, tag2, MPI_COMM_WORLD, &reqs[2]);

MPI_Isend(&rank, 1, MPI_INT, next, tagl, MPI_COMM_WORLD, &reqs[3]);

MPI_Waitall(4, reqs, stats); MPI_Finalize(); }