Интерфейс передачи сообщений 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 является коллективной операцией (эту подпрограмму должны вызывать все процессы из коммуникатора, наделяемого декартовой топологией).
Определение декартовых координат процесса по его рангу в группе
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 - значение "истина" разрешает изменение порядка нумерации процессов.
Определение вершин графа, соседних с данной
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.
Выходной параметр:
Определение количества соседей (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 для топологии графа).