执行CUDA脚本后,我的图形卡仍存在内存问题(即使使用cudaFree())。

引导时,“已用总内存”约为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脚本中正确管理内存,还是在脚本停止/退出时该内存会自动释放,这也是正常现象吗?

最佳答案

CUDA运行时API自动注册一个拆解函数,该函数将破坏CUDA上下文并释放应用程序正在使用的所有GPU资源。只要应用程序隐式或显式调用exit(),则不需要进一步的用户操作即可释放GPU内存等可用资源。

如果您确实发现运行CUDA代码时似乎没有释放内存,则通常可疑的对象将被挂起或该代码或其他从未调用exit()且从未破坏其上下文的代码的后台实例。这就是这种情况的原因。

NVIDIA确实提供了API函数cudaDeviceReset,该函数将在调用时启动上下文销毁。通常不需要在设计良好的CUDA代码中使用此功能,而是应尝试确保程序中存在干净的exit()main()的返回路径。这将确保调用运行时库的上下文销毁处理程序,并释放资源。

关于linux - CUDA脚本执行后,GPU内存无法释放自身,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29472093/

10-15 18:01