2013-02-13 311 views
1

我有一個網絡,進程向其鄰居發送一個隨機消息,同時接收來自其鄰居的消息。 我可以使用套接字和線程來完成它。一個線程接收消息,另一個線程向隨機選擇的鄰居發送消息。使用MPI_SEND和MPI_RECV可以實現嗎?使用MPI同步發送和接收

+0

你的意思是發送和接收的非阻塞版本? – arunmoezhi 2013-02-13 17:25:34

+0

沒關係。其實,我很難理解你的問題來回答它。 – nhahtdh 2013-02-13 17:29:50

+0

我試過使用它,但我需要把發送放在一個隨機發送消息的循環中。在執行循環期間,排名應該會收到任何發送給它的消息 – arunmoezhi 2013-02-13 17:32:15

回答

1

您可以在多線程環境中使用MPI調用。檢查MPI_Init_thread功能和本白皮書的手冊:http://www.mcs.anl.gov/~thakur/papers/mpi-threads.pdf。請注意,MPI-1標準不要求實現是線程安全的,只有MPI-2(但您使用的實現最可能是MPI-2)。

+0

謝謝。多線程是唯一的選擇,還是理論上可以使用非阻塞發送和接收來實現這一點? – arunmoezhi 2013-02-13 17:48:56

+0

如果不詳細瞭解你的代碼正在做什麼,很難說,也許有可能以某種方式重新排列算法,然後使用非阻塞調用。另一方面,過去我遇到過非常類似的問題 - 我正在進行並行排序,並且需要同時發送和接收消息;我發現的唯一解決方案是使用兩個線程和套接字(當時MPI-2尚不存在,所有可用的MPI-1實現都不是線程安全的)。 – miy 2013-02-13 18:10:47

0

你對「同時」的定義是什麼?

在任何情況下,你可以在MPI_Sendrecv感興趣:

發送 - 接收操作的語義是,如果主叫方分叉兩個併發線程,一個執行送什麼會獲得,和一個執行接收,然後加入這兩個線程。

+0

謝謝。假設我有3個等級,每個等級需要向其他等級發送2個消息。例如,Rank1向Rank1發送2條消息,向Rank1發送2條消息。總共每個等級發送4條消息。但每次發送之間的時間間隔是隨機的。我不想在每個sendrecv之間放置一個同步塊。 – arunmoezhi 2013-02-13 20:29:21