Прекращение всех процессов с помощью MPI

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

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

Как я могу сделать это с помощью MPI?

Ответ 1

Вы можете использовать MPI_Abort(MPI_COMM_WORLD), чтобы полностью закрыть все и после. Более контролируемое решение будет заключаться в том, чтобы процесс отправки неблокирующей отправки с назначенным тегом к каждому другому процессу, когда он находит решение, и каждый процесс проверяет в конце итерации с неблокирующим принятием, было ли такое сообщение отправлено кто-нибудь.

Ответ 2

В MPI не так много способов "push" уведомлений, поэтому вы не можете заставить другие процессы (а не потоки, важное различие в этом случае!) знать, что что-то произошло.

@pmg прав, вы можете обновить флаг, который каждый может видеть. Как это сделать с MPI-2 "односторонние сообщения" описывается кодом с другим вопросом: Создание счетчика, который синхронизируется в процессах MPI. Вы можете использовать этот подход, и просто попросите всех проверить счетчик, прежде чем продолжить их партию процессов. Обратите внимание, что это много сетевого трафика для каждого процесса на каждой итерации! Другим подходом было бы всего лишь на каждые несколько итераций сделать allreduce или что-то подобное, чтобы увидеть, ударил ли кто-нибудь решение. Это, по крайней мере, немного оптимизировано с точки зрения пропускной способности, но работает только хорошо, если итерации, вероятно, будут более или менее синхронными. Еще один подход заключался бы в том, чтобы процесс отправки сообщений всем остальным, если они нашли ответ, и для проверки такого сообщения каждую итерацию (или несколько).