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