GPU内存在CUDA脚本执行后无法自行释放

Jam*_*ons 2 linux cuda gpu nvidia linux-mint

执行CUDA脚本后,我的显卡保留内存有问题(即使使用cudaFree()).

在启动时,Total Used内存大约为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                                               |
+-----------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有重启的情况下释放这些内存,也许是一个终端命令?

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

tal*_*ies 6

CUDA运行时API自动注册拆解功能,该功能将破坏CUDA上下文并释放应用程序正在使用的任何GPU资源.只要应用程序隐式或显式调用exit(),就不需要进一步的用户操作就可以获得GPU内存等免费资源.

如果你确实发现在运行CUDA代码时似乎没有释放内存,那么通常的嫌疑人会被挂起,或者那个或其他代码的后台实例从未调用过exit(),也从不破坏它们的上下文.这就是这种情况的原因.

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