问题描述
有没有办法在同一个GPU上同步两个不同的CUDA应用程序?
我有两个不同的过程部分:原始过程和后处理。原始过程是使用GPU。现在,我们还将迁移后处理到GPU。在我们的体系结构中,要求将这两个过程组织为两个单独的应用程序。 现在我正在考虑同步问题:
- 如果要在CPU级别上进行同步,则必须知道1个应用的GPU何时结束。 我认为
- 理想的方法是在GPU级别上以某种方式同步它们。
是否有用于此目的的标志?或一些解决方法?
解决方法
有没有办法在同一个GPU上同步两个不同的CUDA应用程序?
总之,不。您必须通过主机端的某种进程间通信机制来完成此操作。
如果您在Linux或Windows上且具有处于TCC模式的GPU,仍需要主机IPC,但是您可以使用CUDA IPC机制将一个进程中的CUDA活动“互锁”到另一个进程中的CUDA活动。特别是,可以使用cudaIpcGetEventHandle
和cudaIpcOpenEventHandle
将事件句柄传达给另一个进程。这将提供一个事件,您可以将其用于cudaStreamWaitEvent
调用。当然,这实际上只是解决方案的一半。您还需要具有CUDA IPC内存句柄。 CUDA simpleIPC示例代码具有您所需的大部分管道。
您还应记住,如果已在父进程中初始化CUDA,则不能在子进程中使用CUDA。示例代码中已经提供了这个概念。
所以您将执行以下操作:
过程A:
- 为缓冲区创建(cudaMalloc)分配以保存要发送到后处理的结果
- 创建同步事件
- 获取cuda IPC内存和事件句柄
- 使用基于主机的IPC,将这些句柄传达给进程B
- 对数据启动处理工作(即GPU内核),结果应放在上面创建的缓冲区中
- 进入与GPU内核相同的流中,记录事件
- 通过基于主机的IPC进入流程B的信号,以启动工作
过程B:
- 使用主机IPC从进程A接收内存和事件句柄
- 提取内存指针并从句柄中创建IPC事件
- 创建工作问题流
- 等待来自进程A的信号(表明事件已记录)
- 使用本地事件和创建的流执行cudaStreamWaitEvent
- 在同一流中,启动后处理内核
这应该仅使后处理内核能够使用事件互锁在进程A的内核完成后才开始。另一个需要注意的是,在此期间您不能允许进程A随时终止。由于它是内存和事件的所有者,因此即使需要另一个内存或事件,它也必须继续运行。如果这是一个问题,则可以使进程B为“所有者”,并将句柄传递给进程A。