2013-04-26 72 views
0

我正在嘗試使用MPI實現分佈式遺傳算法(島模型)。所有節點都會重複生成新的種羣,並在每次迭代後交換最佳個體。我希望使交換隨機,以便任何進程都可以向任何其他進程發送消息。因此,每進行一次k次迭代後,每個進程都會向隨機選擇的進程發送消息。但是,我不確定如何使用MPI實現此功能。從這篇文章 - Sending data to randomly selected hosts by using MPI我得到這樣的想法,異步通信將是有益的,但我不知道如何。mpi發送消息到隨機選擇的節點

回答

3

隨機通信模式很難在MPI中實現。 MPI基於所有具有確定性通信模式的等級。

對於點對點解決方案,每個等級將在MPI_ANY_SOURCE上調用MPI_Irecv。當數據交換髮生時,每個等級可以調用MPI_Send到特定的目標等級。目標等級需要再次調用MPI_Irecv來爲下一次迭代做準備。作業完成後,任何未使用的MPI_Irecv調用都可以是MPI_Cancel'd。

對於一個集體方法,每個等級將調用MPI_Alltoall或MPI_Alltoallv(如果交換的數據量不同)。每個等級只會將數據填充到隨機選擇接收數據的單個等級中。這種「稀疏」數據交換與MPI_Alltoall非常相似。這個集合可能很昂貴,但它確實允許每k次迭代進行一次硬同步,並避免清理MPI_Cancel。

+0

謝謝!如果兩個發件人生成同一個接收者的ID,並且因此都將消息發送給相同的消息,那麼是否會丟失消息?你也可以澄清有兩個MPI_IRecv的點嗎? – vjain27 2013-04-27 02:15:18

+0

在點對點解決方案中,在任何給定時間,每個級別MPI_ANY_SOURCE上只有一個MPI_IRecv未完成。如果消息匹配,則應發佈新的MPI_Irecv以允許接收「下一個」隨機消息。我沒有考慮「我」排名都是隨機挑選相同目標等級的情況。在這種情況下,MPI_Alltoall解決方案將更可取。點對點案例的困難在於,需要單獨的「全部清除」消息或集體調用以允許所有隊伍知道是時候進行下一組迭代。 – 2013-04-27 02:26:50

+0

一個很好的答案。不過,我認爲實施異步解決方案會很有趣。我曾經爲我的畢業論文做過這樣的工作,它比同步算法快得多,並且質量相當。然而,我使用了主從方法,並且僅對評估進行了並行處理。主人維護一個工作和閒置奴隸列表,以決定在哪裏發送解決方案。 – Andreas 2013-04-28 06:14:32