Здавалка
Главная | Обратная связь

Двухточечные обмены



Передача и прием сообщений процессами являются основным механизмом MPI. Основные операции двухточечных обменов это - send и receive. В MPI реализовано два типа обменов, блокирующие обмены и не блокирующие обмены, в каждом из двух типов может использоваться 4 режима связи: стандартный, буферизующий(B), синхронный (S), по готовности (R).

Блокирующие обмены.

MPI_Send()

MPI_Bsend() MPI_Recv()

MPI_Ssend()

MPI_Rsend()

 

Для всех режимов передачи используется одна функция приема MPI_Recv.

 

Функция передачи – стандартный режим:

int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)

Функция приема:

int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)

OUT buf адрес буфера передачи/приема
IN count количество элементов в буфере передачи/приема
IN datatype тип передаваемых/принимаемых данных
IN dest/source ранг (номер процесса) источника (куда/от кого)
IN tag тэг сообщения (integer)
IN comm коммуникатор
OUT status объект статуса (Status)

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

Tag –этоцелое число, которое являетсяотличительнымпризнаком сообщения. Если на одном процессе несколько операций передачи сообщения (как у нас, на 0-вом процессе), то они не могут иметь одинаковый tag.


///////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Send процесс 0 -> Recv остальные процессы

// mpirun –np <кол-во_процессов> <имя_исполняемого_файла>

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <mpi.h>

#include <iostream>

using namespace std;

 

void main( int argc, char *argv[] )

{

int proc, size;

MPI_Status stat[2];

 

MPI_Init( &argc, &argv);

MPI_Comm_rank( MPI_COMM_WORLD, &proc);

MPI_Comm_size( MPI_COMM_WORLD, &size);

 

double b[10];

 

if (proc == 0) /* код для процесса с номером 0*/

{

double a[10];

for(int i=0; i<10; i++)

a[i]=(double)proc;

for(i=1; i<size; i++){ /*передача массива */

MPI_Send(&a[0], 10, MPI_DOUBLE, i, 100, MPI_COMM_WORLD);

}

}

else /* код для остальных процессов */

{ /* прием массива на остальных процессах */

MPI_Recv(&b[0], 10, MPI_DOUBLE, 0, 100, MPI_COMM_WORLD, &stat[0]);

 

for(i=0; i<10; i++)

cout<<b[i]<<”\t|;

}

MPI_Finalize();

 

}








©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.