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

Функция MPI_Cart_sub

Еще одним способом является деление сетки на участки меньшей размерности. Например, можно создать коммуникатор для каждой строки сетки следующим образом:

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() создает $q$ новых коммуникаторов. Аргумент 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() является коллективной операцией.



2004-06-22