6.3. Функции работы с коммуникаторами
В данном подразделе рассматриваются функции работы с коммуникаторами. Они разделяются на функции доступа к коммуникаторам и функции создания коммуникаторов. Функции доступа являются локальными и не требуют коммуникаций, в отличие от функций создания, которые являются коллективными и могут потребовать межпроцессорных коммуникаций.
Две основных функции доступа к коммуникатору, MPI_Comm_size - опрос числа процессов в области связи и MPI_Comm_rank - опрос идентификатора номера процесса в области связи, были рассмотрены в самом начале среди базовых функций MPI.
Кроме них, имеется функция сравнения двух коммуникаторов MPI_Comm_compare.
IN | comm1 | - первый коммуникатор; |
IN | comm2 | - второй коммуникатор; |
OUT | result | - результат сравнения. |
Возможные значения результата сравнения:
MPI_IDENT | - | коммуникаторы идентичны, представляют один и тот же объект; |
MPI_CONGRUENT | - | коммуникаторы конгруэнтны, две области связи с одними и теми же атрибутами группы; |
MPI_SIMILAR | - | коммуникаторы подобны, группы содержат одни и те же процессы, но другое упорядочивание; |
MPI_UNEQUAL | - | во всех других случаях. |
Создание нового коммуникатора возможно с помощью одной из трех функций: MPI_Comm_dup, MPI_Comm_create, MPI_Comm_split.
Функция дублирования коммуникатора MPI_Comm_dup
IN | comm | - коммуникатор; |
OUT | newcomm | - копия коммуникатора. |
Функция полезна для последующего создания коммуникаторов с новыми атрибутами.
Функция создания коммуникатора MPI_Comm_create
IN | comm | - | родительский коммуникатор; |
IN | group | - | группа, для которой создается коммуникатор; |
OUT | newcomm | - | новый коммуникатор. |
Эта функция создает коммуникатор для группы group. Для процессов, которые не являются членами группы, возвращается значение MPI_COMM_NULL. Функция возвращает код ошибки, если группа group не является подгруппой родительского коммуникатора.
Функция расщепления коммуникатора MPI_Comm_split
IN | comm | - | родительский коммуникатор; |
IN | color | - | признак подгруппы; |
IN | key | - | управление упорядочиванием; |
OUT | newcomm | - | новый коммуникатор. |
Функция расщепляет группу, связанную с родительским коммуникатором, на непересекающиеся подгруппы по одной на каждое значение признака подгруппы color. Значение color должно быть неотрицательным. Каждая подгруппа содержит процессы с одним и тем же значением color. Параметр key управляет упорядочиванием внутри новых групп: меньшему значению key соответствует меньшее значение идентификатора процесса. В случае равенства параметра key для нескольких процессов упорядочивание выполняется в соответствии с порядком в родительской группе.
Приведем алгоритм расщепления группы из восьми процессов на три подгруппы и его графическую интерпретацию (рис. 6.1).
MPI_comm comm, newcomm; int myid, color; . . . . . . MPI_Comm_rank(comm, &myid); color = myid%3;
MPI_Comm_split(comm, color, myid, &newcomm);
Рис. 6.1. Разбиение группы из восьми процессов на три подгруппы.
В данном примере первую подгруппу образовали процессы, номера которых делятся на 3 без остатка, вторую - для которых остаток равен 1 и третью - для которых остаток равен 2. Отметим, что после выполнения функции MPI_Comm_split значения коммуникатора newcomm в процессах разных подгрупп будут отличаться.
Функция уничтожения коммуникатораа MPI_Comm_free
IN comm - уничтожаемый коммуникатор.
Примечание: За рамками данного руководства мы оставим обсуждение inter-коммуникаторов и вопросы, связанные с изменением или добавлением новых атрибутов коммуникаторов.