多进程并行启动CUDA内核

多进程并行启动CUDA内核,cuda,gpu,Cuda,Gpu,我知道具有2.x或更高计算能力的NVIDIA GPU可以同时执行u pto 16内核。 然而,我的应用程序产生了7个“进程”,这7个进程中的每一个都会启动CUDA内核 我的第一个问题是这些内核的预期行为是什么。它们是否也会并发执行,或者,由于它们是由不同的进程启动的,所以它们将按顺序执行 我很困惑,因为CUDA C编程指南上说: “一个CUDA上下文中的内核不能与另一个CUDA上下文中的内核同时执行。” 这就引出了我的第二个问题,什么是CUDA“上下文” 谢谢 CUDA上下文是一个虚拟执行空间,

我知道具有2.x或更高计算能力的NVIDIA GPU可以同时执行u pto 16内核。 然而,我的应用程序产生了7个“进程”,这7个进程中的每一个都会启动CUDA内核

我的第一个问题是这些内核的预期行为是什么。它们是否也会并发执行,或者,由于它们是由不同的进程启动的,所以它们将按顺序执行

我很困惑,因为CUDA C编程指南上说:

“一个CUDA上下文中的内核不能与另一个CUDA上下文中的内核同时执行。” 这就引出了我的第二个问题,什么是CUDA“上下文”


谢谢

CUDA上下文是一个虚拟执行空间,用于保存主机线程或进程拥有的代码和数据。在具有所有当前硬件的GPU上,只能有一个上下文处于活动状态

因此,为了回答第一个问题,如果您有七个单独的线程或进程都试图建立上下文并同时在同一GPU上运行,那么它们将被序列化,等待访问GPU的任何进程都将被阻止,直到运行上下文的所有者让步为止。据我所知,没有时间切片,调度启发式也没有文档记录,而且(我怀疑)不同操作系统之间的调度也不统一


您最好启动一个包含GPU上下文的工作线程,并使用来自其他线程的消息将工作推送到GPU上。或者,CUDA驱动程序API中提供了上下文迁移功能,但该功能仅适用于来自同一进程的线程,并且迁移机制具有延迟和主机CPU开销。

您真的需要单独的线程和上下文吗? 我相信最佳实践是每个GPU使用一个上下文,因为单个GPU上的多个上下文会带来足够的开销

要连续执行多个内核,您应该在一个CUDA上下文中创建几个CUDA流,并将每个内核排队到其自己的流中——因此,如果有足够的资源,它们将并发执行


如果需要从几个CPU线程访问上下文,可以使用cuCtxPopCurrent()、cuCtxPushCurrent()传递它们,但任何时候只有一个线程能够使用上下文。

添加到@Talonmes的答案中

在较新的体系结构中,通过使用MPS,多个进程可以同时启动多个内核。所以,现在这绝对是可能的,这在以前是不可能的。要获得详细的理解,请阅读本文

此外,您还可以看到不同GPU支持的每个cuda计算能力类型允许的最大并发内核数。这里有一个链接:


例如,cuda计算能力为7.5的GPU最多可以启动128个cuda内核。

请确认一个GPU上可以同时激活多个上下文吗?@Tariq,我没有说)我可以确认您可以在一个GPU上同时运行两个程序,两个上下文都在一个GPU上,但我不知道它们是否都是活动的,或者驱动程序是否会以某种方式改变工作流程。