Я пытаюсь реализовать модель master/slave с MPI, но у меня небольшая проблема.Тупик в модели 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
Затем он застревает. Что я делаю не так?
Почему вы пишете «std :: cout <<« Все сделано »<< endl;» inbetween if & else ?? – Nishant
@Nishant У меня возникла проблема с форматированием при копировании, это действительно правильно написано в программе. Сейчас я редактирую. – user3616495