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