Я пытаюсь отправить шаблон реализации мастер-подчиненный, в котором мастер имеет массив (действует как очередь заданий) и отправляет данные подчиненным процессорам. На основе данных, полученных от ведущего, ведомые устройства вычисляют результаты и возвращают ответы ведущему. Мастер при получении результатов определяет ранг подчиненного, от которого было получено сообщение, и затем отправляет следующее задание этому подчиненному устройству.
Это скелет кода, который я реализовал:
if (my_rank != 0)
{
MPI_Recv(&seed, 1, MPI_FLOAT, 0, tag, MPI_COMM_WORLD, &status);
//.. some processing
MPI_Send(&message, 100, MPI_FLOAT, 0, my_rank, MPI_COMM_WORLD);
}
else
{
for (i = 1; i < p; i++) {
MPI_Send(&A[i], 1, MPI_FLOAT, i, tag, MPI_COMM_WORLD);
}
for (i = p; i <= S; i++) {
MPI_Recv(&buf, 100, MPI_FLOAT, MPI_ANY_SOURCE, MPI_ANY_TAG,
MPI_COMM_WORLD, &status);
//.. processing to find out free slave rank from which above msg was received (y)
MPI_Send(&A[i], 1, MPI_FLOAT, y, tag, MPI_COMM_WORLD);
}
for (i = 1; i < p; i++) {
MPI_Recv(&buf, 100, MPI_FLOAT, MPI_ANY_SOURCE, MPI_ANY_TAG,MPI_COMM_WORLD, &status);
// .. more processing
}
}
Если я использую 4 процессора; 1 - главный, 3 - подчиненные; программа отправляет и принимает сообщения для первых 3 заданий в очереди заданий, но после этого программа зависает. В чем может быть проблема?