例如,仅使用驱动程序 api,我对下面的单个进程进行了分析(cuCtxCreate),cuCtxCreate 开销几乎相当于与 GPU 之间的 300MB 数据复制:
在 CUDA 文档中here http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__PRIMARY__CTX.html#group__CUDA__PRIMARY__CTX_1g9051f2d5c31501997a6cb0530290a300,它说(对于 cuDevicePrimaryCtxRetain)Retains the primary context on the device, creating it **if necessary**
。这是从命令行重复调用同一进程的预期行为吗(例如运行一个进程 1000 次以显式处理 1000 个不同的输入图像)?设备是否需要 CU_COMPUTEMODE_EXCLUSIVE_PROCESS 才能按预期工作(多次调用时重新使用相同的上下文)?
目前,即使我多次调用该进程,上图也是相同的。即使不使用探查器,计时也显示大约 1 秒完成时间。
Edit:根据文档,主要上下文是one per device per process
。这是否意味着使用多线程单应用程序时不会出现问题?
主要上下文的重用时间限制是多少?进程之间间隔 1 秒可以吗?还是必须间隔几毫秒才能保持主上下文处于活动状态?
我已经将 ptx 代码缓存到文件中,因此唯一剩下的开销看起来像 cuMemAlloc()、malloc() 和cuMemHostRegister()
因此,重新使用上次调用同一进程的最新上下文可以很好地优化时间。
Edit-2:文件说The caller must call cuDevicePrimaryCtxRelease() when done using the context.
for cuDevicePrimaryCtxRetain
. Is caller这里有什么流程吗?我可以在数百个顺序调用的进程的列表中仅在第一个调用的进程中使用保留并在最后一个调用的进程上使用释放吗?如果最后一个进程无法启动,系统是否需要重置?cuDevicePrimaryCtxRelease
没叫?
Edit-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 的唯一方法)