多个进程并行启动CUDA内核
我知道具有2.x或更高计算能力的NVIDIA gpus可以同时执行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()来传递它们,但只有一个线程可以随时使用上下文。
链接地址: http://www.djcxy.com/p/47419.html