2014-02-10 49 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')。 –