Выполнение узлов графа (в виде задач) с использованием MPI - PullRequest
0 голосов
/ 27 июля 2011

Я изучаю MPI, но у меня есть некоторые сомнения по поводу его правильного использования. Я использую MPJ Express.

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

Вот что я сделал:

-Я рассчитал индексы, которые каждый из моих узлов будет иметь как процесс MPI (RANK). Затем я использую Isend для отправки информации, в которой нуждается каждый узел: задача, которую он должен выполнить, и ранги его выходных узлов. Теперь, когда процесс завершает свои вычисления, он отправляет вычисленные значения процессам, идентифицированным рангами, которые он получил вначале. Каждый процесс ожидает ввода значений, используя Irecv.

Это сработало хорошо, но предварительный расчет всего индекса (RANK) мне не кажется правильным. Я думал, что это может быть распространенным сценарием, но я не нашел ничего полезного.

Что ты думаешь? Правильно ли как-то вычислять ранг, который будет иметь каждый процесс, и сообщать каждому процессу ранги его процессов вывода и ввода?

-Я выполняю выполнение с -np 10, сейчас:

Что означает 10, если у меня 2 ядра?

Я думаю, что я должен отправить каждое задание одному из этих 10 процессов. Что произойдет, если у меня будет больше задач, чем процессов?

Если у меня меньше задач, чем процессов, выполнение идет хорошо, но неиспользуемые процессы остаются живыми, ожидая сообщения. Как мне их убить?

Надеюсь, я хорошо объяснил свои сомнения.

Большое спасибо за ваши ответы и советы.

Отредактировано: Небольшое объяснение того, как я получаю ранги, которые каждая задача будет иметь как процесс.

То, что я делаю, очень просто (и, возможно, глупо): предположим, у меня есть список со всеми моими узлами [v1, v2, v3] с индексами 0,1,3 соответственно.

Я знаю, что процесс с рангом 0 будет основным процессом, который отправит задачу v1 для обработки с рангом 1, v2 для обработки с рангом 2 и так далее. Теперь я знаю, что этот ранг (v1) = индекс (v1) +1 и то же самое для остальных узлов (это был предварительный расчет рангов).

Затем мастер перебирает список [v1, v2, v3] и для каждого узла получает ранги своих предшественников и преемников на основе графа. Например, если граф v1-> v3-> v2, информация, отправляемая для обработки с рангом 3, будет: task: v3, предшественники: (процесс с рангом 1). преемник: (процесс с рангом 2).

...