Параллельное программирование в стандарте MPI. Баканов В.М - 33 стр.

UptoLike

Составители: 

- 33 -
Казалось бы, что (если функция передачи возвращает управление только
после того, как данные попали в пользовательский буфер на стороне приема)
и здесь deadlock неизбежен. Однако при использовании MPI зависания во
втором варианте не происходит: функция
MPI_Send
, если на приемной сторо-
не нет готовности (не вызвана
MPI_Recv
), не станет дожидаться ее вызова, а
скопирует данные во временный буфер и немедленно вернет управление ос-
новной программе. Вызванный далее
MPI_Recv
данные получит не напрямую
из пользовательского буфера, а из промежуточного системного буфера (т.о.
используемый в MPI способ буферизации повышает надежность - делает
программу более устойчивой к возможным ошибкам программиста). Т.о. на-
ряду с полезными качествами (см. выше) свойство блокировки может слу-
жить причиной возникновения (трудно локализуемых и избегаемых для не-
профессионалов) тупиковых ситуаций при обмене сообщениями между про-
цессами.
Очень часто функции
MPI_Send/MPI_Recv
используются совместно и имен-
но в таком порядке, поэтому в MPI специально введены две функции, осуще-
ствляющие одновременно посылку одних данных и прием других. Первая из
них -
MPI_Sendrecv
(у нее первые 5 формальных параметров такие же, как у
MPI_Send
, остальные 7 параметров аналогичны
MPI_Recv
). Следует учесть,
что:
как при приеме, так и при передаче используется один и тот же коммуни-
катор,
порядок приема и передачи данных
MPI_Sendrecv
выбирает автоматически;
при этом гарантировано отсутствие deadlock’а,
MPI_Sendrecv
совместима с
MPI_Send
и
MPI_Recv
Функция
MPI_Sendrecv_replace
помимо общего коммуникатора использует
еще и общий для приема-передачи буфер. Применять
MPI_Sendrecv_replace
удобно с учетом:
принимаемые данные должны быть заведомо не длиннее отправляемых
принимаемые и отправляемые данные должны иметь одинаковый тип
принимаемые данные записываются на место отправляемых
MPI_Sendrecv_replace
так же гарантированно не вызывает deadlock’а
В MPI предусмотрен набор процедур для осуществления асинхронной
передачи данных. В отличие от блокирующих процедур, возврат из процедур
данной группы происходит сразу после вызова без какой-либо остановки ра-
боты процессов; на фоне дальнейшего выполнения программы одновре-
менно происходит и обработка асинхронно запущенной операции. Эта воз-
можность исключительно полезна для создания эффективных программ - во
многих случаях совершенно не обязательно дожидаться окончания посылки
сообщения для выполнения последующих вычислений.
                                   - 33 -

  Казалось бы, что (если функция передачи возвращает управление только
после того, как данные попали в пользовательский буфер на стороне приема)
и здесь deadlock неизбежен. Однако при использовании MPI зависания во
втором варианте не происходит: функция MPI_Send, если на приемной сторо-
не нет готовности (не вызвана MPI_Recv), не станет дожидаться ее вызова, а
скопирует данные во временный буфер и немедленно вернет управление ос-
новной программе. Вызванный далее MPI_Recv данные получит не напрямую
из пользовательского буфера, а из промежуточного системного буфера (т.о.
используемый в MPI способ буферизации повышает надежность - делает
программу более устойчивой к возможным ошибкам программиста). Т.о. на-
ряду с полезными качествами (см. выше) свойство блокировки может слу-
жить причиной возникновения (трудно локализуемых и избегаемых для не-
профессионалов) тупиковых ситуаций при обмене сообщениями между про-
цессами.
  Очень часто функции MPI_Send/MPI_Recv используются совместно и имен-
но в таком порядке, поэтому в MPI специально введены две функции, осуще-
ствляющие одновременно посылку одних данных и прием других. Первая из
них - MPI_Sendrecv (у нее первые 5 формальных параметров такие же, как у
MPI_Send, остальные 7 параметров аналогичны MPI_Recv). Следует учесть,
что:

 • как при приеме, так и при передаче используется один и тот же коммуни-
   катор,
 • порядок приема и передачи данных MPI_Sendrecv выбирает автоматически;
   при этом гарантировано отсутствие deadlock’а,
 • MPI_Sendrecv совместима с MPI_Send и MPI_Recv


  Функция MPI_Sendrecv_replace помимо общего коммуникатора использует
еще и общий для приема-передачи буфер. Применять MPI_Sendrecv_replace
удобно с учетом:

 • принимаемые  данные должны быть заведомо не длиннее отправляемых
 • принимаемые и отправляемые данные должны иметь одинаковый тип
 • принимаемые данные записываются на место отправляемых
 • MPI_Sendrecv_replace так же гарантированно не вызывает deadlock’а


   В MPI предусмотрен набор процедур для осуществления асинхронной
передачи данных. В отличие от блокирующих процедур, возврат из процедур
данной группы происходит сразу после вызова без какой-либо остановки ра-
боты процессов; на фоне дальнейшего выполнения программы одновре-
менно происходит и обработка асинхронно запущенной операции. Эта воз-
можность исключительно полезна для создания эффективных программ - во
многих случаях совершенно не обязательно дожидаться окончания посылки
сообщения для выполнения последующих вычислений.