Причина, по которой ваш код не работает, заключается в том, что вы должны указать действительное значение MPI_Request
для MPI_Irecv
, а не просто указатель неинициализированный !
MPI_Request inReq;
MPI_Irecv(&found, 1, MPI_CXX_BOOL, MPI_ANY_SOURCE, MPI_ANY_TAG,
MPI_COMM_WORLD, &inReq);
То, как выручка found
неверна.Вы не должны изменять переменную, данную асинхронному запросу, и вы не можете просто предполагать, что она обновляется в фоновом режиме.Неблокирующие сообщения - это , а не односторонние операции с удаленной памятью.Таким образом, вы должны вызвать тест и, если статус указывает на полученное сообщение, вы можете прервать цикл.Убедитесь, что каждый запрос выполнен, также в ранге, который нашел результат.
Далее, num_items_per_proc
должен быть действительным во всех рангах (для выделения памяти и для указания recvcount
в MPI_Scatter
.
Барьер до MPI_Finalize
является избыточным и, наконец, C ++ привязки MPI были удалены, используйте MPI_CXX_BOOL
вместо MPI::BOOL
.
. Вы можете найти более сложные подходы кВаша проблема в ответах на этот вопрос .