Функция создания коммуникатора MPI_Comm_create
С:
MPI_Comm_create(MPI_Comm comm, MPI_Group group,
MPI_Comm *newcomm)
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)
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)
IN comm - уничтожаемый коммуникатор.
Примечание: За рамками данного руководства мы оставим обсуждение inter-коммуникаторов и вопросы, связанные с изменением или добавлением новых атрибутов коммуникаторов.
Основные понятия
Топология процессов является одним из необязательных атрибутов коммуникатора. Такой атрибут может быть присвоен только intra-коммуникатору. По умолчанию предполагается линейная топология, в которой процессы пронумерованы в диапазоне от 0 до n-1, где n - число процессов в группе. Однако для многих задач линейная топология неадекватно отражает логику коммуникационных связей между процессами. MPI предоставляет средства для создания достаточно сложных "виртуальных" топологий в виде графов, где узлы являются процессами, а грани - каналами связи между процессами. Конечно же, следует различать логическую топологию процессов, которую позволяет формировать MPI, и физическую топологию процессоров.
В идеале логическая топология процессов должна учитывать как алгоритм решения задачи, так и физическую топологию процессоров. Для очень широкого круга задач наиболее адекватной топологией процессов является двумерная или трехмерная сетка. Такие структуры полностью определяются числом измерений и количеством процессов вдоль каждого координатного направления, а также способом раскладки процессов на координатную сетку. В MPI, как правило, используется row-major нумерация процессов, т.е. используется нумерация вдоль строки. На рис. 7.1 представлено соответствие между нумерациями 6-ти процессов в одномерной и двумерной (2х3) топологиях.
Рис. 7.1. Соотношение между идентификатором процесса (верхнее число) и координатами в двумерной сетке 2х3 (нижняя пара чисел).
Декартова топология
Обобщением линейной и матричной топологий на произвольное число измерений является декартова топология. Для создания коммуникатора с декартовой топологией используется функция MPI_Cart_create. С помощью этой функции можно создавать топологии с произвольным числом измерений, причем по каждому измерению в отдельности можно накладывать периодические граничные условия. Таким образом, для одномерной топологии мы можем получить или линейную структуру, или кольцо в зависимости от того, какие граничные условия будут наложены. Для двумерной топологии, соответственно, либо прямоугольник, либо цилиндр, либо тор. Заметим, что не требуется специальной поддержки гиперкубовой структуры, поскольку она представляет собой n-мерный тор с двумя процессами вдоль каждого координатного направления.