
[英]Kernel launch failure if the amount of shared memory allocated for the whole grid exceeds 48kB
[英]CUDA: Is It Possible to Use All of 48KB of On-Die Memory As Shared Memory?
我正在使用Windows 7 64位SP1上的CUDA Toolkit 4.0和Visual Studio 2010 Professional為GTX 580開發CUDA應用程序。 我的程序比典型的CUDA程序更耗費內存,我試圖為每個CUDA塊分配盡可能多的共享內存。 但是,每次嘗試為每個塊使用超過32K的共享內存時,程序都會崩潰。
通過閱讀官方CUDA文檔,我了解到CUDA設備上每個SM有48KB的片上存儲器,其計算能力為2.0或更高,而片上存儲器在L1緩存和共享存儲器之間分配:
相同的片上存儲器用於L1和共享存儲器,並且可以為每個內核調用配置多少L1和共享存儲器(第F.4.1節) http://developer.download.nvidia.com /compute/DevZone/docs/html/C/doc/Fermi_Tuning_Guide.pdf
這讓我懷疑在我的程序運行時只有32KB的單內存被分配為共享內存。 因此我的問題是:是否可以將所有48KB的片上內存用作共享內存?
我嘗試了我能想到的一切。 我為nvcc指定了選項--ptxas-options =“ - v -dlcm = cg”,我在程序中調用了cudaDeviceSetCacheConfig()和cudaFuncSetCacheConfig(),但沒有一個解決了這個問題。 我甚至確保沒有寄存器溢出,並且我沒有意外地使用本地內存:
1> 24 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
1> ptxas info : Used 63 registers, 40000+0 bytes smem, 52 bytes cmem[0], 2540 bytes cmem[2], 8 bytes cmem[14], 72 bytes cmem[16]
雖然我可以使用32KB的共享內存,這已經給了我巨大的性能提升,但我寧願充分利用所有快速的片上內存。 任何幫助深表感謝。
更新:我在程序崩潰時啟動了640個線程。 512給了我比256更好的性能,所以我試圖進一步增加線程數。
您的問題與共享內存配置無關,但與您要啟動的線程數有關。
每個線程使用63個寄存器並啟動640個線程,總共可以提供40320個寄存器。 您的設備的注冊總量為32K,因此資源不足。
關於片上存儲器在Tom的答案中得到了很好的解釋,並且正如他所評論的那樣,檢查API調用中的錯誤將有助於您將來的錯誤。
計算能力2.0及更高版本的設備每個SM具有64KB的片上存儲器。 這可配置為16KB L1和48KB塗層或48KB L1和16KB塗層(計算能力3.x上也是32/32)。
您的程序因其他原因而崩潰。 您是否檢查所有API調用是否有錯誤? 你試過cuda-memcheck嗎?
如果您使用太多共享內存,那么當您啟動內核時說明資源不足時會出現錯誤。
此外,將參數從主機傳遞到GPU使用共享內存(最多256個字節),因此您永遠不會獲得實際的48KB。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.