2013-02-15 37 views
10

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

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

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

“从一个CUDA上下文内核不能同时从另一个方面CUDA内核执行。” 这让我回到第二个问题,CUDA的“背景”是什么?

谢谢!

回答

14

CUDA上下文是一个虚拟执行空间,用于存放主机线程或进程拥有的代码和数据。使用所有当前硬件,只有一个上下文可以在GPU上处于活动状态。因此,要回答你的第一个问题,如果你有七个独立的线程或进程都试图建立一个上下文并同时在同一个GPU上运行,它们将被序列化,等待访问GPU的任何进程将被阻塞,直到正在运行的上下文的所有者产生。据我所知,没有时间分割和调度启发式没有记录,并且(我怀疑)从操作系统到操作系统是不统一的。

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

0

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

要执行许多内核concrurrenlty,您应该在一个CUDA上下文中创建少量CUDA流,并将每个内核排队到它自己的流中 - 这样,如果有足够的资源,它们将被并发执行。

如果您需要使用少量CPU线程访问上下文,您可以使用cuCtxPopCurrent(),cuCtxPushCurrent()来传递它们,但只有一个线程可以随时使用上下文。

+0

您是否确认多个上下文可以在单个GPU上同时处于活动状态? – Tariq 2014-07-15 09:50:12

+0

@Tariq,我没有说明)我可以确认你可以同时在一个GPU上运行两个程序,但是我不知道它们是否都是主动的,或者驱动程序会以某种方式交替工作。 – ShPavel 2014-10-28 18:39:02

+0

http://stackoverflow.com/questions/31643570/running-more-than-one-cuda-applications-on-one-gpu – pgoetz 2017-03-31 16:06:46