next up previous contents
Next: Топологии Up: Коммуникаторы и топологии Previous: Работа с группами, контекстами   Contents

Функция MPI_Comm_split

В программе умножения матриц нужно создать несколько коммуникаторов - по одному для каждой строки процессов и по одному - для каждой колонки. Это будет чрезвычайно утомительным процессом, если $p$ достаточно большое, и каждый коммуникатор создается с использованием трех функции, обсужденных ранее. Однако 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() создает $q$ новых коммуникаторов, причем все они имеют то же самое имя my_row_comm. Например, если $p=9$, то группа, принадлежащая 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.



2004-06-22