Еще одним способом является деление сетки на участки меньшей размерности.
Например, можно создать коммуникатор для каждой строки сетки следующим
образом:
int varying_coords[2];
MPI_Comm row_comm;
Varying_coords[0] = 0; varying_coords[1] = 1;
MPI_Cart_sub(grid_comm, varying_coords, &);
Вызов MPI_Cart_sub() создает новых коммуникаторов. Аргумент
varying_coords является массивом логических значений. Они
определяют, принадлежит ли определенное измерение новому коммуникатору.
Поскольку в примере создаются коммуникаторы для строк сетки, то каждый
новый коммуникатор состоит из процессов, получающих фиксированную
координату строки, при этом позволяя координате колонки изменяться.
Поэтому varying_coords[0] принимает значение 0 - первая
координата не изменяется, а
varying_coords[1] принимает
значение 1 - вторая координата изменяется. В каждом процессе возвращается
новый коммуникатор row_comm. Чтобы создать коммуникаторы
для колонок, можно просто изменить оператор присваивания для элементов varying_coords:
MPI_Comm col_comm;
Varying_coords[0] = 1; varying_coords[1] = 0;
MPI_Cart_sub(grid_comm, varying_coord, col_comm);
MPI_Cart_sub() можно использовать только с коммуникатором,
ассоциированным с декартовой топологией. При этом новые коммуникаторы
могут быть созданы при фиксации одной или нескольких размерностей
старых коммуникаторов. Функция MPI_Cart_sub() является
коллективной операцией.