多个进程并行启动CUDA内核

时间:2013-02-15 12:46:03

标签: cuda gpu

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

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

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

“来自一个CUDA上下文的内核无法与来自另一个CUDA上下文的内核同时执行。” 这让我想到了第二个问题,什么是CUDA“背景”?

谢谢!

3 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:0)

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

要执行许多内核,你应该在一个CUDA上下文中创建几个CUDA流,并将每个内核排队到自己的流中 - 因此,如果有足够的资源,它们将同时执行。

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

答案 2 :(得分:-1)

添加到@talonmies的答案

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

https://docs.nvidia.com/deploy/pdf/CUDA_Multi_Process_Service_Overview.pdf

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

https://en.wikipedia.org/wiki/CUDA#Version_features_and_specifications

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