Реклама:

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

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

В большинстве систем передачи сообщений используются два примитива send и receive, но возможны и другие варианты семантики. Тремя основными вариантами являются:

♦ синхронная передача сообщений;

+ буферизуемая передача сообщений;

+ неблокирующая передача сообщений.

Если при синхронной передаче сообщений отправитель выполняет операцию send, а получатель еще не выполнил операцию receive, отправитель блокируется (приостанавливается) до тех пор, пока получатель не выполнит операцию receive, а в это время сообщение копируется. Когда управление возвращается отправителю, он уже знает, что отправленное сообщение получено. Этот метод имеет простую семантику и не требует буферизации. Но у него есть серьезный недостаток: отправитель блокируется до тех пор, пока получатель не примет сообщение и подтвердит его прием.

В случае буферизуемой передачи сообщений отправленное сообщение временно где-либо сохраняется (например в почтовом ящике), пока получатель не будет готов его оттуда забрать. При таком подходе отправитель может продолжать работу и после выполнения операции send, даже если получатель в этот момент занят. Поскольку сообщение уже отправлено, отправитель может сразу же снова использовать буфер сообщений. Такая схема сокращает время запаздывания. Однако никаких гарантий получения сообщения нет. Даже при надежной коммуникационной системе всегда есть вероятность, что из-за сбоя получатель не смог получить сообщение.

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

Далее мы рассмотрим популярную систему передачи сообщений, которая применяется во многих мультикомпьютерах.

Интерфейс передачи сообщений

Еще несколько лет назад пакет PVM (Parallel Virtual Machine - параллельная виртуальная машина) считался самым популярным пакетом для обмена информацией между мультикомпьютерами [74]. Однако в настоящее время он почти повсеместно вытеснен пакетом MPI (Message-Passing Interface - интерфейс передачи сообщений). Пакет MPI гораздо сложнее, чем PVM; он поддерживает намного больше библиотечных вызовов и намного больше параметров для каждого вызова. Первая версия MPI, которая сейчас называется MPI-1, в 1997 году была дополнена второй версией, MPI-2. Далее мы кратко расскажем о MPI-1, а затем посмотрим, что нового появилось в MPI-2. Более подробную информацию об MPI см. в [81, 190].

Пакет MPI-1, в отличии от PVM, никак не связан с созданием процессов и управлением процессами. Создавать процессы должен сам пользователь путем локальных системных вызовов. После создания процессы организуются в группы, которые уже не изменяются. Именно с этими группами работает MPI.

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

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

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

MPI_Send(буфер. число_элементов, тип_данных, получатель, тег, коммуникатор)

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

MPI_Recv{Ъбуфер, число_элементов, тип_данных, отправитель , те г, коммуникатор, Ъстатус)

Этот вызов говорит о том, что получатель ждет от отправителя сообщение типа тип_данных с заданным тегом.

MPI поддерживает четыре базовых коммуникационных режима. Первый режим - синхронный. В нем отправитель не может начать передачу данных, пока получатель не сделает вызов MPIRecv. Второй режим - буферизация. В этом режиме ограничение первого режима не действует. Третий режим - стандартный. Он зависит от конкретной реализации, то есть может быть реализован либо синхронный режим, либо режим буферизации. Четвертый режим - готовность. Здесь, как и в синхронном режиме, отправитель требует, чтобы получатель был доступен, но без проверки. Каждый из этих примитивов имеет блокирующую и неблокирующую версии, что в сумме дает 8 примитивов. Получение может быть только в двух вариантах: блокирующим и неблокирующим.

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

Четвертая базовая концепция MPI - виртуальная топология процессов (дерево, кольцо, решетка, тор и т. д.). Такая организация процессов обеспечивает возможность именования коммуникационных маршрутов и упрощает взаимодействие.

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

Кластерные вычисления || Оглавление || Планирование