2012-10-31 69 views
0

我有以下代碼http://pastebin.com/vLeD1GJm至極工作得很好,但如果我增加:CUDA未指定發射失敗的錯誤

#define GPU_MAX_PW 100000000 

到:

#define GPU_MAX_PW 1000000000 

然後我得到:

[email protected]:~/Dropbox/coisas/projetos/delta_cuda$ optirun ./a 
block size = 97657 grid 48828 grid 13951 

unspecified launch failure in a.cu at line 447.. err number 4 

我在有2GB內存的GTX 675M上運行它。 GPU_MAX_PW的第二個定義將有大約1000000000×2÷1024÷1024 = 1907 MB,所以我不會內存不足。因爲我只分配更多內存,可能會出現什麼問題?也許網格和塊配置變得不可能?該錯誤是指向該行

注:

所有的
HANDLE_ERROR(cudaMemcpy(gwords, gpuHashes, sizeof(unsigned short) * GPU_MAX_PW, cudaMemcpyDeviceToHost)); 
+0

我在cudaThreadSynchronize()後添加了一個代碼驗證。並且錯誤在那裏,而不是在驗證結果 –

+0

如果您運行nvidia-smi -a(沒有在GPU上運行)報告了多少空閒內存? –

+0

@RobertCrovella它報告「免費:2037 MB」 –

回答

3

首先,你有你的尺寸不正確列出。該計劃的工作量爲10,000,000而不是100,000,000(而你說它的工作量爲100,000,000而不是1,000,000,000)。所以內存大小不是問題,並且您的計算基於錯誤的數字。

calculate_grid_parameters被搞砸了。該功能的目標是根據指定所需線程總數和每塊1024個線程(硬編碼)的GPU_MAX_PW來計算需要多少塊並因此確定網格大小。打印出塊大小=網格...網格的線......實際上是解決問題的線索。對於100,000,000的GPU_MAX_PW,此函數正確計算需要100,000,000/1024 = 97657塊。但是,網格尺寸計算錯誤。網格尺寸grid.x * grid.y應該等於所需塊的總數(大約)。但是這個函數決定了它需要grid.x爲48828,grid.y爲13951.如果我乘以這兩個,我得到681,199,428,這比想要的總塊數97657大得多。現在,如果我然後啓動一個內核要求的網格尺寸爲48828(x)和13951(y),並且還要求每塊1024個線程,我已經在該內核啓動中請求了697,548,214,272個線程總數。首先,這不是你的意圖,其次,雖然目前我不能確切地說出原因,但這顯然太多了。只要說這個總的網格請求超過了機器的一些資源限制即可。

注意,如果你從億下降到10,000,000爲GPU_MAX_PW,網格運算變爲「懂事」,我得到:

block size = 9766 grid 9766 grid 1 

,並沒有發射失敗。

+0

下面是該功能的一個固定版本http://pastebin.com/Azp6bVEz,現在它運行良好。謝謝! –

相關問題