ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
69
Подпрограмма MPI_Comm_split позволяет создать несколько коммуникаторов
сразу:
int MPI_Comm_split(MPI_Comm oldcomm, int split, int rank, MPI
Comm* newcomm)
MPI_COMM_SPLIT(OLDCOMM, SPLIT, RANK, NEWCOMM, IERR)
Группа процессов, связанных с коммуникатором oldcomm, разбивается на не-
пересекающиеся подгруппы, по одной для каждого значения аргумента split. Про-
цессы с одинаковым значением split образуют новую группу. Ранг в новой группе
определяется значением rank. Если процессы А и В вызывают MPI_Comm_split с
одинаковым значением split, а аргумент rank, переданный процессом А, меньше, чем
аргумент, переданный процессом В, ранг А в группе, соответствующей новому
коммуникатору, будет меньше ранга процесса В. Если же в вызовах используется
одинаковое значение rank, система присвоит ранги произвольно. Для каждой под-
группы создается собственный коммуникатор newcomm.
MPI_Comm_split — коллективная подпрограмма, ее должны вызвать все про-
цессы из старого коммуникатора, даже если они и не войдут в новый коммуникатор.
Для этого в качестве аргумента split в подпрограмму передается предопределенная
константа MPI_UNDEFINED. Соответствующие процессы вернут в качестве нового
коммуникатора значение MPI_COMM_NULL. Новые коммуникаторы, созданные
подпрограммой MPI_Comm_split, не пересекаются, однако с помощью повторных
вызовов подпрограммы MPI_Comm_split можно создавать и перекрывающиеся
коммуникаторы.
Пример расщепления коммуникатора:
CALL MPI_COMM_RANK(COMM, RANK, IERR)
CALL MPI_COMM_SIZE(COMM, SIZE, IERR)
SPLIT = 2 * RANK/SIZE
KEY = SIZE - RANK - 1
CALL MPI_COMM_SPLIT(COMM, SPLIT, KEY, NEWCOMM, IERR)
В следующем примере создаются три новых коммуникатора (если исходный
коммуникатор comm содержит не менее трех процессов):
MPI_Comm comm, newcomm;
int rank, split;
MPI_Comm_rank (comm, &rank);
split = rank%3;
MPI_Comm_split(comm, split, rank, &newcomm);