MPI_Bcast死锁

时间:2013-11-17 12:59:01

标签: mpi broadcast

我有这个代码,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);

    }
}

输出将是:     掌握好的

并且奴隶会停止响应。 谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

mpi_bcast应该被通信器中的所有进程调用,并且它们都应该在代码中的同一点遇到调用。当您编写了(伪)代码时,根进程会调用广播,而工作进程则不会这样做,而工作进程会调用root用户调用的函数。

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