cuDevicePrimaryCtxRetain()用于在多个进程之间拥有持久性CUDA上下文对象吗?

时间:2018-01-25 13:58:54

标签: cuda

例如,仅使用驱动程序api,我在下面使用单个进程进行概要分析(cuCtxCreate),cuCtxCreate开销几乎可以与GPU之间的300MB数据副本相媲美:

enter image description here

在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)
  • 所有内容都是为sm_30编译的,而设备是Grid K520。
  • 在cuCtxCreate()
  • 期间GPU处于提升频率
  • Project是在Windows服务器2016 OS和CUDA驱动程序安装上编译的64位(发布模式),兼容windows-7(这是K520 + windows_server_2016的唯一方式)

1 个答案:

答案 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)

没有