У меня есть этот код, где мастер отправляет исходные данные своим подчиненным. Он использует функцию MPI_Bcast (широковещательная передача), но когда вызывается Broadcast, мастер продолжает работу, но подчиненные устройства застревают в тупике.MPI_Bcast deadlock
фрагменты кода следующие:
Master {
run() {
...
MPI_Pack(&offset, 1, MPI_INT, buffer, BUFFERSIZE, &position, MPI_COMM_WORLD);
MPI_Pack(&dataSize, 1, MPI_INT, buffer, BUFFERSIZE, &position, MPI_COMM_WORLD);
MPI_Pack(dataLoader.getData(), dataSize*dataSize, MPI_CHAR, buffer, BUFFERSIZE, &position, MPI_COMM_WORLD);
MPI_Bcast(buffer, position, MPI_PACKED, 0, MPI_COMM_WORLD);
printf("master ok");
}
}
Slave {
run() {
MPI_Bcast(buffer, BUFFERSIZE, MPI_PACKED, 0, MPI_COMM_WORLD);
printf("Slave OK");
//unpack
MPI_Unpack(buffer, BUFFERSIZE, &position, &offset, 1, MPI_INT, MPI_COMM_WORLD);
MPI_Unpack(buffer, BUFFERSIZE, &position, &dataSize, 1, MPI_INT, MPI_COMM_WORLD);
data = new char[dataSize * dataSize];
MPI_Unpack(buffer, BUFFERSIZE, &position, data, dataSize*dataSize, MPI_CHAR, MPI_COMM_WORLD);
}
}
Выход будет: Master нормально
и ведомые перестанет отвечать на запросы. Спасибо за помощь
хорошо все процессы вызывают mpi_bcast() только один раз в программе. Перед этими вызовами нет данных, зависящих от данных, поэтому там не может быть зависаний. Дело в том, что он работает на моем ноутбуке с помощью процессов на месте, но зависает на кластере. – Eramol