顯然,mpirun
使用SIGINT處理程序,它將SIGINT信號「轉發」給它產生的每個進程。mpirun的自定義中斷處理程序
這意味着您可以爲啓用mpi的代碼編寫中斷處理程序,執行mpirun -np 3 my-mpi-enabled-executable
,然後針對這三個進程中的每一個都會引發SIGINT。此後不久,mpirun退出。當你有一個小的自定義處理程序,它只打印一個錯誤消息,然後退出時,這工作正常。 但是,當你的自定義中斷處理程序正在做一個非平凡的工作(例如,執行嚴重的計算或持久化數據)時,處理程序不會運行到完成。我假設這是因爲mpirun決定儘快退出。
這是在執行my-mpi-enabled-executable
後按ctrl-c
(即導致SIGINT)時的stderr。這是理想的預期行爲:
interrupted by signal 2.
running viterbi... done.
persisting parameters... done.
the master process will now exit.
這裏是在執行mpirun -np 1 my-mpi-enabled-executable
後,按ctrl-c
標準錯誤。這是有問題的行爲:
interrupted by signal 2.
running viterbi... mpirun: killing job...
--------------------------------------------------------------------------
mpirun noticed that process rank 0 with PID 8970 on node pharaoh exited on signal 0 (Unknown signal 0).
--------------------------------------------------------------------------
mpirun: clean termination accomplished
回答下列問題的任何將解決我的問題:
- 如何重寫的mpirun SIGINT處理程序(如果可能的話)?
- 如何避免mpirun在mpirun終止後立即生成進程的終止?
- mpirun在mpirun終止之前是否還有另一個信號可以發送給子進程?
- 有沒有辦法「捕捉」所謂的「信號0(未知信號0)」(見上面的第二個標準錯誤)?
我在linux上運行openmpi-1.6.3。
我面臨同樣的問題012irmpirun一發出SIGINT信號就立即退出,所以如果他們處理信號並且需要很長時間,parallle進程仍然繼續運行。 如果mpirun之後的bash腳本執行其他的東西來複制文件,那很糟糕,因爲進程可能仍然會清理 – Gabriel 2016-02-17 18:06:52