В этом разделе рассмотрены основные типы обмена данными между процессами параллельной задачи — обменами двухточечным(point-to-point – точка-точка) и коллективным. Описаны различные режимы обмена и правила использования основных подпрограмм передачи и приема сообщений. Рассмотрены способы создания различных локально взаимодействующих групп процессов.
С точки зрения программиста обмен точка-точка происходит следующим образом (рис. 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] – эти префиксы обозначает режим обмена, соответственно: по готовности, синхронный и буферизованный.
Отсутствие префикса обозначает подпрограмму стандартного обмена.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.