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

MPI_Comm_dup(comm, newcomm);

gauss_parallel(newcomm, а, в);

MPI_Comm_free(newcomm);

           .          .          .

где подпрограммой MPI_Comm_dup создается новый коммуникатор с именем newcomm , а некоторая библиотечная процедура с именем gauss_parallel использует коммуникатор newcomm. При этом все обмены в этой процедуре будут выполняться полностью независимо от других операций обмена всего проложения. Подпрограмма MPI_Comm_free освобождает системные ресурсы, связанные с созданием нового объекта связи.

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

5.3.4  Группы процессов

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

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

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

MPI поддерживает обмены между двумя непересекающимися группами процессов. Если параллельная программа состоит из нескольких параллельных модулей, удобно разрешить одному модулю обмениваться сообщениями с другим, используя для адресации локальные по отношению ко второму модулю ранги. Такой подход удобен, например, при программировании параллельных клиент-серверных приложений. Интеробмены реализуются с помощью интеркоммуникаторов, которые объединяют две группы процессов общим контекстом. В контексте, связанном с интеркоммуникатором, передача сообщения в локальной группе всегда сопровождается его приемом в удаленной группе – это двухточечная операция. Группа, содержащая процесс, который инициирует операцию интеробмена, называется локальной группой, а группа, содержащая процесс-адресат, – удаленной группой. Интеробмен задается парой: коммуникатор – ранг, при этом ранг задается относительно удаленной группы.

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

Интеробмен характеризуется следующими свойствами:

·  синтаксис двухточечных обменов одинаков в операциях обмена в рамках интра- и интеркоммуникаторов;

·  адресат задается рангом процесса в удаленной группе;

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

·  интеркоммуникатор нельзя использовать для коллективных обменов;

·  коммуникатор не может объединять свойства интер- и интракоммуникатора.

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