у меня есть int
Намерен вещать с рута (rank==(FIELD=0)
).
int winner
if (rank == FIELD) {
winner = something;
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast(&winner, 1, MPI_INT, FIELD, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
if (rank != FIELD) {
cout << rank << " informed that winner is " << winner << endl;
}
Но, похоже, я получаю
[JM:6892] *** An error occurred in MPI_Bcast
[JM:6892] *** on communicator MPI_COMM_WORLD
[JM:6892] *** MPI_ERR_TRUNCATE: message truncated
[JM:6892] *** MPI_ERRORS_ARE_FATAL: your MPI job will now abort
Обнаружил, что могу увеличить размер буфера в Bcast
MPI_Bcast(&winner, NUMPROCS, MPI_INT, FIELD, MPI_COMM_WORLD);
куда NUMPROCS
количество запущенных процессов. (на самом деле кажется, что мне просто нужно, чтобы это было 2). Затем он работает, но дает неожиданный вывод …
1 informed that winner is 103
2 informed that winner is 103
3 informed that winner is 103
5 informed that winner is 103
4 informed that winner is 103
Когда я cout
winner
, так должно быть -1
В начале кода есть ошибка:
if (rank == FIELD) {
// randomly place ball, then broadcast to players
ballPos[0] = rand() % 128;
ballPos[1] = rand() % 64;
MPI_Bcast(ballPos, 2, MPI_INT, FIELD, MPI_COMM_WORLD);
}
Это очень распространенная ошибка. MPI_Bcast
это коллективная операция, и она должна вызываться всеми процессами для завершения. В вашем случае происходит то, что эта трансляция вызывается не всеми процессами в MPI_COMM_WORLD
(но только с помощью корня) и, следовательно, мешает следующей операции широковещания, а именно той, которая находится внутри цикла. Вторая операция широковещания фактически принимает сообщения, отправленные первым (два int
элементы) в буфер только для одного int
и, следовательно, сообщение об ошибке усечения. В Open MPI каждая широковещательная передача использует внутри себя одни и те же значения тегов сообщений, и, следовательно, разные широковещательные передачи могут создавать помехи друг другу, а не выдаваться последовательно. Это соответствует (старому) стандарту MPI — в MPI-2.2 не может быть более одной невыполненной коллективной операции (в MPI-3.0 может быть несколько невыполненных). неблокирующая коллективные операции). Вы должны переписать код как:
if (rank == FIELD) {
// randomly place ball, then broadcast to players
ballPos[0] = rand() % 128;
ballPos[1] = rand() % 64;
}
MPI_Bcast(ballPos, 2, MPI_INT, FIELD, MPI_COMM_WORLD);
Других решений пока нет …