2013-08-13 4 views
0

Я пишу программу на C++, которая использует OpenMPI. Он выполняется в «раундах», где в каждом раунде процесс 0 отправляет куски данных другим процессам, он делает материал и отправляет результаты назад, а когда больше нет кусков для отправки, процесс 0 отправляет «сделанные», сообщение друг другу. Сообщение «done» - это сообщение только одного типа с тегом 3. Мой первый раунд выполняется отлично. Однако, когда я добираюсь до второго раунда, обрабатывает 1-p «пробник» и «получает» выполненное сообщение перед процессом 0, имел возможность отправить что-либо (не говоря уже о сделанном сообщении).MPI: Получение уже полученного сообщения?

Я уже много раз пересматривал свой код, и кажется, что единственное место, откуда может появиться это сообщение, - это то, где процесс 0 отправил его в предыдущем раунде, но каждый процесс уже получил это. Я бы предпочел не публиковать свой код, так как он довольно большой, но кто-нибудь знает, можно ли получать сообщения MPI дважды?

ответ

0

Я думаю, что у меня может быть ответ ... Поскольку фактические данные в сделанном сообщении не имеют значения, я не думал, что процессы действительно получают его. Оказывается, в предыдущем раунде процессы были «зондированием» сообщения и обнаружили, что тег равен 3, а затем вышел из их цикла. Поэтому во втором раунде сообщение все еще ожидало получения, поэтому, когда они вызвали MPI_Probe, они обнаружили то же сообщение, что и в предыдущем раунде.

Чтобы решить эту проблему, я просто позвонил в MPI_Recv. Я посмотрел на MPI_Cancel, но я не могу найти достаточно информации об этом, чтобы узнать, будет ли это уместно. Извините за то, что я вводил в заблуждение в своем вопросе!

+0

Также обратите внимание: если информация в сообщении содержится в его теге (например, сообщение «done»), вы можете отправить сообщение с count = 0. – ricky116

+0

@ ricky116 Должен ли я получить его в этом дело? – FrancesKR

+0

Если вы отправляете 'ISend', его нужно будет обработать с помощью операции получения на целевом узле, поэтому да, в то время как информация, которую вы хотите, будет полностью доступна через« IProbe », вам все равно необходимо выполнить 'Recv' на сообщение с нулевым размером. – ricky116

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