Я хотел бы написать программу MPI, в которой мастер-поток непрерывно представляет рабочим новую работу (т.е. не только в начале, как в шаблоне MapReduce).
Первоначально, допустим, я подаю 100 рабочих мест на 100 рабочих.
Затем я хотел бы получить уведомление, когда работник заканчивает работу. Я бы отправил следующую работу, параметры которой зависят от всех полученных результатов. Порядок результатов не должен быть сохранен, мне просто нужно, чтобы они заканчивались.
Я могу работать с C / C ++ / Python.
Из документации кажется, что я могу транслировать N заданий и собирать результаты. Но это не то, что мне нужно, так как у меня не все они доступны, и сбор будет блокировать. По сути, я ищу асинхронный вызов recv для любого рабочего.
Ты можешь использовать MPI_ANY_SOURCE
а также MPI_ANY_TAG
для получения из любого места. После получения вы можете прочитать информацию (источник и тег) из MPI_Status
структура, которая должна быть передана в вызов MPI_Recv.
Если вы используете это, вам не нужно никакой асинхронной связи, так как мастер «слушает» всех, кто запрашивает новые задания и возвращает результаты; и каждый раб выполняет свою задачу, а затем отправляет результат мастеру, запрашивает новую работу и ждет ответа от мастера.
Вам вообще не нужно работать с scatter / collect, так как они предназначены для использования с массивом данных, и ваша проблема, похоже, имеет более или менее независимые задачи.
Других решений пока нет …