next up previous contents
Next: Коммуникационные объекты Up: Парные межпроцессные обмены Previous: Модель реализации буферного режима   Contents

Неблокирующий обмен

На многих системах можно улучшить характеристики путем совмещения во времени процессов обмена и вычислений. Это особенно актуально для систем, где обмен может быть выполнен автономно с помощью интеллектуального коммуникационного контроллера. Потоки, разделяющие единственный ресурс, являются одним из механизмов для достижения такого совмещения. Альтернативным механизмом, который часто приводит к лучшим характеристикам, является неблокирующий обмен. Неблокирующий вызов send start (начало посылки) инициирует операцию посылки, но не завершает ее. Вызов ``начало посылки'' будет возвращать управление перед тем, как сообщение будет послано из буфера отправителя. Отдельный вызов send complete (завершение посылки) необходим, чтобы завершить обмен, то есть чтобы убедиться, что данные уже извлечены из буфера отправителя. При подходящем оборудовании посылка данных из памяти отправителя может выполняться параллельно с вычислениями, выполняемыми на процессе-отправителе после того, как передача была инициирована и до ее завершения. Аналогично, неблокирующий вызов receive start (начало приема) инициирует операцию приема, но не завершает ее. Вызов будет закончен до записи сообщения в приемный буфер. Необходимо выполнить отдельный вызов receive complete (завершение приема), чтобы завершить операцию приема и проверить, что данные получены в приемный буфер. С подходящим оборудованием посылка данных в память получателя может выполняться параллельно с вычислениями, производимыми после того, как прием был инициирован и до его завершения. Использование неблокируемого приема позволит также избежать системной буферизации и копирования память-память, когда информация появилась преждевременно на приемном буфере.

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

Вызов завершения посылки заканчивается, когда данные извлечены из буфера отправителя. Этот факт может иметь дополнительный смысл в зависимости от режима передачи.

Если режим передачи синхронный, тогда передача может завершиться только, если соответствующий прием стартовал, то есть, прием инициирован и соответствует передаче. В этом случае вызов send-complete является нелокальным. Заметим, что синхронная неблокирующая передача может быть завершена, если перед вызовом receive complete имеет место соответствующий неблокирующий прием. (Он может завершиться сразу, как только отправитель ``узнает'', что передача будет завершена, но перед тем, как приемник ``узнает'', что передача будет завершена).

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

Если используется стандартный режим передачи, тогда вызов send-complete может заканчиваться перед тем, как выполняется соответствующий прием, если сообщение буферизованное. С другой стороны, send-complete может не завершаться до тех пор, пока имеет место соответствующий прием и сообщение было скопировано в приемный буфер.

Неблокирующие передачи могут соответствовать блокирующим приемам и наоборот.

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

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

Модель передачи сообщений приводит к модели, в которой коммуникации инициируются отправителем. Обмен в общем будет иметь низкие накладные расходы, если прием уже установлен к моменту, когда отправитель инициирует обмен (данные могут быть перемещены прямо в приемный буфер и нет необходимости иметь очередь ждущих требований на посылку). Однако, операция приема может быть завершена только после того, как соответствующая посылка была совершена. Использование неблокирующего приема позволяет достичь низких затрат без блокирования приема, когда он ждет посылки.[]



Subsections

Alex Otwagin 2002-12-10