仅使用驱动程序 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 的唯一方法)