2013-11-27 75 views
0

我是CPGPU中的新成員,並且我有一個小問題。我的程序需要大量的計算,所以當timout達到時,Windows TDR開始執行,它會停止執行。 可悲的是我沒有我的程序運行的計算機上的管理員權限,所以修改註冊表項是不可能的。我設法將問題分解成更小的行被處理的圖像,我試圖調用在for循環內重複執行內核。爲了確保卡確實有一些時間來回答我已經把電話之間的一些睡眠時的OS,就像這樣:當TDR開始運行時,長時間運行的cuda內核會停止

for(int row = 0; row<image.y; row++){ 
    printf("%d/%d\n", row, image.y); 
    cudaMemset(dev_matrixes, 0, image.x*image.y*sizeof(short)); 
    countEnergyOfRow<<<B,BLOCK_DIM>>>(...); 
    Sleep(750); 
} 

起初它似乎正常工作,但在21迭代司機粉碎了,TDR再次中風。恢復後,CPU不斷調用內核,接下來的490次它工作正常。我已經跑了好幾次了,每次第21次迭代都是致命的。我也嘗試從一個不同的(第18個)索引開始,但是第21次迭代(第39個索引)又出現了這個問題。 我在做什麼錯,是否有我想念的東西?我應該以某種方式使GPU停止手動計數,或者只是增加睡眠時間?

回答

0

除了Windows TDR之外,Windows WDDM系統還會受到操作的批處理。因此,有一種可能性是,即使單個內核調用未超過超時,操作也會以超出超時的方式進行批處理。

你可以嘗試的一件事是簡單地進一步縮短內核的執行時間。如果內核的執行時間減少到1/10秒,那麼即使批處理操作也不應超過超時。

您可以嘗試的另一件事是嘗試通過在每次內核調用後發出cudaStreamQuery(0);調用來解決批處理問題。

您可能還會檢查第21次迭代是否由於某些原因花費更長時間;您可以添加cudaEvent時間來測量每個內核調用的時間;我相信這將是有益的。

最好的解決方案是在不受WDDM/TDR支配的系統/ GPU上工作。

+0

非常非常感謝!這確實是操作的批處理,導致操作時間過長。不幸的是,我無法縮小內核,但在調用之前添加cudaStreamQuery(0)來解決問題。 更準確地說,我也將它添加到cudaMemset之前,因爲它也很長,並且它在某個時候仍然停止。現在它完美地工作。 – user3017074

相關問題