The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа
next up previous contents
Next: Нуль процессы Up: Парные межпроцессные обмены Previous: Персистентные коммуникационные запросы   Contents

Совмещенные прием и передача сообщений (send-receive)

Операция send-receive комбинирует в одном обращении посылку сообщения одному получателю и прием сообщения от другого отправителя. Получателем и отправителем может быть тот же самый процесс. Эта операция весьма полезна для выполнения сдвига по цепи процессов. Если для такого сдвига были использованы блокирующие приемы и передачи, тогда нужно корректно упорядочить эти приемы и передачи (например, четные процессы передают, затем принимают, нечетные процессы сначала принимают, затем передают) так, чтобы предупредить циклические зависимости, которые могут привести к дедлоку. Когда используется операция send-receive, коммуникационная система решает эти проблемы. Операция send-receive может быть использована в сочетании с функциями, описанными в главе 6, для выполнения сдвигов на различных топологиях. К тому же операция send-receive полезна для реализации удаленных процедурных вызовов.

Сообщение, посланное операцией send-receive, может быть получено обычной операцией приема или опробовано операцией probe; send-receive может также получать сообщения, посланные обычной операцией передачи.

Синтаксис функции MPI_SENDRECV представлен ниже.

MPI_SENDRECV(sendbuf, sendcount, sendtype, dest, sendtag,
     recvbuf, recvcount, recvtype, source, recvtag, comm, status)
IN sendbuf начальный адрес буфера отправителя (альтернатива)
IN sendcount число элементов в буфере отправителя (целое)
IN sendtype тип элементов в буфере отправителя (дескриптор)
IN dest номер процесса-получателя (целое)
IN sendtag тэг процесса-отправителя (целое)
OUT recvbuf начальный адрес приемного буфера (альтернатива)
IN recvcount число элементов в в приемном буфере (целое)
IN recvtype тип элементов в приемном буфере (дескриптор)
IN source номер процесса-отправителя (целое)
IN recvtag тэг процесса-получателя (целое)
IN comm коммуникатор (дескриптор)
OUT status статус (статус)

int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
    int dest, int sendtag, void *recvbuf, int recvcount,
    MPI_Datatype recvtype, int source, MPI_Datatype recvtag,
    MPI_Comm comm, MPI_Status *status) 

MPI_SENDRECV(SENDBUF, SENDCOUNT, SENDTYPE, DEST, SENDTAG, RECVBUF,
    RECVCOUNT, RECVTYPE, SOURCE, RECVTAG, COMM, STATUS, IERROR)
<type> SENDBUF(*), RECVBUF(*) 
INTEGER SENDCOUNT, SENDTYPE, DEST, SENDTAG, RECVCOUNT, RECVTYPE,
    SOURCE, RECVTAG, COMM, STATUS(MPI_STATUS_SIZE), IERROR 

void MPI::Comm::Sendrecv(const void *sendbuf, int sendcount,
    const MPI::Datatype& sendtype, int dest, int sendtag,
    void *recvbuf, int recvcount, const MPI::Datatype& recvtype,
    int source, int recvtag, MPI::Status& status) const 

void MPI::Comm::Sendrecv(const void *sendbuf, int sendcount,
    const MPI::Datatype& sendtype, int dest, int sendtag,
    void *recvbuf, int recvcount, const MPI::Datatype& recvtype,
    int source, int recvtag) const

Функция MPI_SENDRECV выполняет операции блокирующей передачи и приема. Передача и прием используют тот же самый коммуникатор, но возможно различные тэги. Буфера отправителя и получателя должны быть разделены и могут иметь различную длину и типы данных.

Синтаксис функции MPI_SENDRECV_REPLACE представлен ниже.

MPI_SENDRECV_REPLACE(buf, count, datatype, dest,
    sendtag, source, recvtag, comm, status)
INOUT buf начальный адрес буфера отправителя и получателя (альтернатива)
IN count число элементов в буфере отправителя и получателя (целое)
IN datatype тип элементов в буфере отправителя и получателя (дескриптор)
IN dest номер процесса-получателя (целое)
IN sendtag тэг процесса-отправителя (целое)
IN source номер процесса-отправителя (целое)
IN recvtag тэг процесса-получателя (целое)
IN comm коммуникатор (дескриптор)
OUT status статус (статус)

int MPI_Sendrecv_replace(void* buf, int count, MPI_Datatype datatype,
    int dest, int sendtag, int source, int recvtag, MPI_Comm comm,
    MPI_Status *status) 

MPI_SENDRECV_REPLACE(BUF, COUNT, DATATYPE, DEST, SENDTAG,
    SOURCE, RECVTAG, COMM, STATUS, IERROR)
<type> BUF(*) 
INTEGER COUNT, DATATYPE, DEST, SENDTAG, SOURCE, RECVTAG,
    COMM, STATUS(MPI_STATUS_SIZE), IERROR 

void MPI::Comm::Sendrecv_replace (void* buf, int count,
    const MPI::Datatype& datatype, int dest, int sendtag,
    int source, int recvtag, MPI::Status& status) const 

void MPI::Comm::Sendrecv_replace(void* buf, int count,
    const MPI::Datatype& datatype, int dest, int sendtag,
    int source, int recvtag) const

Функция MPI_SENDRECV_REPLACE выполняет блокирующие передачи и приемы. Тот же самый буфер используется для отправки и получения, так что посланное сообщение замещается полученным. Семантика операции send-receive похожа на запуск двух конкурирующих потоков, когда один выполняет передачу, а другой - прием, с последующим объединением этих потоков.

Совет разработчикам: Для варианта "замещения" необходима дополнительная промежуточная буферизация.[]


next up previous contents
Next: Нуль процессы Up: Парные межпроцессные обмены Previous: Персистентные коммуникационные запросы   Contents
Alex Otwagin 2002-12-10



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру