Я пытаюсь реализовать модель master / slave с MPI, но у меня небольшая проблема.
Я хочу, чтобы рабы ожидали заказов от мастера, они не должны работать, пока мастер не отправит заказ. Мастер должен одновременно отправить заказ всем рабам, дождаться, пока все подчиненные завершат заказ, а затем снова отправить заказы всем рабам одновременно.
Например, у меня есть 3 процессора (1 ведущий, 2 ведомых), я отправляю заказы ведомым дважды и хочу напечатать:
Master initialization done.
Master sends order to slave 1
Master sends order to slave 2
Slave 1 got the order from master
Slave 2 got the order from master
Master got response from Slave 1
Master got response from Slave 2
_________________________________
Master sends order to slave 1
Master sends order to slave 2
Slave 1 got the order from master
Slave 2 got the order from master
Master got response from Slave 1
Master got response from Slave 2
All done.
Вот что я сделал до сих пор.
int count = 0;
int number;
if (procnum == 0) {
// initialize master, slaves shouldn't be working until this ends
std::cout << "Master initialization done." << endl;
while (count < 2) {
for (int i = 1; i < numprocesses; i++) {
number = i * 2;
std::cout << "Master sends order to slave " << i << endl;
MPI_Send(&number, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
MPI_Recv(&number, 1, MPI_INT, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
std::cout << "Master got response from Slave " << i << endl;
}
count++;
}
std::cout << "All done" << endl;
} else {
int received;
MPI_Recv(&received, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
std::cout << "Slave " << procnum << " got the order from master" << endl;
MPI_Send(&received, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
Но я получаю это:
Master initialization done.
Master sends order to slave 1
Slave 1 got the order from master
Master got response from Slave 1
Master sends order to slave 2
Slave 2 got the order from master
Master got response from Slave 2
Master sends order to slave 1
Тогда это застревает. Что я делаю неправильно?
for (int i = 1; i < size; i++) {
Должно быть
for (int i = 1; i <= size; i++) {
РЕДАКТИРОВАТЬ: все в порядке, потому что size
это 3 (включает в себя сервер)
О последовательности: MPI_Send и MPI_Recv блокируют вызовы, поэтому вывод соответствует ожидаемому (?).
Если мастер блокируется во 2-м раунде, это потому, что раб не отвечает. while (count < 2)
Цикл должен обернуть как ведущий, так и ведомый.
Других решений пока нет …