每个CUDA上下文确实花费了相当多的设备内存,并且它们的资源严格地彼此分区.例如,上下文B中不能访问在上下文A中分配的设备内存.流也仅在创建它们的上下文中有效.
最佳实践是为每个设备创建一个CUDA上下文.默认情况下,只能从创建它的CPU线程访问该CUDA上下文.如果要从其他线程访问CUDA上下文,请调用cuCtxPopCurrent()以从创建它的线程中弹出它.然后可以将上下文推送到任何其他CPU线程的当前上下文堆栈,随后的CUDA调用将引用该上下文.
上下文推送/弹出是轻量级操作,从CUDA 3.2开始,它们可以在CUDA运行时应用程序中完成.所以我的建议是初始化CUDA上下文,然后调用cuCtxPopCurrent()使上下文"浮动",除非有些线程想要操作它.将"浮动"状态视为自然状态 - 每当线程想要操纵上下文时,将其使用括在cuCtxPushCurrent()/ cuCtxPopCurrent()中.
归档时间: |
|
查看次数: |
4478 次 |
最近记录: |