В программе умножения матриц нужно создать несколько коммуникаторов
- по одному для каждой строки процессов и по одному - для каждой колонки.
Это будет чрезвычайно утомительным процессом, если достаточно
большое, и каждый коммуникатор создается с использованием трех функции,
обсужденных ранее. Однако MPI содержит функцию MPI_Comm_split(),
которая может создать несколько коммуникаторов одновременно. Для иллюстрации
ее использования создаются коммуникаторы для каждой строки процессов:
MPI_Comm my_row_comm;
int my_row;
/* my_rank это ранг в MPI_COMM_WORLD.
* q*q = p */
my_row = my_rank/q;
MPI_Comm_split(MPI_COMM_WORLD, my_row, my_rank,
&my_row_comm);
Единственный вызов MPI_Comm_split() создает новых
коммуникаторов, причем все они имеют то же самое имя my_row_comm.
Например, если , то группа, принадлежащая my_row_comm
будет состоять из процессов 0, 1, и 2 на процессах 0, 1, и 2. На процессах
3, 4, и 5, группа, принадлежащая my_row_comm, будет состоять
из процессов 3, 4, и 5, и на процессах 6, 7, и 8 она будет состоять
из процессов 6, 7, и 8.
Синтаксис вызова MPI_Comm_split():
int MPI_Comm_split(MPI_Comm old_comm, int split_key,
int rank_key, MPI_Comm* new_comm)
Функция создает новый коммуникатор для каждого значения
split_key.
Процессы с рангами, равными split_key, формируют новую группу.
Ранг в новой группе определяется значением rank_key. Если
процесс А и процесс B вызывают MPI_Comm_split() с одинаковым
значением split_key, и аргумент rank_key, переданный
в процесс А, меньше аргумента процесса B, то ранг А в группе, принадлежащей
new_comm будет меньше, чем ранг процесса B. Если они вызывают
функцию с одинаковым значением rank_key, то система будет
произвольно назначать одному из процессов более низкий ранг.
MPI_Comm_split() является коллективной операцией, поэтому
ее нужно вызывать всем процессам из old_comm. Функция может
использоваться, даже если пользователь не желает назначать каждый
процесс на новый коммуникатор. Это можно выполнить, передав предопределенную
константу MPI_UNDEFINED в качестве аргумента split_key.
Процессы, выполнившие это, получат предопределенное значение MPI_COMM_NULL,
возвращенное в new_comm.