2

仅使用驱动程序 api,例如,我有一个带有以下单个进程的分析 (cuCtxCreate),cuCtxCreate 开销几乎可与 GPU 之间的 300MB 数据复制相媲美:

在此处输入图像描述

在此处的CUDA 文档中,它说 (for 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?我可以在数百个顺序调用的进程列表中只在第一个调用的进程中使用保留并在最后一个调用的进程上使用释放吗?如果最后一个进程无法启动且未调用,系统是否需要重置?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。
  • GPU 在 cuCtxCreate() 期间处于提升频率
  • 项目是在 Windows Server 2016 操作系统和 CUDA 驱动程序安装上编译的 64 位(发布模式),与 windows-7 兼容(这是 K520 + windows_server_2016 的唯一方法)
4

1 回答 1

3

tl;博士:不,不是。

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

否。它旨在允许驱动程序 API 绑定到使用运行时 API 的库已经懒惰地创建的上下文。仅此而已。曾几何时,需要使用驱动程序 API 创建上下文,然后将运行时绑定到它们。现在,有了这些 API,您就不必这样做了。例如,您可以在此处查看Tensorflow 是如何完成的。

这是否意味着使用多线程单应用程序时不会出现问题?

自 CUDA 2.0 以来,驱动程序 API 一直是完全线程安全的

来电者这里有任何进程吗?我可以在数百个顺序[原文如此]调用的进程列表中仅在第一个调用的进程中使用保留并在最后一个调用的进程上使用释放吗?

不,上下文对于给定的过程总是唯一的。它们不能以这种方式在进程之间共享

主要上下文是为此而设计的吗?

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)

不。

于 2018-01-29T06:53:27.527 回答