gpt4 book ai didi

mpi - MPI 死锁

转载 作者:行者123 更新时间:2023-12-03 02:53:28 25 4
gpt4 key购买 nike

我正在尝试 MPI,想知道这段代码是否会导致死锁。

MPI_Comm_rank (comm, &my_rank);
if (my_rank == 0) {
MPI_Send (sendbuf, count, MPI_INT, 1, tag, comm);
MPI_Recv (recvbuf, count, MPI_INT, 1, tag, comm, &status);
} else if (my_rank == 1) {
MPI_Send (sendbuf, count, MPI_INT, 0, tag, comm);
MPI_Recv (recvbuf, count, MPI_INT, 0, tag, comm, &status);
}

最佳答案

MPI_Send 可能会也可能不会阻塞。它将阻塞,直到发送者可以重用发送者缓冲区。当缓冲区被发送到较低的通信层时,一些实现将返回给调用者。当另一端有匹配的 MPI_Recv() 时,其他一些将返回给调用者。因此,该程序是否会死锁取决于您的 MPI 实现。

由于该程序在不同的 MPI 实现中表现不同,您可以考虑重写它,以免出现死锁:

MPI_Comm_rank (comm, &my_rank);
if (my_rank == 0) {
MPI_Send (sendbuf, count, MPI_INT, 1, tag, comm);
MPI_Recv (recvbuf, count, MPI_INT, 1, tag, comm, &status);
} else if (my_rank == 1) {
MPI_Recv (recvbuf, count, MPI_INT, 0, tag, comm, &status);
MPI_Send (sendbuf, count, MPI_INT, 0, tag, comm);
}

请始终注意,对于每个 MPI_Send() 都必须有一个配对 MPI_Recv(),两者在时间上“并行”。例如,这可能会导致死锁,因为配对发送/接收调用未及时对齐。他们互相交叉:

RANK 0                          RANK 1
---------- -------
MPI_Send() --- ---- MPI_Send() |
--- --- |
------ |
-- | TIME
------ |
--- --- |
MPI_Recv() <-- ---> MPI_Recv() v

另一方面,这些进程不会以死锁结束,当然,前提是同一通信器域中确实存在两个等级为 0 和 1 的进程。

RANK 0                          RANK 1
---------- -------
MPI_Send() ------------------> MPI_Recv() |
| TIME
|
MPI_Recv() <------------------ MPI_Send() v

如果通信器com的大小不允许等级1(仅0),则上述修复程序可能会失败。这样,if-else 就不会采用 else 路由,因此,没有进程会监听 MPI_Send() 并排名0 将陷入死锁。

如果您需要使用当前的通信布局,那么您可能更愿意使用 MPI_Isend()MPI_Issend() 来代替非阻塞发送,从而避免死锁。

关于mpi - MPI 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20448283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com