在CUDA脚本执行后,GPU内存不能自行释放

我在执行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 | +-----------------------------------------------------------------------------+ 

有没有什么办法可以释放这个内存备份,而不用重新启动,也许是一个terminal命令?

如果我在CUDA脚本中没有正确pipe理我的内存,或者在脚本停止/退出时该内存是否自动释放,这也是正常行为吗?

谢谢,谢谢。

CUDA运行时API会自动注册一个拆卸函数,这将破坏CUDA上下文并释放应用程序正在使用的任何GPU资源。 只要应用程序隐式或显式地调用exit() ,那么不需要进一步的用户操作像GPU内存那样的自由资源。

如果在运行CUDA代码时发现内存似乎没有被释放,那么通常的怀疑是暂停的,或者是从未调用exit()其他代码的后台实例,并且永远不会销毁它们的上下文。 这是这种情况的原因。

NVIDIA提供了一个API函数cudaDeviceReset ,它将在调用时启动上下文销毁。 通常不需要在设计良好的CUDA代码中使用这个函数,而应该确保在程序中有一个干净的exit()或者返回main()路径。 这将确保运行时库调用的上下文销毁处理程序和资源被释放。