主 CUDA 上下文何时被运行时 API 销毁?

ein*_*ica 2 cuda cuda-context

在关于运行时与驱动程序 API 的讨论中,据说

主要上下文根据需要创建,每个设备每个进程一个,并进行引用计数,然后在不再有对它们的引用时销毁。

什么算作此类参考文献?而且——这是否意味着,通常情况下,主要上下文应该在重复使用后立即被销毁?例如,您获得默认设备 ID,然后启动内核;还剩下什么“参考资料”?当然它不是保存设备 ID 的整数变量......

tal*_*ies 5

运行时 API 的确切内部工作原理均未记录在案,并且有经验证据表明它们随着时间的推移发生了微妙的变化。也就是说,如果您检查工具链发出的主机代码样板并运行一些主机端跟踪,则可以推断它是如何工作的,以下是我基于以这种方式进行的观察的理解。

重要的是要认识到主上下文引用计数是驱动程序中的内部函数,并且“惰性上下文建立”机制本身使用一些内部 API 挂钩,这些挂钩将绑定到由驱动程序 API 显式创建的现有主上下文(这会增加引用计数),或者如果没有可用的则创建一个本身,然后绑定到该上下文(这也会增加引用计数)。从主上下文解除绑定的例程通过注册atexit,并将在应用程序退出或被cudaDeviceReset()调用时触发。

这种方法可以防止您提出的潜在场景,即当引用计数降至零时,上下文会被不断销毁,然后在调用另一个运行时 API 函数时会重新创建上下文。那不会发生。