Использование неблокирующей отправки и блокирующего приема в MPI? - PullRequest
2 голосов
/ 20 января 2011

Я пытаюсь реализовать программу мастер-работник.

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

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

Тем не менее, Я не уверен в последствиях использования неблокирующей асинхронной отправки и блокировки синхронного приема .

Альтернатива, я думаю, использует MPI_IPROBE, но я не уверен, что это даст мне какую-либо оптимизацию.

Пожалуйста, помогите мне понять, правильно ли то, что я делаю. Это правильное решение?

1 Ответ

4 голосов
/ 20 января 2011

Вы можете сопоставить блокирующие посылки с неблокирующими получениями и наоборот, что не вызовет никаких проблем.Однако, если хозяину действительно нечего делать, пока рабочие работают, и рабочие должны блокировать после завершения своего рабочего блока, то нет никаких оснований для неблокирующего общения на этом фронте.Мастер может опубликовать блокирующее получение с помощью MPI_ANY_SOURCE, а рабочие могут просто использовать блокирующее получение для отправки своих результатов, так как совпадающее получение на мастере уже будет опубликовано.

Итак, яd) Send-Recv для обмена рабочими единицами между мастером и работником и Isend-Irecv для трансляции новых глобальных минимумов.

...