Санкт-Петербургский государственный университет
Опубликован: 11.02.2010 | Доступ: свободный | Студентов: 523 / 90 | Оценка: 4.41 / 4.44 | Длительность: 08:19:00
Специальности: Программист
Лекция 3:

Интерфейс передачи сообщений MPI

Топологии

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

Создание нового коммуникатора comm_cart посредством наделения декартовой топологией исходный коммуникатор comm_old (рис. 3.10)

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

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

Рис. 3.10. Декартова топология

Определение декартовых координат процесса по его рангу в группе

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 ), содержащий декартовы координаты процесса.

Определение ранга процесса (rank) по его декартовым координатам в коммуникаторе comm int

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

MPI_CART_RANK(COMM, COORDS, RANK, IERR)

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

  • coords - целочисленный массив размера ndims, задающий декартовы координаты процесса. Как MPI_Cart_rank, так и MPI_Cart_coords локальны.

Расщепление коммуникатора comm на подгруппы, соответствующие декартовым подрешеткам меньшей размерности

int MPI_Cart_sub(MPI_Comm comm, int *remain_dims, MPI_Comm *comm_new)
MPI_CART_SUB(COMM, REMAIN_DIMS, COMM_NEW, IERR)

I -й элемент массива remain_dims определяет, содержится ли I-е измерение в подрешетке ("истина"). Выходной параметр:

  • newcomm - коммуникатор, содержащий подрешетку, которой принадлежит данный процесс.

Подпрограмма MPI_Cart_sub используется только с коммуникатором, наделенным декартовой топологией.

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

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 - целочисленный массив, задающий декартовы координаты вызывающего подпрограмму процесса.

Определение ранга процесса (newrank) в декартовой топологии после переупорядочения процессов

int MPI_Cart_map(MPI_Comm comm_old, int ndims, int *dims, int *periods, int *newrank)
MPI_CART_MAP(COMM_OLD, NDIMS, DIMS, PERIODS, NEWRANK, IERR)

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

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

Если процесс не принадлежит решетке, подпрограмма возвращает значение MPI_UNDEFINED.

Определение рангов источника (source) сообщения, которое должно быть принято, и адресата (dest), который должен получить сообщение для заданного направления сдвига (direction) и его величины (disp)

int MPI_Cart_shift(MPI_Comm comm, int direction, int displ, int *source,  int *dest)
MPI_CART_SHIFT(COMM, DIRECTION, DISPL, SOURCE, DEST, IERR)

Для n -мерной декартовой решетки значение аргумента direction должно находиться в пределах от 0 до n-1.

Определение размерности (ndims) декартовой топологии, связанной с коммуникатором

int MPI_Cartdim_get(MPI_Comm comm,  int *ndims) MPI_CARTDIM_GET(COMM, NDIMS, IERR)

Создание нового коммуникатора comm_graph, наделенного топологией графа (рис. 3.11)

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 - значение "истина" разрешает изменение порядка нумерации процессов.
Виртуальная топология графа

Рис. 3.11. Виртуальная топология графа

Определение вершин графа, соседних с данной

int MPI_Graph_neighbors(MPI_Comm comm, int rank, int maxneighbors, int *neighbors)
MPI_GRAPH_NEIGHBORS(COMM,  RANK,  MAXNEIGHBORS,  NEIGHBORS,   IERR)

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

  • comm - коммуникатор с топологией графа;
  • rank - ранг процесса в группе коммуникатора comm ;
  • maxneighbors - размер массива neighbors.

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

  • neighbors - массив, содержащий ранги процессов, соседних с данным.

Определение количества соседей (nneighbors) узла, связанного с топологией графа

int MPI_Graph_neighbors_count(MPI_Comm comm,  int rank,  int *nneighbors)

MPI_GRAPH_NEIGHBORS_COUNT(COMM, RANK, NNEIGHBORS, IERR)

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

  • comm - коммуникатор;
  • rank - ранг процесса-узла.

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

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 - целочисленный массив, содержащий структуру графа (см. описание подпрограммы MPI_Graph_create );
  • edges - целочисленный массив, содержащий сведения о ребрах графа.

Определение ранга процесса в топологии графа после переупорядочения (newrank)

int MPI_Graph_map(MPI_Comm comm,  int nnodes,  int *index,  int *edges, int *newrank)
MPI_GRAPH_MAP(COMM, NNODES, INDEX, EDGES, NEWRANK, IERR)

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

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

Если процесс не принадлежит графу, подпрограмма возвращает значение MPI_UNDEFINED.

Получение информации о топологии графа, связанной с коммуникатором 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 для топологии графа).