Я посылаю целое число, которое вызывает завершение через MPI_Bcast. Корень устанавливает переменную с именем «running» в ноль и отправляет BCast. Кажется, что Bcast завершен, но я не вижу, чтобы значение отправлялось другим процессам. Другие процессы, кажется, ожидают завершения MPI_Scatter. Они даже не должны быть в состоянии прибыть сюда.
Я много исследовал MPI_Bcast и, насколько я понимаю, он должен блокировать. Это сбивает меня с толку, поскольку MPI_Bcast из корня, кажется, завершается, хотя я не могу найти совпадающие (принимающие) MPI_Bcasts для других процессов. Я окружил все свои MPI_Bcasts printfs и вывод этих printfs 1) print и 2) распечатал правильные значения из корня.
Корень выглядит следующим образом:
while (running || ...) {
/*Do stuff*/
if (...) {
running = 0;
printf("Running = %d and Bcast from root\n", running);
MPI_Bcast(&running, 1, MPI_INT, 0, MPI_COMM_WORLD);
printf("Root 0 Bcast complete. Running %d\n", running);
/* Do some more stuff and eventually reach Finalize */
printf("Root is Finalizing\n");
MPI_Finalize();
}
}
Другие процессы имеют следующий код:
while (running) {
doThisFunction(rank);
printf("Waiting on BCast from root with myRank: %d\n", rank);
MPI_Bcast(&running, 1, MPI_INT, 0, MPI_COMM_WORLD);
printf("P%d received running = %d\n", rank, running);
if (running == 0) { // just to make sure.
break;
}
}
MPI_Finalize();
У меня также есть следующее в функции "doThisFunction ()". Вот где процессы, кажется, ожидают процесса 0:
int doThisFunction(...) {
/*Do stuff*/
printf("P%d waiting on Scatter\n", rank);
MPI_Scatter(buffer, 130, MPI_BYTE, encoded, 130, MPI_BYTE, 0, MPI_COMM_WORLD);
printf("P%d done with Scatter\n", rank);
/*Do stuff*/
printf("P%d waiting on gather\n", rank);
MPI_Gather(encoded, 1, MPI_INT, buffer, 1, MPI_INT, 0, MPI_COMM_WORLD);
printf("P%d done with gater\n", rank);
/*Do Stuff*/
return aValue;
}
Вывод в командной строке выглядит следующим образом:
P0 waiting on Scatter
P0 done with Scatter
P0 waiting on gather
P0 done with gather
Waiting on BCast from root with myRank: 1
P1 received running = 1
P1 waiting on Scatter
P0 waiting on Scatter
P0 done with Scatter
P0 waiting on gather
P0 done with gather
P1 done with Scatter
P1 waiting on gather
P1 done with gather
Waiting on BCast from root with myRank: 1
P1 received running = 1
P1 waiting on Scatter
Running = 0 and Bcast from root
Root 0 Bcast complete. Running 0
/* Why does it say the Bcast is complete
/* even though P1 didn't output that it received it?
Root is Finalizing
/* Deadlocked...
Я ожидаю, что P1 получает работу как ноль, а затем переходит в MPI_Finalize (), а скорее он застревает в разбросе, который не будет доступен для корня, который уже пытается завершить.
На самом деле, программа находится в тупике и не прерывает MPI.
Я сомневаюсь, что проблема в том, что scatter принимает значение Bcast, потому что это даже не имеет смысла, так как корень не вызывает scatter.
У кого-нибудь есть какие-либо советы по решению этой проблемы?
Ваша помощь очень ценится.