2012-10-10 26 views
2

MPI似乎自動將0指定爲主進程。但我希望能夠指定另一個進程(例如,級別爲10的進程)作爲主進程。我們可以將進程設置爲MPI中的主/進程嗎?

此外,功能scanf只適用於主進程:其他進程簡單地忽略它並轉到下一個語句。這是爲什麼發生?

回答

0

是,否。

您可以創建一個單獨的communicator世界小組與MPI_Comm_createMPI_Comm_split

至於scanf,我認爲,如果你運行他們,說,在不同的排名,它會輸出該排名過程。比如說,如果你有一個等級高的終端,但是你的終端最有可能是0級的,所以你只能看到那裏的輸出,但是你沒有在另一個等級上運行這個程序,所以我認爲它不會工作。

要從不同的節點打印,您需要使用sprintf,並將結果存儲在內存中,然後將其發送回0到printf到您的終端。

+0

但是,如果其他進程可以正確printf,如果我的終端是0?有沒有辦法爲其他進程之一打開一個新的終端? – Madhu

+0

@ user1464184我認爲你將不得不使用'sprintf'來保存結果到內存,然後使用'MPI_send'發送回0級,然後在0級打印出來,讓我來挖掘一個例子 – pyCthon

+0

http:///hamilton.nuigalway.ie/teaching/AOS/NINE/mpi-first-examples.html在例子4中,sprintf運行在每個等級上,但是你可以用'if(rank = 3){sprintf(.. ..' – pyCthon

0

mpiexec啓動MPI進程時,只有其中一個收到stdin。其餘的將不會打開描述符,所以從它讀取將只會返回一個錯誤。如果您檢查scanf的返回值,它可能是EOF。從技術上講,可能會有一個實現將複製stdin的內容並轉發到所有進程,但我不認爲任何MPI都會這樣做。

stdout另一方面通常是從發射器的所有進程中收集並打印在終端上,但打印出來的順序幾乎不可能控制。通常的解決方案是手動收集數據,並按pyCthon的建議打印所有內容。

最後的openmpi的mpiexec可以做你要求的事:指定等級將得到stdin,甚至在一個單獨的xterm推出一定的行列。這對調試可能很有用,但我不會依賴這些功能來實現核心功能:您可能希望在某一天使用不同的MPI實現代碼。另外,假設你在一個大集羣上運行 - 你真的想要打開一千個終端嗎? :)

相關問題