簡體   English   中英

幫助! CUDA kernel 使用過多后將不再啟動 memory

[英]HELP! CUDA kernel will no longer launch after using too much memory

我正在編寫一個需要以下 kernel 啟動的程序:

dim3 blocks(16,16,16); //grid dimensions
dim3 threads(32,32); //block dimensions
get_gaussian_responses<<<blocks,threads>>>(pDeviceIntegral,itgStepSize,pScaleSpace);

我忘記在程序結束時釋放 pScaleSpace 數組,然后通過 CUDA 分析器運行程序,該程序連續運行 15 次,用完很多 memory / 導致大量碎片。 現在,每當我運行程序時,kernel 甚至都不會啟動。 如果我查看分析器記錄的 function 調用列表,則 kernel 不存在。 我意識到這是一個非常愚蠢的錯誤,但我不知道此時我能做些什么來讓程序再次運行。 我已經重新啟動了我的計算機,但這並沒有幫助。 如果我減小 kernel 的尺寸,它運行良好,但當前尺寸完全在我的卡允許的最大值之內。

Max threads per block: 1024
Max grid dimensions: 65535,65535,65535

任何建議表示贊賞,在此先感謝!

嘗試使用較少數量的線程啟動。 如果可行,則意味着您的每個線程都在做大量工作或使用大量 memory。 因此,CUDA 在您的硬件上實際上不可能啟動最大可能的線程數。

您可能必須使您的 CUDA 代碼更高效,才能啟動更多線程。 如果 kernel 內部有復雜的邏輯,您可以嘗試將其切片。 或者獲得更強大的硬件。

如果你像這樣編譯你的代碼:

nvcc -Xptxas="-v" [other compiler options]

匯編器將報告代碼所需的本地堆 memory 的數量。 這對於查看 kernel 的 memory 封裝是什么可能是有用的診斷。 還有一個 API 調用cudaThreadSetLimit可用於控制每個線程堆 memory 的數量,kernel 將在執行期間嘗試和消耗。

最近的工具包附帶了一個名為 cuda-memchk 的實用程序,它提供類似於 valgrind 的 kernel memory 訪問分析,包括緩沖區溢出和非法 ZCD69B4957F06CD818D77BF3D61980E291 使用。 It might be that your code is overflowing some memory somewhere and overwriting other parts of GPU memory, leaving the card in a parlous state.

我知道了。 nVidia NSight 2.0 - 據稱支持 CUDA 4 - 將我的 CUDA_INC_PATH 更改為使用 CUDA 3.2。 難怪它不會讓我為每個塊分配 1024 個線程,除了所有的欣慰和歡呼。 考慮到我已經安裝了 CUDA 4.0 RC2,這是一個非常愚蠢和煩人的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM