2014-02-21 75 views
0

問題是這個程序是否正確?MPI通訊器管理

可以說我想分割MPI_COMM_WORLD中的所有p進程到幾個不重疊的通信器中。 我通過確定排名爲masterm組來完成此操作。主級別確定哪些進程需要通信,哪些不需要(基本上分析圖)。

最後,master排名已確定這些m流程排名與我想要建立m溝通。 可以說我把這些m排名組的結果發送到所有進程。

正如我發現的是,在MPI_COMM_WORLD所有流程需要使所有這些團體與MPI_Group_?命令(即使他們不屬於該組,(愚蠢?)),之後用MPI_Comm_create共同創建的每個Communicator

現在的問題是:什麼是一個過程都與其所不屬於和一些並不需要通過這個過程中所有的傳播者,但他們需要調用m -times集體MPI_Comm_create功能?

我們可以簡單地忽略所有的MPI_Comm指針,只存儲這個進程所屬的指針嗎?,不需要撥打MPI_Comm_free? 如果我想重建另一組傳播者,我應該如何釋放傳播者? 一個進程是否應該釋放它所屬的通訊器?

有人可以解釋這個過程是否正確? 我有點不確定這個集體創作例程...

非常感謝!

回答

3

這聽起來像你可能會以艱難的方式做事。

將大型通信器拆分爲許多不重疊的子通信器的最佳方式是使用MPI_COMM_SPLIT。原型是這樣的:

int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm) 

每個人都將在同一subcommuniator有助於相同color。然後key被用來安排子通信器內的等級。如果您想維護訂購,您可以使用原來的等級。

在撥打MPI_COMM_SPLIT之前,您需要做的唯一一件事就是將master流程中的組號碼廣播給其他使用MPI_BCAST的人。

+0

很好的答案,但它並沒有真正幫助我的問題。我知道我可以用這個功能分割,如果我可以在這種情況下使用這個功能,我不能,我正在考慮上述提到的問題,我不確定如何創建和釋放傳播者 – Gabriel

+0

我想我不明白爲什麼你需要創建一個額外的傳播者羣。 –

+0

是不是MPI_Comm_create是集體的,所有進程都需要調用這個函數來創建一個新的通信器,即使它不屬於新的通信器,這就是奇怪的地方! – Gabriel