MPI_广播死锁
我有这段代码,主程序将初始数据发送给他的从属程序。它使用MPI_Bcast(广播)功能,但当广播被调用时,主设备继续,但从设备陷入死锁 代码片段如下所示:MPI_广播死锁,mpi,broadcast,Mpi,Broadcast,我有这段代码,主程序将初始数据发送给他的从属程序。它使用MPI_Bcast(广播)功能,但当广播被调用时,主设备继续,但从设备陷入死锁 代码片段如下所示: Master { run() { ... MPI_Pack(&offset, 1, MPI_INT, buffer, BUFFERSIZE, &position, MPI_COMM_WORLD); MPI_Pack(&dataSize, 1, MPI_INT, b
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);
}
}
产出将是:
大师ok
奴隶就会停止反应。
感谢您的帮助
mpi\u bcast
应由通信器中的所有进程调用,并且它们都应在代码中的同一点遇到调用。在编写(伪)代码时,根进程调用广播,而工作进程不调用广播,工作进程调用根进程不调用广播
mpi\u bcast
是mpi的集体例程之一,库负责根据传递给它的参数确定正确的消息发送模式。在mpi_bcast
的情况下,第四个参数是广播源的id(它不需要是通信器的根进程,尽管它通常是);通信器中的所有其他进程都将是接收器。所有进程在程序中只调用一次mpi_bcast()。在这些调用之前没有任何数据依赖性,因此不会出现挂断。问题是,它可以在我的笔记本电脑上运行,并带有就地进程,但在集群上挂断。