2016-01-09 6 views
0

Я пытаюсь реализовать модель 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 

Затем он застревает. Что я делаю не так?

+0

Почему вы пишете «std :: cout <<« Все сделано »<< endl;» inbetween if & else ?? – Nishant

+0

@Nishant У меня возникла проблема с форматированием при копировании, это действительно правильно написано в программе. Сейчас я редактирую. – user3616495

ответ

0
for (int i = 1; i < size; i++) { 

Должно быть

for (int i = 1; i <= size; i++) { 

EDIT: это нормально, потому что size является 3 (включает в себя сервер)

О последовательности: MPI_Send и MPI_Recv блокируют вызовы, поэтому выход, как ожидается, (?).

Если мастер заблокирован во втором раунде, это связано с тем, что ведомый не отвечает. Цикл while (count < 2) должен обернуть как главный, так и ведомый.

+0

Нет, я могу отправить заказы им обоим. Проблема в том, что я не могу сделать это во второй раз. – user3616495

+0

'размер' 2, правильно? Итак, это '<='? – Ilya

+0

ah нет, размер 3 т.к. 0 - master. Внимательно прочитайте мой вывод, подчиненный 2 получает заказы, без проблем. – user3616495