Next:7. ТОПОЛОГИЯ ПРОЦЕССОВ
Up:6. РАБОТА С ГРУППАМИ И КОММУНИКАТОРАМИ
Prev:6.2. Функции работы с группами

6.3. Функции работы с коммуникаторами

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

Две основных функции доступа к коммуникатору, MPI_Comm_size - опрос числа процессов в области связи и MPI_Comm_rank - опрос идентификатора номера процесса в области связи, были рассмотрены в самом начале среди базовых функций MPI.

Кроме них, имеется функция сравнения двух коммуникаторов MPI_Comm_compare.

С:
MPI_Comm_compare(MPI_Comm comm1,MPI_Comm comm2, int *result)
FORTRAN:
MPI_COMM_COMPARE(COMM1, COMM2, RESULT, IERROR)
INTEGER COMM1, COMM2, RESULT, IERROR
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

С:
MPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm)
FORTRAN:
MPI_COMM_DUP(COMM, NEWCOMM, IERROR)
INTEGER COMM, NEWCOMM, IERROR

IN comm - коммуникатор;
OUT newcomm - копия коммуникатора.

Функция полезна для последующего создания коммуникаторов с новыми атрибутами.

Функция создания коммуникатора MPI_Comm_create

С:
MPI_Comm_create(MPI_Comm comm, MPI_Group group,
MPI_Comm *newcomm)
FORTRAN:
MPI_COMM_CREATE(COMM, GROUP, NEWCOMM, IERROR)
INTEGER COMM, GROUP, NEWCOMM, IERROR
IN comm - родительский коммуникатор;
IN group - группа, для которой создается коммуникатор;
OUT newcomm - новый коммуникатор.

Эта функция создает коммуникатор для группы group. Для процессов, которые не являются членами группы, возвращается значение MPI_COMM_NULL. Функция возвращает код ошибки, если группа group не является подгруппой родительского коммуникатора.

Функция расщепления коммуникатора MPI_Comm_split

С:
MPI_Comm_split(MPI_Comm comm, int color, int key,
MPI_Comm *newcomm)
FORTRAN:
MPI_COMM_SPLIT(COMM, COLOR, KEY, NEWCOMM, IERROR)
INTEGER COMM, COLOR, KEY, NEWCOMM, IERROR
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

С:
MPI_Comm_free(MPI_Comm *comm)
FORTRAN:
MPI_COMM_FREE(COMM, IERROR)
INTEGER COMM, IERROR

IN comm    - уничтожаемый коммуникатор.

Примечание: За рамками данного руководства мы оставим обсуждение inter-коммуникаторов и вопросы, связанные с изменением или добавлением новых атрибутов коммуникаторов.




Next:7. ТОПОЛОГИЯ ПРОЦЕССОВ
Up:6. РАБОТА С ГРУППАМИ И КОММУНИКАТОРАМИ
Prev:6.2. Функции работы с группами