Санкт-Петербургский государственный университет
Опубликован: 11.10.2012 | Доступ: свободный | Студентов: 955 / 173 | Длительность: 05:14:00
Лекция 7:

Виртуальные топологии

< Лекция 6 || Лекция 7: 12 || Лекция 8 >

Виртуальные топологии

Организация обмена основана на свойствах коммуникатора - описателя области взаимодействия. Кроме списка процессов и контекста обмена с коммуникатором может быть связана дополнительная информация.

Важнейшей разновидностью такой информации является топология обменов. В MPI топология представляет собой механизм сопоставления процессам, принадлежащим группе, альтернативных по отношению к обычной схем нумерации.

Топологии обменов сообщениями в MPI являются виртуальными, они не связаны с физической топологией коммуникационной сети параллельной вычислительной системы. Использование коммуникаторов и топологий отличает MPI от большинства других систем передачи сообщений.

Топологией в данном случае называют структуру соединений - линий и узлов сети без учета характеристик самих этих узлов. Узлами здесь являются процессы, соединениями - каналы обмена сообщениями, а сетью мы, фактически, называем все процессы, входящие в состав параллельной программы.

Часто в прикладных программах процессы упорядочены в соответствии с определенной топологией. Такая ситуация возникает, например, если выполняются расчеты, в которых используются решетки (сетки). Это может быть при программировании сеточных методов решения дифференциальных уравнений, а также в других случаях.

Знание топологии задачи можно использовать для того, чтобы эффективно распределить процессы между процессорами параллельной вычислительной системы.

В MPI существуют два типа топологии: декартова топология — прямоугольная решетка произвольной размерности и топология графа (в этом случае процессы соединены между собой ребрами, показывающими направление обмена).


Над топологиями можно выполнять различные операции. Декартовы решетки можно расщеплять на гиперплоскости, удаляя некоторые измерения. Данные можно сдвигать вдоль выбранного измерения декартовой решетки. Сдвигом в этом случае называют пересылку данных между процессами вдоль определенного измерения. Вдоль избранного измерения могут быть организованы коллективные обмены.

Для того, чтобы связать структуру декартовой решетки с коммуникатором MPI_COMM_WORLD, необходимо задать следующие параметры:

  • размерность решетки (значение 2, например, соответствует плоской решетке);
  • размер решетки вдоль каждого измерения (размеры {10, 5}, например, соответствуют прямоугольной плоской решетке, протяженность которой вдоль оси x составляет 10 узлов-процессов, а вдоль оси y - 5 узлов);
  • граничные условия вдоль каждого измерения (решетка может быть периодической, если процессы, находящиеся на противоположных концах ряда, взаимодействуют между собой).

MPI дает возможность системе оптимизировать отображение виртуальной топологии процессов на физическую с помощью изменения порядка нумерации процессов в группе.

Декартова топология

Познакомимся с операциями создания и преобразования декартовых топологий обмена. Подпрограмма MPI_Cart_create создает новый коммуникатор comm_cart, наделяя декартовой топологией исходный коммуникатор comm_old:

  int MPI_Cart_create(MPI_Comm comm_old, int ndims, int *dims, int *periods, int reorder, MPI_Comm *comm_cart)

MPI_Cart_create(comm_old, ndims, dims, periods, reorder, comm_cart, ierr)

Входные параметры:

  • comm_old - исходный коммуникатор;
  • ndims - размерность декартовой решетки;
  • dims - целочисленный массив, состоящий из ndims элементов, задающий количество процессов в каждом измерении;
  • periods - логический массив из ndims элементов, который определяет, является ли решетка периодической (значение true) вдоль каждого измерения;
  • reorder - при значении этого параметра "истина", системе разрешено менять порядок нумерации процессов.

Информация о структуре декартовой топологии содержится в параметрах ndims, dims и periods.

MPI_Cart_create является коллективной операцией (эту подпрограмму должны вызывать все процессы из коммуникатора, наделяемого декартовой топологией).

После создания виртуальной топологии можно использовать соответствующую схему адресации процессов, но для этого требуется пересчет ранга процесса в его декартовы координаты и наоборот. Определить декартовы координаты процесса по его рангу в группе можно с помощью подпрограммы MPI_Cart_coords:

  int MPI_Cart_coords(MPI_Comm comm, int rank, int maxdims, int *coords)

MPI_Cart_coords(comm, rank, maxdims, coords, ierr)

Входные параметры:

  • comm - коммуникатор, наделенный декартовой топологией;
  • rank - ранг процесса в comm;
  • maxdims - длина вектора coords в вызывающей программе.

Выходным параметром этой подпрограммы является одномерный целочисленный массив coords (его размер равен ndims), содержащий декартовы координаты процесса.

Обратным действием обладает подпрограмма MPI_Cart_rank. С ее помощью можно определить ранг процесса (rank) по его декартовым координатам в коммуникаторе comm:

  int MPI_Cart_rank(MPI_Comm comm, int *coords, int *rank)

MPI_Cart_rank(comm, coords, rank, ierr)

Входной параметр coords - целочисленный массив размера ndims, задающий декартовы координаты процесса.

Пример

  #include "mpi.h";
  #include <stdio.h>;
  int main(int argc,char *argv[])
  {
  MPI_Comm grid_comm;
  int dims[2];
  int periodic[2];
  int reorder = 1, q = 5, ndims = 2, maxdims = 2;
  int coordinates[2];
  int my_grid_rank;
  int coords[2];
  MPI_Comm row_comm;
   dims[0] = dims[1] = q;
  periodic[0] = periodic[1] = 1;
  coords[0] = 0; coords[1] = 1;
  MPI_Init(&argc, &argv);
  MPI_Cart_create(MPI_COMM_WORLD, ndims, dims, periodic, reorder, &grid_comm);
  MPI_Comm_rank(grid_comm, &my_grid_rank);
  MPI_Cart_coords(grid_comm, my_grid_rank, maxdims, coordinates);
  printf("Process rank %i has coordinates %i %i\n", my_grid_rank, coordinates[0], coordinates[1]);
  MPI_Finalize();
  return 0;
  }

Информацию о декартовой топологии, связанной с коммуникатором comm, можно получить с помощью подпрограммы MPI_Cart_get:

int MPI_Cart_get(MPI_Comm comm, int maxdims, int *dims, int *periods, int *coords)

MPI_Cart_get(comm, maxdims, dims, periods, coords, ierr)

Входной параметр maxdims задает длину массивов dims, periods и vectors в вызывающей программе, а выходные параметры:

  • dims - целочисленный массив, задающий количество процессов для каждого измерения;
  • periods - массив логических значений, задающих периодичность (true, если решетка периодическая) для каждого измерения;
  • coords - целочисленный массив, задающий декартовы координаты вызывающего подпрограмму процесса.

Топология графа

Подпрограмма MPI_Graph_create создает новый коммуникатор comm_graph, наделенный топологией графа:

int MPI_Graph_create(MPI_Comm comm, int nnodes, int *index, int *edges, int reorder, MPI_Comm *comm_graph)

MPI_Graph_create(comm, nnodes, index, edges, reorder, comm_graph, ierr)

Входные параметры:

  • comm - исходный коммуникатор, не наделенный топологией;
  • nnodes - количество вершин графа;
  • index - целочисленный одномерный массив, содержащий порядок каждого узла (количество связанных с ним ребер);
  • edges - целочисленный одномерный массив, описывающий ребра графа;
  • reorder - значение "истина" разрешает изменение порядка нумерации процессов.

Получить информацию о топологии графа, связанной с коммуникатором comm, можно с помощью подпрограммы MPI_Graph_get:

int MPI_Graph_get(MPI_Comm comm, int maxindex, int maxedges, int *index, int *edges)

MPI_Graph_get(comm, maxindex, maxedges, index, edges, ierr)

Входные параметры:

  • comm - коммуникатор;
  • maxindex - длина массива index в вызывающей программе;
  • maxedges - длина массива edges в вызывающей программе.

Выходные параметры:

  • index - целочисленный массив, содержащий структуру графа;
  • edges - целочисленный массив, содержащий сведения о ребрах графа.

Подпрограмма MPI_Graphdims_get позволяет получить информацию о топологии графа, связанной с коммуникатором comm:

  int MPI_Graphdims_get(MPI_Comm comm, int *nnodes, int *nedges)

MPI_Graphdims_get(comm, nnodes, nedges, ierr)

Выходными параметрами этой подпрограммы являются:

  • nnodes - количество вершин графа;
  • nedges - количество ребер графа.

Определить тип топологии (toptype), связанной с коммуникатором comm, можно с помощью подпрограммы:

int MPI_Topo_test(MPI_Comm comm, int *toptype)

MPI_TOPO_TEST(COMM, TOPTYPE, IERR)

Выходным параметром является тип топологии toptype (значения MPI_CART для декартовой топологии и MPI_GRAPH для топологии графа).

< Лекция 6 || Лекция 7: 12 || Лекция 8 >