2016-01-16 69 views
0

我們目前正在開發一個mpi4py項目,我們希望將進程分組到不同的組中。然後,我們將這些小組分配給他們自己的傳播者。這些步驟是由過程0完成的。mpi4py - 獲取進程自己的通信器

現在的問題是,其他進程如何找出它們屬於哪個通信器?

請注意,這些組的大小不同,例如,第一組包含5個進程和第二組3個。那麼,過程4(第一組)如何才能從第一組獲得傳播者。

回答

0

我們通過簡單地讓每個進程執行相同的初始化來解決問題,即每個進程創建每個組和通信器,並根據相同的模式將進程分配給這些組。這樣,流程就知道他們相應的溝通者。有趣的是,我們發現,雖然每個過程都創建了所有的羣體和傳播者,但他們只知道他們所屬的傳播者(和羣體)。 例如,如果屬於通信器1但不是2的處理4想要使用通信器2,它將會崩潰。根據錯誤消息,這是因爲它不知道傳播者,儘管它在開始時初始化它。

0

MPI爲您做到這一點。看看MPI_COMM_SPLIT,或者在mpi4py中,它將是COMM.Split()。重要的參數是「顏色」(哪個組進程將會結束)和「關鍵」(進程在該組中的順序)。

這聽起來像你已經知道你想如何「着色」你的過程。 COMM.Split()在父通信器上是集合的,所以你將在每個節點上計算顏色應該是什麼,然後拆分通信器。您可能會留下密鑰,在這種情況下,流程將根據其在父母溝通者中的排名進行排序。

+0

感謝您的回答!我們也看到了split命令,但是我們無法使用它。但我們解決了我們的問題,正如我在我們的答案中所述 – Migli