Тупик в модели 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

Решение

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

Должно быть

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

РЕДАКТИРОВАТЬ: все в порядке, потому что size это 3 (включает в себя сервер)

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]