Я пытаюсь отправить шаблон master-slave реализации, в котором мастер имеет массив (действует как очередь заданий) и отправляет данные на подчиненные процессоры. На основе данных, полученных от мастера, ведомые вычисления вычисляют результаты и возвращают ответы на мастер. Мастер получает результаты, узнает ранг ранга, из которого был получен msg, а затем отправляет следующее задание этому ведомому.Программа застряла где-то
Это скелет кода, который я реализовал:
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 заданий в очереди заданий, но после этого программа зависает. В чем может быть проблема?
Звучит как один из процессов умирает, прежде чем он отправит ответ. Выясните, какой процесс не отправляет ответ на основной процесс. Некоторый код отладки был бы полезен здесь. – tdbeckett
Это очень неполно. –
^Это единственный код MPI, где я выполняю отправку и получение. другие вещи кажутся мне нормальными. – Kany