Параллельное программирование: Учебное пособие, страница 120

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

int MPI_Cart_shift(MPI_Comm comm, int direction,

int displ, int *source, int *dest)

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

Подпрограмма MPI_Cartdim_get позволяет определить размерность ndims декартовой топологии, связанной с коммуникатором comm:

int MPI_Cartdim_get(MPI_Comm comm, int *ndims)

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

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

int MPI_Graph_create(MPI_Comm comm, int nnodes,

int *index, int *edges, int reorder,

MPI_Comm *comm_graph)

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

·  comm —исходный коммуникатор, не наделенный топологией;

·  nnodes — количество вершин графа;

·  index — целочисленный одномерный массив, содержащий порядок каждого узла (количество связанных с ним ребер – положительная полустепень вершины);

·  edges — целочисленный одномерный массив, описывающий ребра графа;

·  reorder — значение true разрешает изменение порядка нумерации процессов.

Подпрограмма  MPI_Graph_neighbors  возвращает соседние с данной вершины графа:

int MPI_Graph_neighbors(MPI_Comm comm, int rank,

int maxneighbors, int *neighbors)

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

·  comm — коммуникатор с топологией графа;

·  rank — ранг процесса в группе коммуникатора comm;

·  maxneighbors — размер массива neighbors.

Выходным параметром является массив neighbors, содержащий ранги процессов, соседних с данным.

Количество соседей (nneighbors) узла, связанного с топологией графа, можно определить с помощью подпрограммы MPI_Graph_neighbors_count:

int MPI_Graph_neighbors_count(MPI_Comm comm,

int rank, int *nneighbors)

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

·  comm — коммуникатор;

·  rank — ранг процесса-узла.

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

int MPI_Graph_get(MPI_Comm comm, int maxindex,

int maxedges, int *index, int *edges)

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

·  comm — коммуникатор;

·  maxindex — длина массива index в вызывающей программе;

·  maxedges — длина массива edges в вызывающей программе.

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

·  index — целочисленный массив, содержащий структуру графа (см. описание подпрограммы MPI_Graph_create);

·  edges — целочисленный массив, содержащий сведения о ребрах графа.

С помощью подпрограммы MPI_Graph_map можно определить ранг процесса в топологии графа после переупорядочения (newrank):

int MPI_Graph_map(MPI_Comm comm, int nnodes,

int *index, int *edges, int *newrank)

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

·  comm — коммуникатор;

·  nnodes — количество вершин графа;

·  index — целочисленный массив, задающий структуру графа (см. описание подпрограммы MPI_Graph_create);

·  edges — целочисленный массив, задающий ребра графа.

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

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

int MPI_Graphdims_get(MPI_Comm comm,

int *nnodes, int *nedges)

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

·  nnodes — количество вершин графа;

·  nedges — количество ребер графа.

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

int MPI_Topo_test(MPI_Comm comm, int *toptype)

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

6.5  Производные типы данных

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