ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
          
        
        
          
            54
          
        
        
          Прием сообщения с идентификатором
        
        
          
            msgtag
          
        
        
          от процесса
        
        
          
            source
          
        
        
          с блокиров-
        
        
          кой. Число элементов в принимаемом сообщении не должно превосходить значения
        
        
          
            count
          
        
        
          . Если число принятых элементов меньше значения
        
        
          
            count
          
        
        
          , то гарантируется, что
        
        
          в буфере
        
        
          
            buf
          
        
        
          изменятся только элементы, соответствующие элементам принятого
        
        
          сообщения. Если нужно узнать точное число элементов в сообщении, то можно вос-
        
        
          пользоваться подпрограммой
        
        
          
            MPI_Probe
          
        
        
          .
        
        
          Блокировка гарантирует, что после возврата из подпрограммы все элементы
        
        
          сообщения приняты и расположены в буфере
        
        
          
            buf
          
        
        
          .
        
        
          В качестве номера процесса-отправителя можно указать предопределенную
        
        
          константу
        
        
          
            MPI_ANY_SOURCE
          
        
        
          - признак того, что подходит сообщение от любого
        
        
          процесса. В качестве идентификатора принимаемого сообщения можно указать кон-
        
        
          станту
        
        
          
            MPI_ANY_TAG
          
        
        
          - признак того, что подходит сообщение с любым идентифи-
        
        
          катором.
        
        
          Если процесс посылает два сообщения другому процессу и оба эти сообщения
        
        
          соответствуют одному и тому же вызову
        
        
          
            MPI_Recv
          
        
        
          , то первым будет принято то
        
        
          сообщение, которое было отправлено раньше.
        
        
          
            Прием/передача сообщений без блокировки
          
        
        
          int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int
        
        
          dest, int msgtag, MPI_Comm comm, MPI_Request *request)
        
        
          •
        
        
          
            buf
          
        
        
          - адрес начала буфера посылки сообщения;
        
        
          •
        
        
          
            count
          
        
        
          - число передаваемых элементов в сообщении;
        
        
          •
        
        
          
            datatype
          
        
        
          - тип передаваемых элементов;
        
        
          •
        
        
          
            dest
          
        
        
          - номер процесса-получателя;
        
        
          •
        
        
          
            msgtag
          
        
        
          - идентификатор сообщения;
        
        
          •
        
        
          
            comm
          
        
        
          - идентификатор группы;
        
        
          •
        
        
          OUT
        
        
          
            request
          
        
        
          - идентификатор асинхронной передачи.
        
        
          Передача сообщения аналогична
        
        
          
            MPI_Send,
          
        
        
          однако возврат из подпрограммы
        
        
          происходит сразу после инициализации процесса передачи без ожидания обработки
        
        
          всего сообщения, находящегося в буфере
        
        
          
            buf
          
        
        
          . Это означает, что нельзя повторно
        
        
          использовать данный буфер для других целей без получения дополнительной ин-
        
        
          формации о завершении данной посылки. Окончание процесса передачи (т.е. того
        
        
          момента, когда можно переиспользовать буфер
        
        
          
            buf
          
        
        
          без опасения испортить переда-
        
        
          ваемое сообщение) можно определить с помощью параметра
        
        
          
            request
          
        
        
          и процедур
        
        
          
            MPI_Wait
          
        
        
          и
        
        
          
            MPI_Test.
          
        
        
          Сообщение, отправленное любой из процедур
        
        
          
            MPI_Send
          
        
        
          и
        
        
          
            MPI_Isend
          
        
        
          , может быть принято любой из процедур
        
        
          
            MPI_Recv
          
        
        
          и
        
        
          
            MPI_Irecv.