ВУЗ:
Составители:
Рубрика:
- 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 предусмотрен набор процедур для осуществления асинхронной передачи данных. В отличие от блокирующих процедур, возврат из процедур данной группы происходит сразу после вызова без какой-либо остановки ра- боты процессов; на фоне дальнейшего выполнения программы одновре- менно происходит и обработка асинхронно запущенной операции. Эта воз- можность исключительно полезна для создания эффективных программ - во многих случаях совершенно не обязательно дожидаться окончания посылки сообщения для выполнения последующих вычислений.
Страницы
- « первая
- ‹ предыдущая
- …
- 31
- 32
- 33
- 34
- 35
- …
- следующая ›
- последняя »