例如,仅使用驱动程序api,我在下面使用单个进程进行概要分析(cuCtxCreate),cuCtxCreate开销几乎可以与GPU之间的300MB数据副本相媲美:
在CUDA文档here中,它表示(对于cuDevicePrimaryCtxRetain)Retains the primary context on the device, creating it **if necessary**
。这是从命令行重复调用同一进程的预期行为(例如运行1000次以显式处理1000个不同的输入图像)?设备是否需要CU_COMPUTEMODE_EXCLUSIVE_PROCESS按预期工作(多次调用时重用相同的上下文)?
现在,即使我多次调用该过程,上图也是一样的。即使不使用分析器,时间也会显示大约1秒的完成时间。
修改:根据文档,主要上下文为one per device per process
。这是否意味着在使用多线程单一应用程序时不会出现问题?
主要背景的重复使用时限是多少?进程之间的时间是1秒还是必须是毫秒来保持主要上下文存活?
我已经将ptx代码缓存到一个文件中,因此唯一剩余的开销看起来像cuMemAlloc(),malloc()和cuMemHostRegister()
所以重新使用从上次调用到同一进程的最新上下文将优化时序好。
编辑-2:文档The caller must call cuDevicePrimaryCtxRelease() when done using the context.
代表cuDevicePrimaryCtxRetain
。 来电者在这里有任何流程吗?我可以在第一个被调用的进程中使用retain,并在数百个后续调用的进程列表中使用最后一个被调用进程的release吗?如果最后一个流程无法启动且cuDevicePrimaryCtxRelease
未被调用,系统是否需要重置?
修改-3:
主要用于此目的吗?
process-1: retain (creates)
process-2: retain (re-uses)
...
process-99: retain (re-uses)
process-100: 1 x retain and 100 x release (to decrease counter and unload at last)
答案 0 :(得分:1)
cuDevicePrimaryCtxRetain()是否用于在多个进程之间拥有持久的CUDA上下文对象?
没有。它旨在允许驱动程序API绑定到已使用运行时API的库已经懒惰创建的上下文。没有比这更好的了。曾几何时,有必要使用驱动程序API创建上下文,然后让运行时绑定到它们。现在,使用这些API,您不必这样做。例如,您可以在Tensorflow here中查看这是如何完成的。
这是否意味着在使用多线程单一应用程序时不会出现问题?
自CUDA 2.0以来,驱动程序API一直是完全线程安全的
来电者是否有任何流程?我可以在第一个被调用的进程中使用retain并在最后一个被调用的进程中使用release,这个进程列在数百个后续[sic]被调用的进程中吗?
没有。上下文始终是给定流程的唯一选择。它们不能以这种方式在进程之间共享
主要用于此目的吗?
process-1: retain (creates) process-2: retain (re-uses) ... process-99: retain (re-uses) process-100: 1 x retain and 100 x release (to decrease counter and unload at last)
没有