在空间分解的2D域中,我需要将粒子发送到8个邻居。我知道我要送多少,但不知道我会从这些邻居那里收到多少。 我用MPI_Send(),MPI_Probe()和MPI_Recv()实现了一个代码,但我意识到每当消息太大时它就会导致死锁。
我决定进行非阻塞通信,但后来我无法弄清楚MPI_Isend,MPI_Irecv和MPI_Iprobe的调用顺序是什么?我确实需要知道我的接收缓冲区应该在实际调用MPI_Irecv之前分配的大小所以我受到MPI_Isend()然后MPI_Iprobe()然后MPI_Irecv()的影响,但问题是MPI_Iprove()总是返回一个标志等于假,我陷入了while循环。据我所知,MPI在调用MPI_Wait()之前没有义务实际完成发送,因此我理解MPI_Iprobe可能永远不会返回true。但如果是这样,如何在非阻塞MPI点对点通信中收到未知大小的消息?
答案 0 :(得分:0)
您不必将所有3个操作都设置为非阻塞。您可以将MPI_ISEND与常规MPI_PROBE和/或MPI_RECV一起使用。听起来这对你来说可能是更好的选择。