Как использовать MPI для организации асинхронной связи? - PullRequest
3 голосов
/ 27 сентября 2010

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

Предположим, что есть два параллельных процесса. Процесс 1 хочет посылать хорошие решения, которые он находит, периодически процессу 2, и запрашивать хорошие решения из процесса 2, когда он нуждается в диверсификации.

  1. В какой-то момент процесс 1 использует MPI_send для отправки решения процессу 2. Как гарантировать, что MPI_Rev соответствует этому MPI_Send, поскольку эта отправка инициируется динамически?

  2. Когда процессу 1 нужно решение, как он может отправить запрос процессу 2, а процесс 2 вовремя заметит свой запрос?

Ответы [ 2 ]

3 голосов
/ 04 марта 2011

Есть три способа достичь того, чего вы хотите, хотя это не совсем асинхронное общение.

1) Используйте неблокирующие отправку / запись.Замените ваши вызовы send / recv на irecv / isend и ждите.Отправитель может выдать отправку и продолжить работу над следующей проблемой.В какой-то момент вам нужно будет запустить mpi-wait, чтобы убедиться, что ваш предыдущий посыл был получен.Ваш process2 может выдать recv заранее, используя irecv, и продолжить работу.Опять же, в какой-то момент вы позвоните в mpi-wait, чтобы убедиться, что ваш irecv был получен.это может быть немного громоздко, если я правильно понимаю ваше требование.

2) Элегантным способом было бы использовать одностороннюю связь.MPI_Put, Get.

3) Перестройте ваш алгоритм таким образом, чтобы через определенные промежутки времени процессы 1 и 2 обменивались информацией и состоянием.

1 голос
/ 27 сентября 2010

В зависимости от природы вызываемой функции MPI_ * отправка будет блокироваться до тех пор, пока другой процесс не вызовет соответствующий прием, поэтому вам необходимо убедиться, что это произойдет в вашем коде. Существуют также неблокирующие вызовы функций MPI_Isend f.ex, которые дают вам дескриптор запроса, который вы можете проверить позже, чтобы увидеть, был ли посыл процесса получен соответствующим получателем.

Что касается вашей проблемы, вы можете выдавать неблокирующее получение (MPI_Irecv является самым основным) и проверять состояние каждые n секунд в зависимости от вашего приложения. Затем статус будет установлен как завершенный, когда сообщение получено и готово к прочтению.

Если это чувствительно ко времени, используйте блокирующий вызов во время ожидания сообщения. Однако механизм блокировки (по крайней мере, в OpenMPI) использует вращающийся опрос, поэтому процесс ожидания будет потреблять 100% ресурсов процессора.

...