Теория и практика параллельных вычислений

         

Передача сообщений


Для передачи сообщения процесс- отправитель должен выполнить функцию:

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

где

  • buf — адрес буфера памяти, в котором располагаются данные отправляемого сообщения;
  • count — количество элементов данных в сообщении;
  • type — тип элементов данных пересылаемого сообщения;
  • dest — ранг процесса, которому отправляется сообщение;
  • tag — значение-тег, используемое для идентификации сообщения;
  • comm — коммуникатор, в рамках которого выполняется передача данных.

Для указания типа пересылаемых данных в MPI имеется ряд базовых типов, полный список которых приведен в табл. 5.1.

Таблица 5.1. Базовые (пpедопpеделенные) типы данных MPI для алгоритмического языка C

Тип данных MPIТип данных C
MPI_BYTE
MPI_CHARsigned char
MPI_DOUBLEdouble
MPI_FLOATfloat
MPI_INTint
MPI_LONGlong
MPI_LONG_DOUBLElong double
MPI_PACKED
MPI_SHORTshort
MPI_UNSIGNED_CHARunsigned char
MPI_UNSIGNEDunsigned int
MPI_UNSIGNED_LONGunsigned long
MPI_UNSIGNED_SHORTunsigned short

Следует отметить:

  • отправляемое сообщение определяется через указание блока памяти (буфера), в котором это сообщение располагается. Используемая для указания буфера триада (buf, count, type) входит в состав параметров практически всех функций передачи данных;
  • процессы, между которыми выполняется передача данных, в обязательном порядке должны принадлежать коммуникатору, указываемому в функции MPI_Send;
  • параметр tag используется только при необходимости различения передаваемых сообщений, в противном случае в качестве значения параметра может быть использовано произвольное положительное целое число2) (см. также описание функции MPI_Recv).

Сразу же после завершения функции MPI_Send процесс-отправитель может начать повторно использовать буфер памяти, в котором располагалось отправляемое сообщение. Также следует понимать, что в момент завершения функции MPI_Send состояние самого пересылаемого сообщения может быть совершенно различным: сообщение может располагаться в процессе-отправителе, может находиться в состоянии передачи, может храниться в процессе-получателе или же может быть принято процессом-получателем при помощи функции MPI_Recv. Тем самым, завершение функции MPI_Send означает лишь, что операция передачи начала выполняться и пересылка сообщения рано или поздно будет выполнена.

Пример использования функции будет представлен после описания функции MPI_Recv.



Содержание раздела