为什么这个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完成。
答案 0 :(得分:2)
考虑以下代码的死锁变体:
./bin/config set phabricator.base-uri 'http://example.com/'
唯一的变化是将通信字节数增加了10000倍。为什么会导致代码死锁?
查看MPI文档的communication modes部分。如果a)接收等级上有接收等待或b)接收等级具有足够大小的接收缓冲区,则发送可以成功返回。
默认情况下,MPI会分配一定大小的接收缓冲区,以捕获小型接收,例如您发送的单个整数。