Другие процессы зависают после MPI_Sendrecv

Я думаю, используя 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);
}

0

Решение

Количество отправленных отправлений должно быть равно количеству отправленных отправлений. В вашем случае все ранги отправляются в ранг 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 заявление.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector