Параллельное программирование: Учебное пособие, страница 87

В этом разделе рассмотрены основные типы обмена данными между процессами параллельной задачи — обменами двухточечным(point-to-point – точка-точка) и коллективным. Описаны различные режимы обмена и правила использования основных подпрограмм передачи и приема сообщений. Рассмотрены способы создания различных локально взаимодействующих групп процессов.

5.1  Двухточечный обмен сообщениями

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

Рис. 5.1. Двухточечный обмен.

Во всех реализациях MPI, в том числе и в NT-MPICH, гарантируется выполнение некоторых свойств двухточечного обмена. Одним из них является сохранение порядка сообщений, которые при двухточечном обмене не должны обгонять друг друга. Если, например, процесс с рангом 0 передает процессу с рангом 1 два сообщения А и В, то процесс 1 получит сначала сообщение А, а затем В. Другое важнейшее свойство — гарантированное выполнение обмена. Если один процесс посылает сообщение, а другой посылает запрос на его прием, то либо передача, либо прием будут считаться выполненными. Однако при этом возможны три сценария обмена:

·  второй процесс получает от первого адресованное ему сообщение;

·  отправленное сообщение может быть получено третьим процессом, при этом передача сообщения будет фактически выполнена, а его прием нет, так как сообщение прошло мимо адресата;

·  второй процесс получает сообщение от третьего, тогда передача не может считаться выполненной, потому что адресат получил не то сообщение.

В двухточечном обмене следует соблюдать правило соответствия типов передаваемых и принимаемых данных, что считается естественным для С++. Однако это затрудняет обмен сообщениями между программами, написанными на разных языках программирования.

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

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

·  синхронная передачаотличается от стандартной тем, что она не завершается до тех пор, пока не будет завершен прием сообщения; адресат, получив сообщение, посылает процессу, отправившему его, уведомление, которое должно быть получено отправителем для того, чтобы обмен считался выполненным;

·  буферизованная передачазавершается сразу же, так как сообщение копируется в системный буфер, где и ожидает своей очереди на пересылку; завершается буферизованная передача независимо от того, выполнен прием сообщения или нет;

·  передача “по готовностиначинается только в том случае, когда адресат инициализировал прием сообщения, а завершается сразу же, независимо от того, принято сообщение или нет.

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

В MPI приняты – следующие соглашения об именах подпрограмм двухточечного обмена:

MPI_[I][R, S, B]Send

здесь MPI_  – префикс, приписываемый всем подпрограммам MPI;

[I] – (от Immediate - немедленный) обозначает режим блокировки;

[R|S|B] – эти префиксы обозначает режим обмена, соответственно: по готовности, синхронный и буферизованный.

Отсутствие префикса обозначает подпрограмму стандартного обмена.