Синтаксис функции MPI_GRAPH_CREATE представлен ниже.
MPI_GRAPH_CREATE(comm_old, nnodes, index, edges, reorder, comm_graph)
IN | comm_old | входной коммуникатор (дескриптор) | |
IN | nnodes | количество узлов графа (целое) | |
IN | index | массив целочисленных значений, описывающий степени вершин (смотри ниже) | |
IN | edges | массив целочисленных значений, описывающий ребра графа (смотри ниже) | |
IN | reorder | номера могут быть переупорядочены (true) или нет (false) | |
OUT | comm_graph | построенный коммуникатор с графовой топологией (дескриптор) |
int MPI_Graph_create(MPI_Comm comm_old, int nnodes,
int *index, int *edges, int reorder, MPI_Comm *comm_graph)
MPI_GRAPH_CREATE(COMM_OLD, NNODES, INDEX,
EDGES, REORDER, COMM_GRAPH, IERROR)
INTEGER COMM_OLD, NNODES, INDEX(*), EDGES(*), COMM_GRAPH, IERROR
LOGICAL REORDER
Graphcomm Intracomm::Create_graph(int nnodes,
const int index[], const int edges[], bool reorder) const
Функция MPI_GRAPH_CREATE передает дескриптор новому коммуникатору, к которому присоединяется информация о графовой топологии. Если reorder = false, то номер каждого процесса в новой группе идентичен его номеру в старой группе. В противном случае функция может переупорядочивать процессы. Если размер декартовой решетки nnodes меньше, чем размер группы коммуникатора, то некоторые процессы возвращаются значение MPI_COMM_NULL, по аналогии с MPI_CART_SPLIT и MPI_COMM_SPLIT. Вызов будет неверным, если он определяет граф большего размера, чем размер группы исходного коммуникатора.
Структуру графа определяют три параметра nnodes, index и edges. nnodes - число узлов графа, узлы маркируются от 0 до nnodes-1. i-ый элемент массива index хранит общее число соседей первых i вершин графа. Списки соседей вершин 0, 1, ..., nnodes-1 хранятся в последовательности ячеек массива edges. Общее число элементов в index есть nnodes, а общее число элементов в edges равно числу ребер графа.
Определения аргументов nnodes, index, и edges иллюстрируются следующим простым примером.
Пример 6.2. Пусть имеются четыре процесса 0, 1, 2, 3 со следующей матрицей смежности:
process | neighbors |
0 | 1, 3 |
1 | 0 |
2 | 3 |
3 | 0, 2 |
Тогда исходными аргументами являются:
nnodes = |
4 |
index = |
2, 3, 4, 6 |
еdges = |
1, 3, 0, 3, 0, 2 |
Таким образом в языке Си index[0] есть степень вершины нуль, а index [i] - index[i-1] есть степень вершины i, i = 1, ..., nnodes-1; список соседей узла нуль хранится в edges[j], где , a список соседей верщины i, i > 0 хранится в edges[j], где index[i-1] .
В языке ФОРТРАН index (1) есть степень вершины нуль, а index (i+1) - index(i) есть степень вершины i, i = 1, ..., nnodes-1; список соседей вершины нуль хранится в edges(j), где 1 j index(1), а список соседей вершины i, i> 0 хранится в edges(j), где index(i) + 1 j index(i +1).
Совет разработчикам: С коммуникатором в общем случае должна храниться следующая топологическая информация:
Для графовой структуры число вершин равно числу процессов в группе. Следовательно, число вершин не обязательно хранить явно. Дополнительный нулевой элемент в начале массива index упрощает доступ к топологической информации.[]