CUDA 脚本执行后 GPU 内存未自行释放
GPU Memory not freeing itself after CUDA script execution
我的显卡在执行 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 代码中通常不需要使用此函数,而是您应该尝试并确保程序中有来自 main()
的干净 exit()
或 return 路径。这将确保调用运行时库并释放资源的上下文销毁处理程序。
我的显卡在执行 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 代码中通常不需要使用此函数,而是您应该尝试并确保程序中有来自 main()
的干净 exit()
或 return 路径。这将确保调用运行时库并释放资源的上下文销毁处理程序。