<< Назад в библиотеку
ТопологииАвтор: Р.Х. Садыхов, Л.П. Поденок, А.В. Отвагин, И.И. Глецевич, Д.А. ПынькинИсточник: http://skif.bas-net.by/bsuir/book_prog/node162.htmlРанее было указано, что существует возможность связать с коммуникатором дополнительную информацию, которая находится вне группы и контекста. Эта дополнительная информация кэширована с коммуникатором, и одной из самых важных ее частей является топология. В MPI топология представляет собой механизм для того, чтобы связать с процессами, принадлежащими группе, различные схемы адресации. Топология MPI - виртуальная, т. е. может не существовать никакого простого отношения между структурой процессов, определенной виртуальной топологией и фактической физической структурой параллельной машины. Известны два основных типа виртуальной топологии, которая может быть создана MPI, - декартова топология, или топология сетки, и топология графа. Первый тип является подмножеством второго. Однако из-за активного использования сеток в приложениях выделяется отдельное подмножество функций MPI, цель которого - манипуляция виртуальными сетками. В алгоритме Фокса необходимо идентифицировать процессы MPI_COMM_WORLD координатами квадратной сетки, причем каждая строка и колонка сетки должны формировать свой собственный коммуникатор. Сначала необходимо связать квадратную структуру сетки с MPI_COMM_WORLD. Чтобы сделать это, нужно определить следующую информацию:
После этого нужно просто выполнить код: MPI_Comm grid_comm; int dimensions[2]; int wrap_around[2]; int reorder = 1; dimensions[0] = dimensions[1] = q; wrap_around[0] = wrap_around[1] = 1; MPI_Cart_create(MPI_COMM_WORLD, 2, dimensions, wrap_around, reorder, &grid_comm); После выполнения кода коммуникатор grid_comm будет содержать все процессы MPI_COMM_WORLD (возможно переупорядоченные) и ассоциированную с ними двухмерную систему декартовых координат. Чтобы процесс мог определить свои координаты, он должен вызвать функцию MPI_Cart_coords(): int coordinates[2]; int my_grid_rank; MPI_Comm_rank(grid_comm, &my_grid_rank); MPI_Cart_coords(grid_comm, my_grid_rank, 2, coordinates); Следует отметить, что для получения ранга процесса в grid_comm нужно вызвать MPI_Comm_rank(). Это необходимо потому, что в вызове MPI_Cart_create() установлен флаг переупорядочения и, следовательно, первоначальный ранг процесса в MPI_COMM_WORLD, возможно, будет изменен в grid_comm. Обратной функцией к MPI_Cart_coords() является MPI_Cart_rank(): int MPI_Cart_rank(grid_comm, coordinates, &grid_rank) Задавая координаты процесса, с помощью MPI_Cart_rank() можно получить ранг этого процесса в process_rank. Синтаксис MPI_Cart_create(): int MPI_Cart_create(MPI_Comm old_comm, int number_of_dims, int* dim_sizes, int* periods, int reorder, MPI_Comm* cart_comm) MPI_Cart_create() создает новый коммуникатор cart_comm путем кэширования декартовой топологии с old_comm. Информация относительно структуры декартовой топологии содержится в параметрах number_of_dims, dim_sizes, periods. Первый параметр содержит число измерений в декартовой системе координат. Следующие два являются массивами с размером, равным числу измерений. Массив dim_sizes определяет порядок каждого измерения, а periods определяет, является ли измерение циклическим или линейным. Процессы в cart_comm ранжируются в порядке строк. При этом первый ряд состоит из процессов 0, 1,..., dim_sizes[0]-1, второй ряд - из процессов dim_sizes[0],dim_sizes[0]+1 , ... , 2*dim_sizes[0]-1 и т.д. Таким образом, иногда выгодно изменить относительное ранжирование процессов в old_comm. Например, пусть физическая топология - это сетка 3x3,а процессы (номера) в old_comm назначены на процессоры (квадраты сетки) следующим образом (рис. 5): Поскольку MPI_Cart_create() создает новый коммуникатор, она является коллективной операцией. Синтаксис функций, возвращающих адресную информацию: int MPI_Cart_rank(MPI_Comm comm, int* coordinates, int* rank); int MPI_Cart_coords(MPI_Comm comm, int rank, int number_of_dims, int* coordinates) MPI_Cart_rank() возвращает ранг процесса в декартовом коммуникаторе comm, при этом процесс имеет координаты coordinates. Координаты содержатся в массиве в порядке, эквивалентном порядку размерностей декартовой топологии, ассоциированной с comm. MPI_Cart_coords() возвращает координаты процесса с рангом rank в декартовом коммуникаторе comm. Обе функции являются локальными. |
![]() |
© 2010 Александр Иванов ДонНТУ | Портал магистров |
![]() |