Управление группами процессов и коммуникаторами
Рассмотрим теперь возможности MPI по управлению группами процессов и коммуникаторами.
Для изложения последующего материала напомним ряд понятий и определений, приведенных в начале данной лекции.
Процессы параллельной программы объединяются в группы. В группу могут входить все процессы параллельной программы; с другой стороны, в группе может находиться только часть имеющихся процессов. Один и тот же процесс может принадлежать нескольким группам. Управление группами процессов предпринимается для создания на их основе коммуникаторов.
Под коммуникатором в MPI понимается специально создаваемый служебный объект, который объединяет в своем составе группу процессов и ряд дополнительных параметров (контекст), используемых при выполнении операций передачи данных. Парные операции передачи данных выполняются только для процессов, принадлежащих одному и тому же коммуникатору. Коллективные операции применяются одновременно для всех процессов коммуникатора. Создание коммуникаторов предпринимается для уменьшения области действия коллективных операций и для устранения взаимовлияния разных выполняемых частей параллельной программы. Важно еще раз подчеркнуть – коммуникационные операции, выполняемые с использованием разных коммуникаторов, являются независимыми и не влияют друг на друга.
|
|
Все имеющиеся в параллельной программе процессы входят в состав создаваемого по умолчанию коммуникатора с идентификатором MPI_COMM_WORLD.
При необходимости передачи данных между процессами из разных групп необходимо создавать определенные в стандарте MPI-2 глобальные коммуникаторы (intercommunicator). Взаимодействие между процессами разных групп оказывается необходимым в достаточно редких ситуациях, в данном учебном материале не рассматривается и может служить темой для самостоятельного изучения – см., например, [[4], [40] – [42], [57]].
Группы процессов могут быть созданы только из уже существующих групп. В качестве исходной группы может быть использована группа, связанная с предопределенным коммуникатором MPI_COMM_WORLD. Также иногда может быть полезным коммуникатор MPI_COMM_SELF, определенный для каждого процесса параллельной программы и включающий только этот процесс.
Для получения группы, связанной с существующим коммуникатором, применяется функция:
int MPI_Comm_group(MPI_Comm comm, MPI_Group *group),где
· comm — коммуникатор;
· group — группа, связанная с коммуникатором.
Далее, на основе существующих групп, могут быть созданы новые группы:
· создание новой группы newgroup из существующей группы oldgroup, которая будет включать в себя n процессов — их ранги перечисляются в массиве ranks:
|
|
где
· oldgroup — существующая группа;
· n — число элементов в массиве ranks;
· ranks — массив рангов процессов, которые будут включены в новую группу;
· newgroup — созданная группа;
· создание новой группы newgroup из группы oldgroup, которая будет включать в себя n процессов, чьи ранги не совпадают с рангами, перечисленными в массиве ranks:
int MPI_Group_excl(MPI_Group oldgroup, int n, int *ranks, MPI_Group *newgroup),где
· oldgroup — существующая группа;
· n — число элементов в массиве ranks;
· ranks — массив рангов процессов, которые будут исключены из новой группы;
· newgroup — созданная группа.
Для получения новых групп над имеющимися группами процессов могут быть выполнены операции объединения, пересечения и разности:
· создание новой группы newgroup как объединения групп group1 и group2:
int MPI_Group_union(MPI_Group group1, MPI_Group group2,MPI_Group *newgroup),где
· group1 — первая группа;
· group2 — вторая группа;
· newgroup — объединение групп;
· создание новой группы newgroup как пересечения групп group1 и group2:
int MPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup),где
· group1 — первая группа;
· group2 — вторая группа;
· newgroup — пересечение групп;
· создание новой группы newgroup как разности групп group1 и group2:
int MPI_Group_difference(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup),где
· group1 — первая группа;
· group2 — вторая группа;
· newgroup — разность групп;
При конструировании групп может оказаться полезной специальная пустая группа MPI_COMM_EMPTY.
Ряд функций MPI обеспечивает получение информации о группе процессов:
· получение количества процессов в группе:
int MPI_Group_size(MPI_Group group, int *size),где
· group — группа;
· size — число процессов в группе;
· получение ранга текущего процесса в группе:
int MPI_Group_rank(MPI_Group group, int *rank),где
· group — группа;
· rank — ранг процесса в группе.
После завершения использования группа должна быть удалена:
int MPI_Group_free(MPI_Group *group),где
· group — группа, подлежащая удалению
(выполнение данной операции не затрагивает коммуникаторы, в которых используется удаляемая группа).