У меня есть много подчиненных узлов, которые могли или не могли отправлять сообщения на главный узел. Таким образом, в настоящее время мастер-узел не знает, сколько MPI_Recv ожидает. По соображениям эффективности ведомые узлы должны были отправить минимальное количество сообщений на главный узел.MPI: Что делать, когда число ожидаемых MPI_Recv не указано
Мне удалось найти a cool trick, который отправляет дополнительное сообщение «done», когда он больше не ожидает сообщений. К сожалению, это не работает в моем случае, где есть переменное количество отправителей. Любая идея о том, как это сделать? Благодаря!
if(rank == 0){ //MASTER NODE
while (1) {
MPI_Recv(&buffer, 10, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
if (status.MPI_TAG == DONE) break;
/* Do stuff */
}
}else{ //MANY SLAVE NODES
if(some conditions){
MPI_Send(&buffer, 64, MPI_INT, root, 1, MPI_COMM_WORLD);
}
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Send(NULL, 1, MPI_INT, root, DONE, MPI_COMM_WORLD);
Не работает, кажется, программа будет по-прежнему ждет MPI_RECV
Просто попробовал, я думаю, MPI_Barrier это выполняется, но 'не после того, как barrier' сообщение никогда не печатается, так как программа застрять на MPI_Recv – kornesh
Rank 0 никогда не называет Барьер так явно висит. Удалите барьер, и он запустится. – Jeff
Он фактически запускался без остановки, но затем он выполняет «MPI_Send» (NULL, 1, MPI_INT, root, DONE, MPI_COMM_WORLD); «сразу после первого подчиненного узла выполняется вычисление ... без ожидания других подчиненных узлов – kornesh