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