2014-02-10 45 views
0

在空间分解的2D域中,我需要将粒子发送给8个邻居。我知道我送了多少,但不知道我会从这些邻居收到多少。 我已经用MPI_Send(),MPI_Probe()和MPI_Recv()实现了一个代码,但是我意识到只要消息太大就会导致死锁。未知邮件大小的MPI非阻塞发送和recv和mpi_iprobe()

我决定进行非阻塞通信,但后来我不知道应该调用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

没错,谢谢!我已经使用MPI_Probe和MPI_Recv进行了测试,效果很好。我不太清楚我明白为什么MPI_Probe不会阻塞。信息何时发送,究竟发生了什么? – MCF

+0

对不起,重复的答案/评论。新的SE ios应用程序在答案和评论上并不完全清楚。 –

回答

0

您不必使所有3个操作都是非阻塞的。您可以使用带有常规MPI_PROBE和/或MPI_RECV的MPI_ISEND。听起来这可能是更好的选择。

+0

要回答您对该问题的评论,MPI_PROBE会阻止,直到它与消息匹配。 MOI_IPROBE不会阻止(因此'I')。 –