2012-08-30 34 views
3

我最近開始學習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也充當我的視頻卡,我擔心這可能會產生奇怪的效果。

在此先感謝!

+1

在Windows下也可以在長途旅行看門狗定時器內核。有可能多個內核不同步可能導致同樣的問題。查看它是否與時間閾值(例如30秒)相關。 –

+1

根據@PaulR的說法,嘗試在循環中添加一個'cudaDeviceSynchronize();'。 –

+0

快速更新:我將看門狗定時器的閾值從默認值2設置爲8s。我最初認爲這有幫助,因爲我取得了8/10次的成功。但是,我剛剛嘗試過,成功率爲0%。不一致使調試變得困難。但是,這並沒有解釋如何改變陣列大小影響問題。此外,數組的內容似乎也有效果。 –

回答

2

Windows 7驅動程序可以將多個命令分批存放到一個提交文件中,以解決WDDM增加的驅動程序開銷(與之前的WDDM驅動程序相比,例如Win XP)。因爲這個原因,即使單個內核沒有超過看門狗,也可能會像這樣在一個循環中運行。您可以撥打cudaDeviceSynchronize(),因爲@RogerDahl建議嘗試解決它(可能只有每N次迭代)。

或者在Linux上運行。

編輯: 運行時錯誤30是未知錯誤。如果這是一個看門狗定時器超時,我期望一個cudaErrorLaunchTimeout(錯誤6)。由於您沒有提供完整的代碼,因此很難說是什麼導致了錯誤。我懷疑你的內核代碼有一個錯誤。

+0

感謝大家的建議。我在循環中添加了'cudaDeviceSynchronize()',但問題仍然存在。我正在考慮更改與看門狗定時器相關聯的註冊表項,我會對此進行測試,但我懷疑這不是問題。我發現,如果我**通過在代碼中設置J = 2來重新設置輸出數組的大小並將其設置爲dev_focused,則可以消除此問題。例如,如果我有run = 1000,程序只會在J = 1時成功2/10次。J = 2的成功率爲10/10。所以這是一個解決方案,但我沒有解釋。 –

1

我遇到了同樣的錯誤,發現我的內核實際上超出了我分配的內存。由於您將緩衝區加倍並看到問題消失,因此我預計您可能會遇到同樣的問題。

我的問題是我的數學中的一個錯誤,以確定要啓動多少個線程和塊。我按照我的意圖啓動了八倍的塊。在我的內核中,確定給定線程應該工作的元素的數學算法導致訪問數組以外的方式。

請確保您檢查每個線程正在處理的陣列中的哪個元素,以防止執行將訪問/修改陣列外部存儲器的線程。

1

對於任何人來這個帖子尋找答案,爲什麼你得到一個錯誤30日消息:

您也將獲得這個錯誤,如果你不小心把CPU變量的參數之一爲您的GPU 設備功能。這是我對這個問題最常見的原因。你可能會認爲之後的意外撥打的變量,你會學到一個參數的CPU副本這麼多次,但...

確保所有的參數爲您的設備功能: myDeviceFunciont < < < 1,N >>>(參數1,參數2,參數3)

是GPU的變量(如:你在cudaMalloc & cudaMemcpy用於分配的GPU內存變量)