2013-04-08 72 views
1

顯然,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。

+0

我面臨同樣的問題012irmpirun一發出SIGINT信號就立即退出,所以如果他們處理信號並且需要很長時間,parallle進程仍然繼續運行。 如果mpirun之後的bash腳本執行其他的東西來複制文件,那很糟糕,因爲進程可能仍然會清理 – Gabriel 2016-02-17 18:06:52

回答

3

根據OpenMPI manpage您可以發送SIGUSR1SIGUSR2mpirun這將轉發它,而不是關閉自己。

0

當遇到同樣的問題時,我遇到了這個問題和@Zulan的答案。

我特別想從用戶那裏得到一個SIGINT(Ctrl + C),做一些事情,然後以有序的方式退出。因此,使用SIGUSR1不是一個選項。閱讀@Zulan鏈接的手冊頁顯示mpirun(至少OpenMPI版本)捕獲SIGINT,然後發送一個SIGTERM信號給子進程。因此,在我的代碼中捕獲SIGTERM允許我調用正確的出口例程。

請注意,信號處理不能用MPI保存,如here所述。