如果我的主机程序 [exit]/[segfault]/[iskilled] 关于 CUDA 上下文破坏和相应分配的资源的相应行为是什么?
“行为”是指自动 GPU 驱动程序端机制,如果我从未在我的程序中明确调用 cudaDeviceReset。
我在 Linux 下工作,我看到我的 GPU 内存使用量在几天(甚至一天)内逐渐增长,而我正在启动有时通过 (CTRL-C) 或简单的段错误(在主机端)...
如果我的主机程序 [exit]/[segfault]/[iskilled] 关于 CUDA 上下文破坏和相应分配的资源的相应行为是什么?
“行为”是指自动 GPU 驱动程序端机制,如果我从未在我的程序中明确调用 cudaDeviceReset。
我在 Linux 下工作,我看到我的 GPU 内存使用量在几天(甚至一天)内逐渐增长,而我正在启动有时通过 (CTRL-C) 或简单的段错误(在主机端)...
也许,如果您正确管理异常,您可以使用atexit()
? 使用示例atexit()
如下:
void ExitFunction() {
cudaDeviceReset();
}
int main(...) {
atexit(ExitFunction);
...
return 0;
}
设备上的所有分配都封装在 CUDA上下文中。使用运行时 API 时,CUDA 上下文是在“幕后”自动创建的。
当应用程序退出时,无论如何,上下文(以及封装在其中的任何相关分配)都应该被销毁。
如果您在各种事件后遇到可用内存的“小”变化,这可能只是因为驱动程序正在为其自己的内部管理任务分配额外的空间。(驱动程序类似于设备的操作系统。)如果您在各种应用程序退出事件后遇到可用内存的“大”变化,那么我会说有问题,但由于您的问题没有提供详细信息或说明如何重现它,我不确定还能说什么。
如果您想从外部强制“重置”驱动程序,您可以尝试通过以下方式卸载驱动程序:
sudo rmmod nvidia
sudo nvidia-smi -a
您的可用内存应该恢复“正常”。