Передача сообщений
Для передачи сообщения процесс- отправитель должен выполнить функцию:
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_CHAR | signed char |
MPI_DOUBLE | double |
MPI_FLOAT | float |
MPI_INT | int |
MPI_LONG | long |
MPI_LONG_DOUBLE | long double |
MPI_PACKED | |
MPI_SHORT | short |
MPI_UNSIGNED_CHAR | unsigned char |
MPI_UNSIGNED | unsigned int |
MPI_UNSIGNED_LONG | unsigned long |
MPI_UNSIGNED_SHORT | unsigned short |
Следует отметить:
· отправляемое сообщение определяется через указание блока памяти (буфера), в котором это сообщение располагается. Используемая для указания буфера триада (buf, count, type) входит в состав параметров практически всех функций передачи данных;
· процессы, между которыми выполняется передача данных, в обязательном порядке должны принадлежать коммуникатору, указываемому в функции MPI_Send;
· параметр tag используется только при необходимости различения передаваемых сообщений, в противном случае в качестве значения параметра может быть использовано произвольное положительное целое число2) (см. также описание функции MPI_Recv).
Сразу же после завершения функции MPI_Send процесс-отправитель может начать повторно использовать буфер памяти, в котором располагалось отправляемое сообщение. Также следует понимать, что в момент завершения функции MPI_Send состояние самого пересылаемого сообщения может быть совершенно различным: сообщение может располагаться в процессе-отправителе, может находиться в состоянии передачи, может храниться в процессе-получателе или же может быть принято процессом-получателем при помощи функции MPI_Recv. Тем самым, завершение функции MPI_Send означает лишь, что операция передачи начала выполняться и пересылка сообщения рано или поздно будет выполнена.
Пример использования функции будет представлен после описания функции MPI_Recv.