Режимы передачи данных
Функция MPI_Send обеспечивает стандартный (Standard) режим отправки сообщений, при котором:
− на время выполнения функции процесс-отправитель сообщения блокируется,
− после завершения функции буфер может быть использован повторно,
− состояние отправленного сообщения может быть различным - сообщение может располагаться в процессе-отправителе, может находиться в процессе передачи, может храниться в процессе-получателе или же может быть принято процессом-получателем при помощи функции MPI_Recv.
Кроме стандартного режима в MPI предусматриваются следующие дополнительные режимы передачи сообщений:
• Синхронный (Synchronous) режим состоит в том, что завершение функции отправки сообщения происходит только при получении от процесса-получателя подтверждения о начале приема отправленного сообщения, отправленное сообщение или полностью принято процессом-получателем или находится в состоянии приема (Synchronous blocking send: Send a message and block until the application buffer in the sending task is free for reuse and the destination process has started to receive the message)
• Буферизованный (Buffered) режим предполагает использование дополнительных системных буферов для копирования в них отправляемых сообщений; как результат, функция отправки сообщения завершается сразу же после копирования сообщения в системный буфер (Buffered blocking send: permits the programmer to allocate the required amount of buffer space into which data can be copied until it is delivered. Insulates against the problems associated with insufficient system buffer space. Routine returns after the data has been copied from application buffer space to the allocated send buffer. Must be used with the MPI_Buffer_attach routine).
• Режим передачи по готовности (Ready) может быть использован только, если операция приема сообщения уже инициирована. Буфер сообщения после завершения функции отправки сообщения может быть повторно использован.
Для именования функций отправки сообщения для разных режимов выполнения в MPI используется название функции MPI_Send, к которому как префикс добавляется начальный символ названия соответствующего режима работы, т.е.
- MPI_Ssend– функция отправки сообщения в синхронном режиме,
- MPI_Bsend– функция отправки сообщения в буферизованном режиме,
- MPI_Rsend– функция отправки сообщения в режиме по готовности.
Список параметров всех перечисленных функций совпадает с составом параметров функции MPI_Send.
Для использования буферизованного режима передачи должен быть создан и передан MPI буфер памяти для буферизации сообщений – используемая для этого функция имеет вид:
int MPI_Buffer_attach(void *buf, int size),
где
- buf- буфер памяти для буферизации сообщений,
- size– размер буфера.
После завершения работы с буфером он должен быть отключен от MPI при помощи функции:
int MPI_Buffer_detach(void *buf, int *size).
По практическому использованию режимов можно привести следующие рекомендации:
1. Режим передачи по готовности формально является наиболее быстрым, но используется достаточно редко, т.к. обычно сложно гарантировать готовность операции приема,
2. Стандартный и буферизованный режимы также выполняются достаточно быстро, но могут приводить к большим расходам ресурсов (памяти) – в целом может быть рекомендован для передачи коротких сообщений,
3. Синхронный режим является наиболее медленным, т.к. требует подтверждения приема. В тоже время, этот режим наиболее надежен – можно рекомендовать его для передачи длинных сообщений.
Для функции приема MPI_Recv различных режимов работы не существует.
Одновременное выполнение передачи и приема
Одной из часто выполняемых форм информационного взаимодействия в параллельных программах является обмен данными между процессами, когда для продолжения вычислений процессам необходимо отправить данные одним процессам и, в то же время, получить сообщения от других процессов.
Достижение эффективного и гарантированного одновременного выполнения операций передачи и приема данных может быть обеспечено при помощи функции MPI:
int MPI_Sendrecv(void *sbuf,int scount,MPI_Datatype stype,int dest, int stag,
void *rbuf,int rcount,MPI_Datatype rtype,int source,int rtag,
MPI_Comm comm, MPI_Status *status),
где
- sbuf, scount, stype, dest, stag- параметры передаваемого сообщения,
- rbuf, rcount, rtype, source, rtag- параметры принимаемого сообщения,
- comm- коммуникатор, в рамках которого выполняется передача данных,
- status– структура данных с информацией о результате выполнения операции.
Функция MPI_Sendrecv передает сообщение, описываемое параметрами (sbuf, scount, stype, dest, stag), процессу с рангом dest и принимает сообщение в буфер, определяемый параметрами (rbuf, rcount, rtype, source, rtag), от процесса с рангом source.
В функции MPI_Sendrecv для передачи и приема сообщений применяются разные буфера. В случае же, когда сообщения имеют одинаковый тип, в MPI имеется возможность использования единого буфера:
int MPI_Sendrecv_replace(void *buf, int count, MPI_Datatype type, int dest,
int stag, int source, int rtag, MPI_Comm comm, MPI_Status* status).
Дата добавления: 2015-02-03; просмотров: 1561;