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

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

В начале разработки параллельного алгоритма выполняется декомпозиция исходной задачи на подзадачи. Методика разбиения обсуждалась в предыдущих разделах. Каждая подзадача, в общем случае, реализует свой алгоритм и обрабатывается во времени в строго определенной последовательности и очередности. Крайним вариантом декомпозиции и последовательности выполнения является разбиение на подзадачи, которые выполняются по одному и тому же алгоритму (методу) и в произвольной последовательности. То есть, параллельная программа состоит из одинаковых программных фрагментов, расположенных на каждом процессоре, которые одновременно запускаются выделенной подзадачей – мастер-программой. Такую модель параллельности в литературе называют SPMD-моделью (Single Program Multiple Data). В ней, чаще всего, запуск нескольких подзадач на одном процессоре запрещают.

Текст 4.1. Типичная структура программы в модели SPMD

program para

    . . .

if (процесс = мастер)

then master

else slave

endif

end

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

Сообщение содержит пересылаемые данные и служебную информацию:

·  идентификатор процесса-отправителя сообщения, который в MPI называют рангом процесса;

·  адрес, по которому размещаются пересылаемые данные процесса-отправителя;

·  тип пересылаемых данных;

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

·  идентификатор (ранг) процесса, который должен получить сообщение;

·  адрес, по которому должны быть размещены данные процессом-получателем.

Обязательная часть служебной информации сообщения содержит:

·  ранг источника;

·  ранг адресата;

·  тег сообщения;

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

Эти данные позволяют адресату различать сообщения. Ранг источника дает возможность различать сообщения, приходящие от разных процессов. Тег – это идентификатор, задаваемый целым числом от 0 до 32767, который позволяет различать на приемной стороне порядок следования сообщений, приходящих от одного процесса. Данные в сообщении организованы в массив элементов, каждый из которых имеет определенный тип.

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

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

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

4.2  Операции обмена сообщениями