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

When is a primary CUDA context destroyed by the Runtime API?

runtime vs driver this discussion中API,据说

Primary contexts are created as needed, one per device per process, are reference-counted, and are then destroyed when there are no more references to them.

什么算作此类引用?并且 - 这是否意味着,通常,主要上下文应该在重复使用后立即销毁?例如您获得默认设备 ID,然后启动内核; "references" 还剩下什么?当然不是保存设备 ID 的整数变量...

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

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

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