如果我的主机程序[exit] / [segfault] / [被杀],有关CUDA上下文销毁和相应分配资源的相应行为是什么?
“行为”我指的是自动GPU驱动程序端机制,如果我从未在程序中明确调用cudaDeviceReset。
我正在Linux下工作,我看到我的GPU内存使用量在几天(甚至一天)内逐渐增加,而我推出的CUDA代码有时通过(CTRL-C)终止或者仅仅是segfaulting (在主机方面)......
答案 0 :(得分:3)
也许,如果您正确管理例外,您可以使用atexit()
?使用atexit()
的示例如下:
void ExitFunction() {
cudaDeviceReset();
}
int main(...) {
atexit(ExitFunction);
...
return 0;
}
答案 1 :(得分:2)
设备上的所有分配都封装在CUDA context中。使用运行时API时,CUDA上下文是created automatically“在幕后”。
当应用程序退出时,无论如何,上下文(以及封装在其中的任何相关分配)都应销毁。
如果您在各种事件之后遇到空闲内存的“小”变化,这可能只是驱动程序为内部内务处理任务分配额外空间的事实。 (驱动程序类似于设备的操作系统。)如果您在各种应用程序退出事件后遇到空闲内存中的“大”更改,那么我会说有些问题,但是因为您的问题没有提供详细信息或指示如何为了重现它,我不确定还能说些什么。
如果要在外部强制驱动程序“重置”,可以尝试通过以下方式卸载驱动程序:
sudo rmmod nvidia
sudo nvidia-smi -a
你的自由记忆应该恢复“正常”。