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