的後續行動:CUDA: Stop all other threads崩潰內核優雅
我正在尋找一種方式,如果一個「壞狀態」時退出內核。 編程手冊說NVCC不支持異常處理。我想知道是否有用戶定義的cuda錯誤代碼。換句話說,如果「壞」發生,然後用此用戶錯誤代碼終止。我懷疑有一個,所以我的另一個想法是導致一個。
類似的,如果「壞」發生,除以零。但是我不確定一個線程是否被零分割,是否足以導致整個內核崩潰,或僅僅是那個線程?
有沒有更好的方法來終止內核?
的後續行動:CUDA: Stop all other threads崩潰內核優雅
我正在尋找一種方式,如果一個「壞狀態」時退出內核。 編程手冊說NVCC不支持異常處理。我想知道是否有用戶定義的cuda錯誤代碼。換句話說,如果「壞」發生,然後用此用戶錯誤代碼終止。我懷疑有一個,所以我的另一個想法是導致一個。
類似的,如果「壞」發生,除以零。但是我不確定一個線程是否被零分割,是否足以導致整個內核崩潰,或僅僅是那個線程?
有沒有更好的方法來終止內核?
你應該先讀this question and the answers by harrism and tera(問/昨天回答)。
你可能想使用類似
if (there_is_an_error) {
*status = MY_ERROR_CODE; // store to device pointer
__threadfence(); // ensure store issued before trap
asm("trap;"); // kill kernel with error
}
這並不完全滿足你的「正常」狀態,在我看來。陷阱導致內核退出並且運行時報告cudaErrorUnknown
。但是由於內核執行是異步的,你需要同步你的流/設備才能捕獲這個錯誤,這意味着在每次內核調用後進行同步,除非你確定有不準確的錯誤(例如,你可能不會捕獲錯誤代碼,直到在調用後續的CUDA API調用)。
但是,這只是CUDA內核錯誤處理的方式,編寫良好的代碼應該在調試版本中同步以檢查內核錯誤,並在發佈版本中解決不精確的錯誤消息。不幸的是,我認爲沒有比這更優雅的方式。
編輯:關於Compute capability 2.0及更高版本,您可以使用assert()以調試版本中的錯誤退出。目前還不清楚這是不是你想要的。
斷言可能會幫助你。您可以在CUDA C編程指南的B.15中找到它。
如果您的主要用途是調試,那麼CUDA在Fermi和Kepler上表示支持。它會殺死你的上下文,但它會在出路中給出一個有用的斷言消息,或者讓你進入斷言失敗的代碼是你在調試器中運行你的應用程序 – talonmies