我最近開始學習CUDA,並且偶然發現了一個我無法理解的非常奇怪的行爲。CUDA運行時API錯誤30:重複的內核調用
我的代碼實質上是計算一個簡單的atomicAdd內核的平均執行時間。爲了達到這個目的,我在循環中調用內核以獲得更好的平均值。我將循環中的設備內存分配和副本包含進來,因爲我想將其包含在執行時間估計中。問題是,如果運行循環的次數太高,程序通常會因運行時API錯誤30而失敗。
我懷疑我的內存訪問可能有問題,所以我在程序上運行memcheck無濟於事。顯然沒有內存錯誤。另外,如果只運行內核幾次,就沒有問題,這似乎也表明內核不是問題。只有當我連續頻繁地打電話給我時,我纔會遇到問題。
的我的代碼框架如下:
for(int i = 0; i < runs; i++)
{
//////////////////////////////////
// Copy memory from Host to Device
//////////////////////////////////
cutilSafeCallNoSync(cudaMemcpy(dev_waveforms, waveforms, num_wf * wf_length * sizeof(float),
cudaMemcpyHostToDevice));
cutilSafeCallNoSync(cudaMemcpy(dev_delays, delays, num_wf * sizeof(int),
cudaMemcpyHostToDevice));
////////////////////////
// Kernel Call
////////////////////////
kernel_wrapper<float>(dev_waveforms, dev_focused, dev_delays,
wf_length, num_wf, threads, blocks, kernel);
//copy back to host memory.
cutilSafeCallNoSync(cudaMemcpy(focused, dev_focused, J * wf_length * sizeof(float),
cudaMemcpyDeviceToHost));
}
同樣,如果運行足夠大,這不但不能。還有其他奇怪的事情正在進行,但我現在就把它留在這裏。
哦,我正在使用Visual Studio 2010在Windows 7上開發。我的GPU也充當我的視頻卡,我擔心這可能會產生奇怪的效果。
在此先感謝!
在Windows下也可以在長途旅行看門狗定時器內核。有可能多個內核不同步可能導致同樣的問題。查看它是否與時間閾值(例如30秒)相關。 –
根據@PaulR的說法,嘗試在循環中添加一個'cudaDeviceSynchronize();'。 –
快速更新:我將看門狗定時器的閾值從默認值2設置爲8s。我最初認爲這有幫助,因爲我取得了8/10次的成功。但是,我剛剛嘗試過,成功率爲0%。不一致使調試變得困難。但是,這並沒有解釋如何改變陣列大小影響問題。此外,數組的內容似乎也有效果。 –