未知消息大小的MPI非阻塞发送和接收以及MPI_iprobe()

未知消息大小的MPI非阻塞发送和接收以及MPI_iprobe(),mpi,deadlock,Mpi,Deadlock,在空间分解的2D域中,我需要将粒子发送到8个邻居。我知道我要发送多少,但不知道我会从这些邻居那里收到多少。 我用MPI_Send()、MPI_Probe()和MPI_Recv()实现了一个代码,但我意识到每当消息太大时,它就会导致死锁 我决定使用非阻塞通信,但我不知道应该以什么顺序调用MPI_Isend、MPI_Irecv和MPI_Iprobe?在实际调用MPI_Irecv之前,我肯定需要知道接收缓冲区应该分配到的大小,所以我受到了顺序MPI_Isend()然后MPI_Iprobe()然后MPI

在空间分解的2D域中,我需要将粒子发送到8个邻居。我知道我要发送多少,但不知道我会从这些邻居那里收到多少。 我用MPI_Send()、MPI_Probe()和MPI_Recv()实现了一个代码,但我意识到每当消息太大时,它就会导致死锁


我决定使用非阻塞通信,但我不知道应该以什么顺序调用MPI_Isend、MPI_Irecv和MPI_Iprobe?在实际调用MPI_Irecv之前,我肯定需要知道接收缓冲区应该分配到的大小,所以我受到了顺序MPI_Isend()然后MPI_Iprobe()然后MPI_Irecv()的诱惑,但问题是MPI_Iprove()总是返回一个等于false的标志,我陷入了while循环。据我所知,MPI没有义务在调用MPI_Wait()之前实际完成发送,因此我理解MPI_Iprobe可能永远不会返回true。但如果是这样,在非阻塞MPI点到点通信中,如何接收未知大小的消息?

您不必使所有3个操作都非阻塞。您可以将MPI ISEND与常规MPI探测和/或MPI RECV一起使用。听起来这对你来说可能是个更好的选择。

没错,谢谢!我用MPI_Probe和MPI_Recv进行了测试,效果很好。我不太明白为什么MPI_探测器不会阻塞。消息何时发送,具体发生了什么?很抱歉回答/评论重复。新的SE ios应用程序在回答和评论方面并不完全清楚。要回答您对该问题的评论,MPI_PROBE会阻止,直到它与消息匹配为止。MOI_IPROBE不会阻塞(因此为“I”)。