Передача и прием сообщений процессами - это базовый коммуникационный механизм MPI. Основными операциями парного обмена (point-to-point communication) являются операции send (послать) и receive (получить). Их использование иллюстрируется следующим примером:
#include "mpi.h"
main(argc, argv)
int argc;
char **argv;
{
char message[20];
int myrank;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
if (myrank == 0) /* code for process zero */
{
strcpy(message,"Hello, there");
MPI_Send(message, strlen(message), MPI_CHAR, 1, 99, MPI_COMM_WORLD);
}
else /* code for process one */
{
MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);
printf("received :%s:\n", message);
}
MPI_Finalize();
}
В этом примере процесс нуль (myrank = 0) посылает сообщение процессу один, используя операцию посылки MPI_SEND. Эта операция описывает буфер посылающего процесса (send buffer), из которого извлекаются посылаемые данные. В приведенном примере посылающий буфер состоит из накопителя в памяти процесса нуль, содержащего переменную message.Размещение, размер и тип буфера посылающего процесса описываются первыми тремя параметрами операции send. Посланное сообщение будет содержать 13 символов этой переменной. Операция посылки также связывает с сообщением его атрибуты. Атрибуты определяют номер процесса-получателя сообщения и содержат различную информацию, которая может быть использована операцией receive, чтобы выбрать определенное сообщение среди других. Последние три параметра операции посылки описывают атрибуты посланного сообщения.
Процесс один (myrank = 1) получает это сообщение, используя операцию приема MPI_RECV, и данные сообщения записываются в буфер процесса-получателя (receive buffer). В приведенном примере буфер получателя состоит из накопителя в памяти процесса один, содержащего строку message. Первые три параметра операции приема описывают размещение, размер и тип буфера приема. Следующие три параметра необходимы для выбора входного сообщения. Последний параметр необходим для возврата информации о только что полученном сообщении.
Далее описываются операции блокирующей (bloсking) передачи и блокирующего приема. Будут обсуждены отправка, прием, семантика блокирующего обмена, требования к соответствию типов, преобразование типов в неоднородных средах и более общие коммуникационные режимы.
Ниже рассматривается неблокирующий обмен, затем - универсальные типы данных, которые позволяют эффективно пересылать разнородные и несмежные данные. В заключение описываются вызовы функций для явной упаковки и распаковки сообщений.