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

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

4.6  Объекты для связи в MPI

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

Подпрограммы, обеспечивающие обмен данными, являются объектами связи, за которыми в MPI закреплены два понятия: интракоммуникатор и интеркоммуникатор (intracommunicator и intercommunicator). Эти объекты связи призваны определять и разграничивать область взаимодействия (область связи) внутри групп и между группами взаимодействующих процессов, расположенных на одном процессоре, и между группами процессов, расположенных на различных процессорах. Все процессы, принадлежащие одной области взаимодействия, могут обмениваться сообщениями только через свой коммуникатор (рис. 4.4). Таким образом, коммуникатор является специальной информационной структурой, описывающей подмножество взаимодействующих процессов лишь друг с другом. Формально он определяет контекст связи для операции обмена. Сообщения принимаются в том контексте, в котором они были отправлены. Сообщения, отправленные в разных контекстах, не пересекаются и не мешают друг другу.


Рисунок 4.4. Область взаимодействия МРI-программы

Кроме определяемых пользователем коммуникаторов, для связи между всеми процессами данной параллельной программы в MPI автоматически создается общий коммуникатор, значение (имя) которого по умолчанию представлено константой MPI_COMM_WORLD. Всем процессам в любой конкретной области взаимодействия всегда присваиваются целые положительные номера от 0 до некоторого максимального. Номер текущего процесса в области взаимодействия можно определить с помощью вызова  MPI_Comm_rank(   ). Из процессов, входящих в существующую область взаимодействия, могут создаваться новые области взаимодействия. Нумерация процессов в разных областях взаимодействия независима.

В программах на языке С++ коммуникаторы являются константами типа MPI_Comm. Кроме упоминавшегося MPI_COMM_WORLD имеются также: MPI_COMM_SELF — коммуникатор, содержащий только вызывающий процесс, и MPI_COMM_NULL — пустой коммуникатор.

Номер процесса называется его рангом. Ранг используется для указания конкретного процесса, например, при пересылке сообщений. Процесс может принадлежать нескольким областям взаимодействия и в каждой области у него будет свой собственный ранг.

Текст 4.2. Пример простейшей MPI-программы на псевдо языке

program mpi_example

MPI_Init()

MPI_Comm_size(MPI_COMM_WORLD, count)

MPI_Comm_rank(MPI_COMM_WORLD, id)

write(id, count)

MPI_Finalize()

end

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

4.7  Основные языки программирования в MPI