logo
Лекции - Чернышева

Дополнительные функции

1) int MPI_Bsend (void* , int, MPI_Datatype, int, int, Mpi_Comm);

Функция MPI_Bsend помещает данные в буфер.

2) int MPI_Ssend (void* , int, MPI_Datatype, int, int, Mpi_Comm);

Возврат из функции MPI_Ssend произойдет только после реальной передачи данных..

3) int MPI_Rsend (void* , int, MPI_Datatype, int, int,Mpi_Comm);

Запуск функции MPI_Rsend возможен только при готовности к приему процесса получателя. Если процесс-получатель не готов к передаче, производится аварийное завершение и результат функции будет не определен.

Функции возвращают MPI_Success в случае удачи или код ошибки. Ошибка возможна при недостатке места в буфере.

Пример:

Пусть нулевой процесс пересылает всем остальным процессам:

  1. некоторое число;

  2. некоторый массив;

#include <iostream.h>

#include <mpi.h>

#define msgtag 77

void main (int argc, char**argv) {

MPI_Init (&argc, &argv);

Int rank, size;

MPI_Comm_size (MPI_COMM_WORLD, &size);

MPI_Comm_rank (MPI_COMM_WORLD, &rank);

1: MPI_Status status;

if (!rank) {

int m=5;

for (int i=0; i<size-1; i++)

MPI_Send(&m, 1, MPI_INT, i+1, msgtag, MPI_COMM_WORLD);

}

else {

int l=0;

MPI_Recv (&l, 1, MPI_INT, 0, msgtag, MPI_COMM_WORLD, &status);

}

MPI_Finalize();

}

Результат при size=3: rank=1 l=5

rank=2 l=5

2: const int n=10;

if (!rank) {

int m[n]={1, 2, 3, 4};

for (int i=0; i<size-1; i++)

MPI_Send(m, n, MPI_INT, i+1, msgtag, MPI_COMM_WORLD);

}

else {

int l[n];

MPI_Recv (l, n, MPI_INT, 0, msgtag, MPI_COMM_WORLD, &status);

}

MPI_Finalize();

}