[МУЗЫКА]
[МУЗЫКА] Здравствуйте,
уважаемые слушатели.
Сегодня мы с вами поговорим о функциях библиотеки MPI для
работы с виртуальной топологией графа.
Как вы уже знаете, создание новой виртуальной топологии предполагает
введение перенумерации узлов и введения новой схемы передачи данных.
Например, для декартовой топологии мы могли передавать данные в одном
из направлений, созданных в декартовой системе координат.
В виртуальной топологии графа узлы графа — это процессы, а ребра,
связывающие узлы графа, — это направления для передачи данных.
Таким образом, в виртуальной топологии графа у нас могут обмениваться данными
только смежные вершины, или, проще сказать, связанные процессы.
Для создания коммуникатора с декартовой топологией используется функция
MPI_Graph_create со следующими параметрами.
Эта функция из процессов имеющегося коммуникатора comm_old создает новый
коммуникатор с виртуальной топологией графа.
Вернемся к параметрам вызова функции.
nnode — это у нас число вершин графа,
которое соответствует количеству процессов во вновь создаваемом коммуникаторе.
Далее у нас идут два массива, которые заполняются следующим образом: массив
index — это целочисленный массив, длина которого nnode.
Заполняется следующим образом: i-тый элемент
содержит суммарное количество соседей для первых i вершин.
Массив edges заполняется следующим образом: в него по очереди заполняются
все номера вершин соседей.
И предпоследний параметр он у нас вновь указывает на то,
нужно ли проводить перенумерацию процессов в исходном коммуникаторе.
Сейчас мы с вами рассмотрим пример создания виртуальной топологии графа,
но перед этим еще несколько важных замечаний.
Во-первых, эта функция коллективная и должна вызываться на
всех процессах исходного коммуникатора.
Второе, если у нас число процессов в исходном коммуникаторе больше,
чем требуется для создания виртуальной топологии, то для части процессов в
качестве коммуникатора будет возвращено значение MPI_COMM_NULL.
То есть для части процессоров новый коммуникатор создан не будет.
Если же процессов, наоборот, не хватает для создания новой виртуальной топологии,
то функция завершит свое выполнение с ошибкой.
Теперь давайте рассмотрим пример создания виртуальной топологии графа.
Вот у нас есть граф, в нем 6 вершин, поэтому параметр nnode будет равен 6.
Теперь рассмотрим, как заполняются массивы.
Напомню, массив index i-тый элемент в нем содержит сумму вершин первых i процессов.
Поэтому для процесса 0 у нас соседа 2, поэтому index(0) будет равен 2.
У следующей вершины 1 у нас 3 соседа,
поэтому мы к имеющимся вершинам добавляем еще 3, и index(1) будет равно 5.
У следующей вершины — второй — у нас 2 соседа,
поэтому к имеющейся сумме вершин добавляем еще 2.
index(2) будет равен 7.
И так далее заполняется этот массив.
Следующий массив содержит упорядоченный набор соседей для всех вершин.
Заполняется следующим образом: у вершины 0 у нас 2 соседа,
заполняем 2 элемента массива.
У вершины 1 у нас еще 3 соседа.
Заполняем еще 3 элемента массива.
И так далее до конца.
Таким образом,
если мы хотим создать виртуальную топологию графа для заданного графа, мы
должны наш исходный граф проанализировать и составить соответствующие массивы.
И затем, вызвав функцию MPI_Graph_create,
мы уже получим топологию с необходимой нам схемой организации обменов.
После того как мы создали топологию графа, нам нужно иметь возможность для каждого
процесса определить, сколько у него соседей,
для каждого процесса определить номера соседних процессов.
Для этого используется две следующие функции.
Похожий синтаксис у них.
Параметры вызова следующие.
Первое — это коммуникатор с топологией графа, второе — это номер процесса,
для которого мы будем определять либо количество соседей,
либо номера этих соседей.
Первая функция у нас определяет количество соседей и возвращает это количество
в последние параметры,
а вторая функция определяет номера соседей и возвращает их номера в массиве,
который является последним параметром при вызове этой функции.
Используя эти функции, мы можем для каждого процесса теперь определить номера
соседей и количество, а используя функции Send и Recieve, которые мы уже знаем,
мы можем организовать обмены непосредственно только между соседями.
Таким образом, мы познакомились с функцией создания виртуальной топологии графа
и с функциями для определения количества соседей и номеров соседей.
На этом лекция подошла к концу.
Спасибо за внимание и до следующей встречи.