CUDA应用程序之间的同步

问题描述

有没有办法在同一个GPU上同步两个不同的CUDA应用程序?

我有两个不同的过程部分:原始过程和后处理。原始过程是使用GPU。现在,我们还将迁移后处理到GPU。在我们的体系结构中,要求将这两个过程组织为两个单独的应用程序。 现在我正在考虑同步问题:

  • 如果要在CPU级别上进行同步,则必须知道1个应用的GPU何时结束。
  • 我认为
  • 理想的方法是在GPU级别上以某种方式同步它们。

是否有用于此目的的标志?或一些解决方法?

解决方法

有没有办法在同一个GPU上同步两个不同的CUDA应用程序?

总之,不。您必须通过主机端的某种进程间通信机制来完成此操作。

如果您在Linux或Windows上且具有处于TCC模式的GPU,仍需要主机IPC,但是您可以使用CUDA IPC机制将一个进程中的CUDA活动“互锁”到另一个进程中的CUDA活动。特别是,可以使用cudaIpcGetEventHandlecudaIpcOpenEventHandle将事件句柄传达给另一个进程。这将提供一个事件,您可以将其用于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。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...