简单的MPI流水线环广播代码中的死锁

时间:2015-10-21 04:39:21

标签: c mpi deadlock broadcast pipeline

我正在学习MPI代码。我正在尝试使用不同大小的块进行流水线环广播。但是,当我运行我的代码时,它会陷入死锁,而进程0尝试发送第二块数据,我不知道为什么。任何帮助将不胜感激。

注意:这是更大代码的一部分。它在进程0上用字符填充缓冲区。在使用print语句进行一些简单的调试之后,我认为第9行(标有***)有问题,因为程序停止了。第二块数据永远不会从进程0发送。

int offset;
MPI_Status status;

if (rank == 0) {
    offset = 0;
    while (offset < NUM_BYTES) {
        MPI_Send(&chunk_size, 1, MPI_INT, rank + 1, 3, MPI_COMM_WORLD);
        MPI_Send(&offset, 1, MPI_INT, rank + 1, 2, MPI_COMM_WORLD);
        MPI_Send(&buffer[offset], chunk_size, MPI_BYTE, rank + 1, 1, MPI_COMM_WORLD); ***
        offset = offset + chunk_size;
        if ((offset + chunk_size) >= NUM_BYTES) {
            chunk_size = (NUM_BYTES - offset);
        }
    }
}
else {
    MPI_Recv(&chunk_size, 1, MPI_INT, rank - 1, 3, MPI_COMM_WORLD, &status);
    MPI_Recv(&offset, 1, MPI_INT, rank - 1, 2, MPI_COMM_WORLD, &status);
    MPI_Recv(&buffer[offset], chunk_size, MPI_BYTE, rank - 1, 1, MPI_COMM_WORLD, &status);
    if (rank != num_procs - 1) {
        MPI_Send(&chunk_size, 1, MPI_INT, rank + 1, 3, MPI_COMM_WORLD);
        MPI_Send(&offset, 1, MPI_INT, rank + 1, 2, MPI_COMM_WORLD);
        MPI_Send(&buffer[offset], chunk_size, MPI_BYTE, rank + 1, 1, MPI_COMM_WORLD);
    }
}

1 个答案:

答案 0 :(得分:3)

代码看起来很好(虽然不是非常有效,因为所有通信都是序列化的)但是你有一个很大的缺失:只有进程#0在一个循环中进行通信,所以它会发送几次,而所有其他进程只需要一个通信。在while部分添加相同的else循环,这应该有效。