主机进程终止时的CUDA上下文破坏

时间:2013-10-04 15:17:42

标签: linux memory process cuda termination

如果我的主机程序[exit] / [segfault] / [被杀],有关CUDA上下文销毁和相应分配资源的相应行为是什么?

“行为”我指的是自动GPU驱动程序端机制,如果我从未在程序中明确调用cudaDeviceReset。

我正在Linux下工作,我看到我的GPU内存使用量在几天(甚至一天)内逐渐增加,而我推出的CUDA代码有时通过(CTRL-C)终止或者仅仅是segfaulting (在主机方面)......

2 个答案:

答案 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 

你的自由记忆应该恢复“正常”。