2015-04-06 67 views
0

我在執行CUDA腳本後(即使使用cudaFree()),我的顯卡仍留有內存問題。GPU內存在CUDA腳本執行後沒有自行釋放

在啓動時,已使用的總內存大約爲128MB,但在腳本運行後,它會在內存執行中耗盡內存。

NVIDIA-SMA:

+------------------------------------------------------+      
| NVIDIA-SMI 340.29  Driver Version: 340.29   |      
|-------------------------------+----------------------+----------------------+ 
| GPU Name  Persistence-M| Bus-Id  Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap|   Memory-Usage | GPU-Util Compute M. | 
|===============================+======================+======================| 
| 0 GeForce GTX 660 Ti Off | 0000:01:00.0  N/A |     N/A | 
| 10% 43C P0 N/A/N/A | 2031MiB/2047MiB |  N/A  Default | 
+-------------------------------+----------------------+----------------------+ 

+-----------------------------------------------------------------------------+ 
| Compute processes:            GPU Memory | 
| GPU  PID Process name          Usage  | 
|=============================================================================| 
| 0   Not Supported            | 
+-----------------------------------------------------------------------------+ 

有什麼辦法來釋放該內存備份而無需重啓,或許是終端命令?

如果我沒有在CUDA腳本中正確管理自己的內存,或者該腳本停止/退出時該內存是否自動釋放,這也是正常行爲嗎?

謝謝 謝謝。

+2

如果您的程序確實退出,CUDA上下文將被銷燬並釋放其使用的所有資源。你確定你沒有一堆殭屍或掛在你的程序仍然在後臺運行的實例嗎? – talonmies 2015-04-06 13:34:39

+0

這是問題所在,我認爲這些進程會在崩潰/完成時自殺。我檢查了系統監視器,發現我運行的輸出文件有幾個進程。殺死那些GPU內存後釋放自己。是否有一個命令,我可以添加到c/cuda以釋放所有gpu內存意外停止(如ctrl + z退出,而不僅僅是如果cudaMalloc失敗)?如果你把它變成一個答案,我也會將它標記爲正確的,再次感謝 – 2015-04-06 13:48:15

+1

你知道ctrl-z不會向前臺進程發送一個SIGINT或SIGTERM信號,它發送SIGTSTP(與ctrl-c或kill不同)。除非您在應用程序中註冊一個信號處理程序來捕獲SIGSTP並導致應用程序退出,否則它永遠不會知道ctrl-z曾經被推送(這是設計)。這聽起來像是用戶行爲問題,而不是編程問題。 – talonmies 2015-04-06 14:00:26

回答

6

CUDA運行時API會自動註冊一個拆卸函數,該函數將銷燬CUDA上下文並釋放應用程序正在使用的任何GPU資源。只要應用程序隱式或顯式調用exit(),則不需要進一步的用戶操作,如GPU內存等免費資源。

如果您發現內存在運行CUDA代碼時似乎沒有被釋放,那麼通常的嫌疑人會被暫停,或者該代碼或其他代碼的後臺實例從未調用過exit(),並且永遠不會銷燬它們的上下文。這是這種情況下的原因。

NVIDIA確實提供了一個API函數cudaDeviceReset,它將在調用時啓動上下文銷燬。通常不需要在設計良好的CUDA代碼中使用此功能,而應該嘗試確保程序中存在乾淨的exit()或從main()返回的路徑。這將確保運行時庫調用並釋放資源的上下文銷燬處理程序。