2013-12-20 78 views
3

我有一些python代碼,我經常產生多個進程。我得到一個錯誤:mpi4py:關閉MPI Spawn?

ORTE_ERROR_LOG: The system limit on number of pipes a process can open was reached in file odls_default_module.c at line 809

我的代碼大致是這樣的

import mpi4py 
comm = MPI.COMM_WORLD 
... 
icomm = MPI.COMM_SELF.Spawn(sys.executable,args=["front_process.py",str(rank)],maxprocs=no_fronts) 
... 
message = icomm.recv(source=MPI.ANY_SOURCE,tag=21) 
... 
icomm.Free() 

產卵命令被稱爲非常頻繁,我認爲他們保持「開放」,儘管給我完成後, icomm.Free()命令。我如何正確「關閉」一個產生的過程?

+0

您能否提供MWE? – MBR

+1

根據mpi4py動態進程管理手冊(p14)的示例,應調用'icomm.Disconnect()'。 http://mpi4py.scipy.org/ – francis

回答

1

MPI_COMM_FREE的MPI規範聲明「...只有在沒有其他活動引用時,該對象纔會實際釋放。」您可以通過在鏈接它們的所有互連器的兩端調用MPI_COMM_DISCONNECT來斷開進程。等效的mpi4py電話可能是icomm.Disconnect()

您看到的錯誤仍然可能來自orterun(符號鏈接爲mpirunmpiexec),而不是來自主級別。 orterun是啓動所有MPI過程(最初和後來產生的)的人,然後將其標準輸出重定向到其自己的標準輸出,以便您可以看到每個等級的輸出。當在本地主機上啓動進程時,orterun使用簡單的fork()/exec()機制作爲odls框架的一部分,以產生新的等級並利用管道檢測成功啓動和IO轉發。啓動檢測管道只在很短的時間內打開,但只要排名正在運行,IO轉發管道就會保持打開狀態。如果您有許多排名同時運行,大量管道將保持打開狀態並因此顯示錯誤消息。

錯誤信息有點誤導,因爲有兩個「太多描述符」的情況,而Open MPI沒有區分它們。第一種情況是達到硬核限制的時候,但這通常是一個巨大的價值。第二種情況是當達到每個進程對文件描述符數量的限制時。後者可以通過ulimit命令進行控制。你應該用ulimit -n檢查你的案例中的值,並最終增加它。例如:

[email protected]$ ulimit -n 123456 
[email protected]$ mpiexec -n 1 ... ./spawning_code.py arg1 arg2 ... 

這裏123456是描述符的數量的所需極限,它不能超過可與ulimit -nH獲得硬限制。如果您正在通過腳本運行程序(爲了方便起見,或者因爲您將作業提交到某個批處理排隊系統),則應在撥打mpirun/mpiexec之前將ulimit -n行寫入腳本中。

同樣在上面的文字等級過程是用來指代相同的東西。

+0

感謝您的解釋。我嘗試之前斷開連接,但它失敗('mca_btl_tcp_frag_recv:readv失敗:連接重置由peer')。爲了迴應你的回答,我在父母和孩子的過程中調用了斷開連接,但是程序只是掛起......我將繼續重寫代碼,以便我只需要一個產生的孩子...... – user989762