Я думаю, используя MPI_Sendrecv
MPI_Sendrecv(&ballPos, 2, MPI_INT, FIELD, NEW_BALL_POS_TAG, &ballPos, 2, MPI_INT, winner, NEW_BALL_POS_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
Но я заметил только рут (приемная вечеринка продолжает работать?). имеющий cout
до и после Sendrecv производит:
0 b4 sendrecv
2 b4 sendrecv
4 b4 sendrecv
1 b4 sendrecv
3 b4 sendrecv
5 b4 sendrecv
0 after sendrecv
Все процессы в порядке до sendrecv, но только root разблокируется впоследствии.
Полный источник: см. строку 147
ОБНОВИТЬ
Результат должен быть примерно таким, как показано ниже
if (rank == winner) {
ballPos[0] = rand() % 128;
ballPos[1] = rand() % 64;
cout << "new ball pos: " << ballPos[0] << " " << ballPos[1] << endl;
MPI_Send(&ballPos, 2, MPI_INT, FIELD, NEW_BALL_POS_TAG, MPI_COMM_WORLD);
} else if (rank == FIELD) {
MPI_Recv(&ballPos, 2, MPI_INT, winner, NEW_BALL_POS_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
Количество отправленных отправлений должно быть равно количеству отправленных отправлений. В вашем случае все ранги отправляются в ранг FIELD
и получать из ранга winner
, в том числе FIELD
а также winner
:
Rank Sends to Receives from
----------------------------------
0 (FIELD) FIELD winner
1 FIELD winner
2 FIELD winner
... ... ...
winner FIELD winner
... ... ...
numprocs-1 FIELD winner
(такие таблицы иногда могут быть очень полезны)
следовательно FIELD
должен получить numprocs
сообщения, но он только выполняет MPI_Sendrecv
один раз и следовательно numprocs-1
звонки в MPI_Sendrecv
не сможет завершить свои посылки. То же самое касается winner
, Следует отправить numprocs
сообщение, но так как оно выполняется только MPI_Sendrecv
один раз отправляется только одно сообщение и, следовательно, numprocs-1
звонки в MPI_Sendrecv
не сможет завершить их получение.
Есть и еще одна ошибка. Стандарт MPI требует, чтобы буферы отправки и приема не пересекались (то есть они не должны перекрываться), что не имеет место в вашем коде. Ваши буферы отправки и получения не только перекрываются, но и являются одним и тем же буфером. Если вы хотите выполнить обмен в том же буфере, MPI предоставляет MPI_Sendrecv_replace
операция.
Я не уверен, что вы пытаетесь достичь с этим MPI_Sendrecv
заявление, но я сильно подозреваю, что вам нужно положить его в if
заявление.
Других решений пока нет …