Как происходит обратная связь в MIP? - PullRequest
0 голосов
/ 13 марта 2020

Например, у меня есть процесс root, который отправляет некоторые вычисления для выполнения рабочими процессами. Но поскольку у меня ограниченные (4) процессы, я должен разделить рабочую нагрузку со всеми из них, поэтому отправляю несколько раз. Обходной путь, который я нашел, заключается в следующем:


    int me = MPI.COMM_WORLD.Rank();

    if(me == 0) {
        sendToWorkers(); //Sends more than once to workers.
    }
    else {
        while(true) {//wait indefinitely, accept data received from root process and work on it.
            MPI.COMM_WORLD.Recv(Buf, 0, Buf.length, MPI.INT, 0, 0);
            doTask(Buf);
        }
    }

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

РЕДАКТИРОВАТЬ 1: Причина, по которой я хочу отправить процесс root, заключается в том, что он чище. Тем не менее, в качестве альтернативы, я могу просто распечатать вычисленные решения из рабочих процессов, но выходные данные искажены из-за чередования. Объявление метода print как synchronized не работает.

1 Ответ

0 голосов
/ 13 марта 2020

Одно простое решение - в конце распределения задач, мастер должен отправить сообщение "FINISH/STOP/END" (любое пользовательское сообщение , чтобы указать, что задачи завершены) всем работникам. Рабочие, получающие сообщение fini sh, выходят из l oop и отправляют результат мастеру. Мастер может начать все oop с общего количества задач и ждет этих результатов.

Из показанного вами примера это типичный пример использования мастер-модели. Здесь, когда вы отправляете задачу работнику, используя MPI_Send(), в вашем рабочем процессе есть соответствующий MPI_Recv(). После получения задания вы выполняете doTask(Buf). Затем вы снова идете к l oop. Таким образом, в вашем случае, чтобы подвести итог, вы получаете новое задание только после вычисления ранее полученного задания для этого ранга, верно? В этом случае главный процесс также может ожидать ответа от любой из законченных задач и может отправлять новые задачи на основе этого. Может быть, вы можете рассмотреть этот подход. Если ваш doTask использует поток, это становится сложным. Затем каждый рабочий узел должен отслеживать свои задачи, и после того, как все задачи будут выполнены, мастер должен запустить все oop и дождаться результатов.

Или вы можете использовать многопоточную реализацию. Вы можете использовать отдельную ветку для отправки и получения в мастере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...