为什么这个MPI_Bcast相关代码没有死锁?

时间:2016-02-25 13:22:14

标签: c mpi deadlock

为什么这个mpi代码不会发生死锁?

int main(int argc, char *argv[])
{
        int rank,size;

        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        MPI_Comm_size(MPI_COMM_WORLD, &size);

        if(2!=size) MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
        int buf1, buf2;
        buf1 = 1;
        buf2 = 1;
        if (0==rank) {
            MPI_Bcast(&buf1,1,MPI_INT,0,MPI_COMM_WORLD);
            MPI_Bcast(&buf2,1,MPI_INT,1,MPI_COMM_WORLD);
            printf("proc 0 done\n");
        }
        if (1==rank) {
            MPI_Bcast(&buf2,1,MPI_INT,1,MPI_COMM_WORLD);
            MPI_Bcast(&buf1,1,MPI_INT,0,MPI_COMM_WORLD);
            printf("proc 1 done\n");
        }
        MPI_Finalize();
}

结果是:

proc 0完成

proc 1完成。

1 个答案:

答案 0 :(得分:2)

考虑以下代码的死锁变体:

 ./bin/config set phabricator.base-uri 'http://example.com/'

唯一的变化是将通信字节数增加了10000倍。为什么会导致代码死锁?

查看MPI文档的communication modes部分。如果a)接收等级上有接收等待或b)接收等级具有足够大小的接收缓冲区,则发送可以成功返回。

默认情况下,MPI会分配一定大小的接收缓冲区,以捕获小型接收,例如您发送的单个整数。