Linux CUDA脚本执行后GPU内存未释放

Linux CUDA脚本执行后GPU内存未释放,linux,cuda,gpu,nvidia,linux-mint,Linux,Cuda,Gpu,Nvidia,Linux Mint,我的图形卡在执行CUDA脚本(即使使用cudaFree())后仍无法保留内存 启动时,使用的总内存约为128MB,但在脚本运行后,在执行过程中内存不足 英伟达sma: +------------------------------------------------------+ | NVIDIA-SMI 340.29 Driver Version: 340.29 | |---

我的图形卡在执行CUDA脚本(即使使用cudaFree())后仍无法保留内存

启动时,使用的总内存约为128MB,但在脚本运行后,在执行过程中内存不足

英伟达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()
返回路径。这将确保调用运行时库的上下文销毁处理程序和资源被释放。

如果您的程序实际退出,CUDA上下文将被销毁,它使用的任何资源都将被释放。你确定你的程序没有一堆僵尸或挂起的实例仍在后台某处运行吗?这就是问题所在,我想进程会在崩溃/完成时自杀。我检查了系统监视器,发现我运行的文件中有几个进程。在杀死这些之后,GPU内存释放了自己。是否有一个命令可以添加到c/cuda中,以便在意外停止时释放所有gpu内存(例如ctrl+z退出,而不仅仅是cudaMalloc失败)?如果你把它变成一个答案,我也会把它标记为正确的,再次感谢你明白ctrl-z不会向前台进程发送SIGINT或SIGTERM信号,它会发送SIGTSTP(与ctrl-c或kill不同)。除非您在应用程序中注册一个信号处理程序来捕获SIGSTP并使应用程序退出,否则它永远不会知道曾经按下过ctrl-z(这是出于设计)。这听起来像是用户行为问题,而不是编程问题。好的,谢谢你提供的信息