- •1. Общая организация mpi
- •2. Базовые функции mpi
- •3. Обзор коммуникационных операций типа точка-точка
- •3.1. Блокирующие коммуникационные операции
- •3.2. Неблокирующие коммуникационные операции
- •4. Обзор коллективных операций
- •4.1. Функции сбора блоков данных от всех процессов группы
- •4.2. Функции распределения блоков данных по всем процессам группы
- •4.3. Функции распределения блоков данных по всем процессам группы
- •4.4. Совмещенные коллективные операции
- •4.3. Глобальные вычислительные операции над распределенными данными
- •5. Производные типы данных и передача упакованных данных
- •5.1 Производные типы данных
- •5.2 Передача упакованных данных
- •6. Работа с группами и коммуникаторами.Область связи. Коммуникаторы.
- •6.1. Функции работы с группами
- •6.2. Функции работы с коммуникаторами
- •7. Топология процессов.
- •7.1. Декартова топология
- •8.1. Вычисление числа
- •8.2. Перемножение матриц
- •8.3. Решение краевой задачи методом Якоби
6. Работа с группами и коммуникаторами.Область связи. Коммуникаторы.
Часто в приложениях возникает потребность ограничить область коммуникаций некоторым набором процессов, которые составляют подмножество исходного набора. Для выполнения каких-либо коллективных операций внутри этого подмножества из них должна быть сформирована своя область связи, описываемая своим коммуникатором. Для решения таких задач MPI поддерживает два взаимосвязанных механизма. Во-первых, имеется набор функций для работы с группами процессов как упорядоченными множествами, и, во-вторых, набор функций для работы с коммуникаторами для создания новых коммуникаторов как описателей новых областей связи.
Группа представляет собой упорядоченное множество процессов. Каждый процесс идентифицируется переменной целого типа. Идентификаторы процессов образуют непрерывный ряд, начинающийся с 0. В MPI вводится специальный тип данных MPI_Group и набор функций для работы с переменными и константами этого типа. Существует две предопределенных группы:
MPI_GROUP_EMPTY |
- |
группа, не содержащая ни одного процесса; |
MPI_GROUP_NULL |
- |
значение возвращаемое, когда группа не может быть создана. |
Созданная группа не может быть модифицирована - расширена или усечена, может быть только создана новая группа. Интересно отметить, что при инициализации MPI не создается группы, соответствующей коммуникатору MPI_COMM_WORLD. Она должна создаваться специальной функцией явным образом.
Коммуникатор представляет собой скрытый объект с некоторым набором атрибутов, а также правилами его создания, использования и уничтожения. Коммуникатор описывает некоторую область связи. Одной и той же области связи может соответствовать несколько коммуникаторов, но даже в этом случае они не являются тождественными и не могут участвовать во взаимном обмене сообщениями. Если данные посылаются через один коммуникатор, процесс-получатель может получить их только через тот же самый коммуникатор.
В MPI существует два типа коммуникаторов:
intracommunicator |
- |
описывает область связи некоторой группы процессов; |
intercommunicator |
- |
служит для связи между процессами двух различных групп. |
Тип коммуникатора можно определить с помощью специальной функции MPI_Comm_test_inter.
С:
MPI_Comm_test_inter(MPI_Comm comm, int *flag)
FORTRAN:
MPI_COMM_TEST_INTER(COMM, FLAG, IERROR)
INTEGER COMM, IERROR
LOGICAL FLAG
IN |
comm |
- |
коммуникатор; |
OUT |
flag |
- |
возвращает true, если comm - intercommunicator. |
Функция возвращает значение "истина", если коммуникатор является интеркоммуникатором.
При инициализации MPI создается два предопределенных коммуникатора:
MPI_COMM_WORLD |
- описывает область связи, содержащую все процессы; |
MPI_COMM_SELF |
- описывает область связи, состоящую из одного процесса. |
6.1. Функции работы с группами
Функция определения числа процессов в группе MPI_Group_size.
С:
MPI_Group_size(MPI_Group group, int *size)
FORTRAN:
MPI_GROUP_SIZE(GROUP, SIZE, IERROR)
INTEGER GROUP, SIZE, IERROR
IN |
group |
- группа; |
OUT |
size |
- число процессов в группе. |
Функция возвращает число процессов в группе. Если group = MPI_GROUP_EMPTY, тогда size = 0.
Функция определения номера процесса в группе MPI_Group_rank.
С:
MPI_Group_rank(MPI_Group group, int *rank)
FORTRAN:
MPI_GROUP_RANK(GROUP, RANK, IERROR)
INTEGER GROUP, RANK, IERROR
IN |
group |
- группа; |
OUT |
rank |
- номер процесса в группе. |
Функция MPI_Group_rank возвращает номер процесса в группе, вызвавшего функцию. Если процесс не является членом группы, то возвращается значение MPI_UNDEFINED.
Функция установки соответствия между номерами процессов в двух группах MPI_Group_translate_ranks.
С:
MPI_Group_translate_ranks (MPI_Group group1, int n, int *ranks1,
MPI_Group group2, int *ranks2)
FORTRAN:
MPI_GROUP_TRANSLATE_RANKS(GROUP1,N, RANKS1, GROUP2,
RANKS2, IERROR)
INTEGER GROUP1, N, RANKS1(*), GROUP2, RANKS2(*), IERROR
IN |
group1 |
- |
группа1; |
IN |
n |
- |
число процессов, для которых устанавливается соответствие; |
IN |
ranks1 |
- |
массив номеров процессов из 1-й группы; |
IN |
group2 |
- |
группа2; |
OUT |
ranks2 |
- |
номера тех же процессов во второй группе. |
Функция определяет относительные номера одних и тех же процессов в двух разных группах. Если процесс во второй группе отсутствует, то для него устанавливается значениеа MPI_UNDEFINED.
Для создания новых групп в MPI имеется 8 функций. Группа может быть создана либо с помощью коммуникатора, либо с помощью операций над множествами процессов других групп.
Функция создания группы с помощью коммуникатора MPI_Comm_group.
С:
MPI_Comm_group(MPI_Comm comm, MPI_Group *group)
FORTRAN:
MPI_COMM_GROUP(COMM, GROUP, IERROR)
INTEGER COMM, GROUP, IERROR
IN |
comm |
- коммуникатор; |
OUT |
group |
- группа. |
Функция создает группу group для множества процессов, входящих в область связи коммуникатора comm.
Следующие три функции имеют одинаковый синтаксис и создают новую группу как результат операции над множествами процессов двух групп.
С:
MPI_Group_union(MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup)
MPI_Group_intersection(MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup)
MPI_Group_difference(MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup)
FORTRAN:
MPI_GROUP_UNION(GROUP1, GROUP2, NEWGROUP, IERROR)
MPI_GROUP_INTERSECTION(GROUP1, GROUP2, NEWGROUP, IERROR)
MPI_GROUP_DIFFERENCE(GROUP1, GROUP2, NEWGROUP, IERROR)
INTEGER GROUP1, GROUP2,NEWGROUP, IERROR
IN |
group1 |
- первая группа; |
IN |
group2 |
- вторая группа; |
OUT |
newgroup |
- новая группа. |
Операции определяются следующим образом:
Union |
- |
формирует новую группу из элементов 1-й группы и из элементов 2-й группы, не входящих в 1-ю (объединение множеств). |
Intersection |
- |
новая группа формируется из элементов 1-й группы, которые входят также и во 2-ю. Упорядочивание как в 1-й группе (пересечение множеств). |
Difference |
- |
новую группу образуют все элементы 1-й группы, которые не входят во 2-ю. Упорядочивание как в 1-й группе (дополнение множеств). |
Созданная группа может быть пустой, что эквивалентно MPI_GROUP_EMPTY.
Новые группы могут быть созданы с помощью различных выборок из существующей группы. Следующие две функции имеют одинаковый синтаксис, но являются дополнительными по отношению друг к другу.
С:
MPI_Group_incl(MPI_Group group, int n, int *ranks,
MPI_Group *newgroup)
MPI_Group_excl(MPI_Group group, int n, int *ranks,
MPI_Group *newgroup)
FORTRAN:
MPI_GROUP_INCL(GROUP, N, RANKS, NEWGROUP, IERROR)
MPI_GROUP_EXCL(GROUP, N, RANKS, NEWGROUP, IERROR)
INTEGER GROUP, N, RANKS(*), NEWGROUP, IERROR
IN |
group |
- существующая группа; |
IN |
n |
- число элементов в массиве ranks; |
IN |
ranks |
- массив номеров процессов; |
OUT |
newgroup |
- новая группа. |
Функция MPI_Group_incl создает новую группу, которая состоит из процессов существующей группы, перечисленных в массиве ranks. Процесс с номером i в новой группе есть процесс с номером ranks[i] в существующей группе. Каждый элемент в массиве ranks должен иметь корректный номер в группе group, и среди этих элементов не должно быть совпадающих.
Функция MPI_Group_excl создает новую группу из тех процессов group, которые не перечислены в массиве ranks. Процессы упорядочиваются как в группе group. Каждый элемент в массиве ranks должен иметь корректный номер в группе group, и среди них не должно быть совпадающих.
Две следующие функции по смыслу совпадают с предыдущими, но используют более сложное формирование выборки. Массив ranks заменяется двумерным массивом ranges, представляющим собой набор триплетов для задания диапазонов процессов.
С:
MPI_Group_range_incl(MPI_Group group, int n, int ranges[][3],
MPI_Group *newgroup)
MPI_Group_range_excl(MPI_Group group, int n, int ranges[][3],
MPI_Group *newgroup)
FORTRAN:
MPI_GROUP_RANGE_INCL(GROUP, N, RANGES, NEWGROUP, IERROR)
MPI_GROUP_RANGE_EXCL(GROUP, N, RANGES, NEWGROUP, IERROR)
INTEGER GROUP, N, RANGES(3,*), NEWGROUP, IERROR
Каждый триплет имеет вид: нижняя граница, верхняя граница, шаг.
Уничтожение созданных групп выполняется функцией MPI_Group_free.
С:
MPI_Group_free(MPI_Group *group)
FORTRAN:
MPI_GROUP_FREE(GROUP, IERROR)
INTEGER GROUP, IERROR
INOUT group - уничтожаемая группа.