主 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 函数被调用时重新创建。那不会发生。
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 函数被调用时重新创建。那不会发生。