Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MPI_广播死锁_Mpi_Broadcast - Fatal编程技术网

MPI_广播死锁

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

我有这段代码,主程序将初始数据发送给他的从属程序。它使用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);

    }
}
产出将是: 大师ok

奴隶就会停止反应。
感谢您的帮助

mpi\u bcast
应由通信器中的所有进程调用,并且它们都应在代码中的同一点遇到调用。在编写(伪)代码时,根进程调用广播,而工作进程不调用广播,工作进程调用根进程不调用广播


mpi\u bcast
是mpi的集体例程之一,库负责根据传递给它的参数确定正确的消息发送模式。在
mpi_bcast
的情况下,第四个参数是广播源的id(它不需要是通信器的根进程,尽管它通常是);通信器中的所有其他进程都将是接收器。

所有进程在程序中只调用一次mpi_bcast()。在这些调用之前没有任何数据依赖性,因此不会出现挂断。问题是,它可以在我的笔记本电脑上运行,并带有就地进程,但在集群上挂断。