2013-04-26 3 views
0

Я пытаюсь реализовать распределенный генетический алгоритм (островную модель) с использованием MPI. Все узлы будут многократно генерировать новые группы населения и будут обмениваться лучшими людьми после каждого k итераций. Я хочу сделать случайный случай обмена, чтобы любой процесс мог отправить сообщение любому другому процессу. Поэтому после каждого k-итераций каждый процесс отправляет сообщение произвольно выбранному процессу. Однако я не уверен, как реализовать это с помощью MPI. Из этого сообщения - Sending data to randomly selected hosts by using MPI У меня появилась идея, что асинхронная связь будет полезна, но я не знаю, как именно.mpi отправка сообщения случайно выбранному узлу

ответ

3

Случайные схемы связи трудно реализовать в MPI. MPI основан на всех рангах, имеющих детерминированный набор шаблонов связи.

Для решения с точки зрения пункта каждый ранг будет называть MPI_Irecv на MPI_ANY_SOURCE. Когда происходит обмен данными, каждый ранг может вызвать MPI_Send в конкретный целевой ранг. Целевой ранг потребуется снова вызвать MPI_Irecv, чтобы подготовиться к следующей итерации. Когда работа будет завершена, любые неиспользуемые вызовы MPI_Irecv могут быть MPI_Cancel'd.

Для коллективного подхода каждый ранг будет называть MPI_Alltoall или MPI_Alltoallv (если количество обмененных данных меняется). Каждый ранг будет заполнять только данные в один ранг, который случайным образом выбирается для приема данных. Такой «разреженный» обмен данными довольно распространен с MPI_Alltoall. Коллектив может быть дорогостоящим, но он обеспечивает жесткую синхронизацию каждые k итераций и позволяет избежать очистки MPI_Cancel.

+0

Спасибо! Если два отправителя генерируют идентификатор одного и того же приемника и, таким образом, оба отправляют сообщения одному и тому же, не будет ли потеря сообщения? Также не могли бы вы прояснить суть двух MPI_IRecv? – vjain27

+0

В решении от точки к точке в любой момент времени каждый ранг будет иметь только один MPI_IRecv на MPI_ANY_SOURCE. Если сообщение согласовано, то должен быть отправлен новый MPI_Irecv, чтобы можно было получить «следующее» случайное сообщение. Я не рассматривал случай, когда «i» ранжирует все случайным образом одинаковый целевой ранг. В этом случае предпочтительным будет решение MPI_Alltoall. Трудность в двухточечном случае состоит в том, что необходимо будет иметь отдельное «все ясное» сообщение или коллективный вызов, чтобы все звания знали, что пришло время перейти к следующему набору итераций. –

+0

Отличный ответ. Тем не менее, я думаю, было бы интересно реализовать асинхронное решение. Я однажды сделал это для дипломной работы, и это было значительно быстрее, чем синхронизированный алгоритм и с равным качеством. Однако я использовал подход подчиненного подчиненного и распараллеливал только оценку. Мастер поддерживал список рабочих и незанятых рабов, чтобы решить, куда отправлять решения. – Andreas

Смежные вопросы