Функции работы с коммуникаторами
В данном подразделе рассматриваются функции работы с коммуникаторами. Они разделяются на функции доступа к коммуникаторам и функции создания коммуникаторов. Функции доступа являются локальными и не требуют коммуникаций, в отличие от функций создания, которые являются коллективными и могут потребовать межпроцессорных коммуникаций. Две основных функции доступа к коммуникатору, MPI_Comm_size - опрос числа процессов в области связи и MPI_Comm_rank - опрос идентификатора (номера) процесса в области связи, были рассмотрены в самом начале среди базовых функций MPI (раздел 2). Кроме них, имеется функция сравнения двух коммуникаторов 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
Возможные значения результата сравнения:
Создание нового коммуникатора возможно с помощью одной из трех функций: 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
Функция полезна для последующего создания коммуникаторов с новыми атрибутами. Функция создания коммуникатора 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
Эта функция создает коммуникатор для группы 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
Функция расщепляет группу, связанную с родительским коммуникатором, на непересекающиеся подгруппы по одной на каждое значение признака подгруппы color. Значение color должно быть неотрицательным. Каждая подгруппа содержит процессы с одним и тем же значением color. Параметр key управляет упорядочиванием внутри новых групп: меньшему значению key соответствует меньшее значение идентификатора процесса. В случае равенства параметра key для нескольких процессов упорядочивание выполняется в соответствии с порядком в родительской группе. Приведем алгоритм расщепления группы из восьми процессов на три подгруппы и его графическую интерпретацию (Рис.18). MPI_comm comm, newcomm;int myid, color;......MPI_Comm_rank(comm, &myid);color = myid%3;MPI_Comm_split(comm, color, myid, &newcomm);
В данном примере первую подгруппу образовали процессы, номера которых делятся на 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 коммуникаторов и вопросы, связанные с изменением или добавлением новых атрибутов коммуникаторов.
|