我有这个代码,master将初始数据发送给他的奴隶。它使用MPI_Bcast(广播)功能,但是当调用广播时,主设备继续,但是从设备陷入僵局。
代码段如下:
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);
}
}
输出将是: 掌握好的
并且奴隶会停止响应。 谢谢你的帮助
答案 0 :(得分:1)
mpi_bcast
应该被通信器中的所有进程调用,并且它们都应该在代码中的同一点遇到调用。当您编写了(伪)代码时,根进程会调用广播,而工作进程则不会这样做,而工作进程会调用root用户调用的函数。
mpi_bcast
是MPI的集合例程之一,该库负责根据您传递给它的参数确定正确的消息发送模式。在mpi_bcast
的情况下,第四个参数是广播源的id(虽然它经常是,但它不需要是通信器的根进程);通信器中的所有其他进程都将是接收器。