一般情況下,在Windows上使用CUDA時,有必要確保單個內核的執行時間不超過2秒。如果執行時間變長,您可能會遇到一個Windows TDR事件。這是一個Windows看門狗定時器,如果它在一段時間內沒有響應,它將重置GPU驅動程序。這種重置會暫停內核的執行併產生虛假結果,並且通常會在系統托盤中顯示簡短的「黑色」顯示和簡短消息。如果你的內核執行觸發窗口看門狗定時器,你有幾種選擇:
- 如果你在你的系統中使用一個以上的GPU的可能性(即通常說的不是筆記本電腦在這裏)和一個您的GPU是Quadro或Tesla設備,Quadro或Tesla設備通常可以置於TCC模式。這意味着GPU不能再驅動一個物理顯示器(如果它正在驅動一個顯示器的話)並且它從WDDM子系統中被移除,所以不再受到看門狗定時器的影響。您可以使用NVIDIA GPU驅動程序附帶的
nvidia-smi.exe
工具修改給定GPU的從WDDM到TCC的設置。使用Windows文件搜索功能查找nvidia-smi.exe
,然後使用nvidia-smi --help
獲取有關如何從WDDM切換到TCC模式的命令行幫助。
- 如果上述方法不能提供給你(沒有2個GPU,沒有一個的Quadro或特斯拉GPU ...),那麼你可能要調查改變看門狗定時器的設定。不幸的是,這需要修改系統註冊表,並且過程和特定的鍵因操作系統而異。還有網絡上的一些資源,如here來自微軟,以及對堆棧溢出的其他問題,如here,這可能與此幫助。
- 第三種選擇是簡單地限制你的內核(S)的執行時間。連續操作可能會分解爲多個內核調用。內核調用之間的「差距」將允許顯示驅動程序響應操作系統,並防止看門狗超時。
使用此示例,您可以使用命令行開關('-sizemult = xx')更改矩陣的大小,但限制爲10或更小的sizemult,從而得出最大矩陣大小爲(640 ,1280)。由於您正在談論更大的尺寸,我假設您對代碼進行了一些更改。你能發佈那些確切的改變嗎?矩陣大小是通過組合3個不同的數字創建的,所以我不確定您爲了實現這些大小而改變了什麼。 – 2013-05-01 15:37:02
在windows下,您可能還會遇到TDR事件,我對此不確定。 cublas sgemm操作的整體執行時間對於這些尺寸的矩陣來說相當長 - 在我運行的一次測試中大約需要6-7秒。你可以通過將'nIter'循環減少到1或者一個小數字來解決這個問題。你會知道你是否正在點擊Windows TDR事件,因爲屏幕會短暫黑屏。我嘗試將矩陣大小計算中的2和4乘法器修改爲16和32,並且沒有任何問題(雖然主機端計算需要很長時間)。 – 2013-05-01 22:15:57
Indeeed,我正在執行Windows TDR事件並且不知道如何防止/修復它...任何想法? – 2013-05-04 10:04:28