首页 > 解决方案 > Runtime API 何时销毁主 CUDA 上下文?

问题描述

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

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

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

标签: cudacuda-context

解决方案


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

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

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


推荐阅读