2015-11-09 27 views
1

我已經寫了一個代碼來捕獲gfortran的CTRL + C的信號,它的工作原理。爲mpif90信號處理和檢查指向

program trap 
external trap_term 
call signal(2, trap_term) 
call sleep(60) 
end program trap 

function trap_term() 
integer::trap_term 
print*,'done' 
call exit(trap_term) 
end function trap_term 

如何爲mpif90寫完全一樣的東西?另外,在並行處理器中包含檢查點並重新啓動(可能是自動)代碼(來自之前的代碼)的最佳方式是什麼?

這是必需的,因爲我已經在羣集上分配了時間。在固定的小時數後,工作將被踢出,並且需要重新提交新的工作。

+2

'mpif90'通常是一個編譯器封裝器,它通過增加調用來編譯一個程序,並使用mpi安裝和運行時的鏈接進行編譯。嘗試在您對'mpif90'的調用中添加選項'-show'並觀察輸出。 –

回答

3

將軟件寫入檢查點從操作系統收到kill信號可能遠沒有你想象的那麼有用。假設你可以編寫你的程序來編寫一個完整的檢查點,當它被告知停止的時候,它會在可用的時間內寫入一個完整的檢查點。然後,您只需從先前停止的任意點重新啓動程序即可。這是一個微不足道的問題。

在這個領域,爲什麼不做我們中許多人曾經做過的事情,還有很多人仍然這樣做?將代碼寫入檢查點每X次迭代或以大約Y分鐘的間隔(您選擇X和Y)?如果以前的執行過早停止,那麼編寫例程以從其中一個檢查點重新啓動。這樣您只需從單個定義的執行狀態重新啓動。

無論如何,您應該寫這些檢查點和重啓例程以防止硬件問題,隨着CPU數量的增加和網絡連接數量的增加,硬件問題只會變得更糟。

我想你可以編寫你的代碼,以保持對掛鐘的關注,並且在啓動時告訴它,它有N小時的允許值,以便在Nn小時處檢查點,在那裏n足夠長,可以用小的誤差範圍來執行檢查點。但是如果一個CPU在計算中失敗,這種方法將無濟於事。

+1

我有時(很少)爲你的第一段做的事是捕獲一個信號,然後在下一個合適的點(迭代結束等)執行檢查點。這仍然符合「每X次迭代」,但提供一點額外的靈活性。在缺點方面,這幾乎不是檢查站,而是快速週轉。 – francescalus

2

tl; dr;像高績效標誌和francescalus一樣。

除了HPM在回答中提到的內容,請記住,您允許在信號處理程序中執行的操作是極其有限。例如,不允許分配內存,這反過來排除了很多其他事情,如Fortran(或C stdio)I/O,因爲Fortran I/O例程可能會分配內存以供自己使用。您可以看到所謂的「異步信號安全」POSIX函數列表,例如在http://man7.org/linux/man-pages/man7/signal.7.html

在信號處理程序中您可以可靠地執行的幾件事情之一是設置一些標誌變量,然後在主程序中稍後檢查它們。例如。迭代完成後,檢查標誌是否檢查點並退出,然後執行所有I/O以及「正常」上下文中的任何操作,而不是在信號處理程序上下文中。這實際上是francescalus在他對HPM的回答的評論中解釋的。