Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб-02.doc
Скачиваний:
3
Добавлен:
14.08.2019
Размер:
88.58 Кб
Скачать

Совмещенные прием и передача сообщений

int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status)

Входные параметры

       Sendbuf - Адрес отправляемых данных

       sendcount - Число отправляемых переменных

       sendtype - Тип отправляемых данных

       dest   - ранг назначения

       sendtag - тэг отправляемого сообщения

       recvcount - Число принимаемых данных.

       Recvtype - Тип принимаемых данных

       source - от кого принимается сообщение

       recvtag - Тэг принимаемого сообщения

       comm - Коммуникатор

Выходные параметры

       Recvbuf - адрес принимаемых данных

       status - Статус према сообщения

Буфера sendbuf и recvbuf не должны пересекаться.

Если необходимо обменяться данными, то следует использовать функциюMPI_Sendrecv_replace

int MPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, int dest, int sendtag, int source, int recvtag, MPI_Comm comm, MPI_Status *status)

 Входные параметры

       count  - Число передаваемых данных

       datatype - Тип передаваемых данных

       dest - ранг получателя

       sendtag - тэг отправляемого сообщения

       source - ранг отправителя

       recvtag - тэг принимаемого сообщения

       comm - коммуникатор, в котором происходит передача сообщения.

Выходные параметры

       buf  - initial address of send and receive buffer (choice)

       status - status object (Status)

Пример

#include <mpi.h> #include <stdio.h> int main(int argc, char** argv) {         int rank,size;         int data;         MPI_Status st;         MPI_Init(&argc, &argv);         MPI_Comm_size(MPI_COMM_WORLD, &size);         if (size!=2)         {                 printf("This example should be run on 2 processors, now exiting\n");                 MPI_Finalize();                 return 0;         }         else         {                 MPI_Comm_rank(MPI_COMM_WORLD,&rank);                 data=100*rank;                 printf("I am %d of %d. Before %d\n",rank,size,data);                 MPI_Sendrecv_replace(&data, 1, MPI_INT, !rank,0,!rank,0, MPI_COMM_WORLD,&st);                 printf("I am %d of %d. After %d\n",rank,size,data);                 MPI_Finalize();                 return 0;         } }

Двухточечный буферизованный обмен

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

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

Буферизованный обмен рекомендуется использовать в тех ситуациях, когда программисту требуется больший контроль над распределением памяти.

Задания для выполнения

Задание 1

В исходном тексте программы на языке C пропущены вызовы процедур подключения к MPI, определения количества процессов и ранга процесса. Добавить эти вызовы,откомпилировать и запустить программу.

#include "mpi.h" #include <stdio.h> int main(int argc,char *argv[]) {  int myid, numprocs;  ....  fprintf(stdout,"Process %d of %d\n", myid, numprocs);  MPI_Finalize();  return 0; }

Задание 2

В исходном тексте программы на языке C пропущены вызовы процедур стандартногоблокирующего двухточечного обмена. Предполагается, что при запуске двухпроцессов один из них отправляет сообщение другому. Добавить эти вызовы,откомпилировать и запустить программу.

#include "mpi.h" #include <stdio.h> int main(int argc,char *argv[]) {  int myid, numprocs;  char message[20];  int myrank;  MPI_Status status;  int TAG = 0;  MPI_Init(&argc, &argv);  MPI_Comm_rank(MPI_COMM_WORLD, &myrank);  if (myrank == 0) {  strcpy(message, "Hi, Second Processor!");  MPI_Send(...); } else {  MPI_Recv(...);  printf("received: %s\n", message); }  MPI_Finalize();  return 0; }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]