来自多个进程的并行GPU内核执行



我有一个应用程序,我想在多个进程之间共享一个GPU。也就是说,这些进程中的每一个都将创建自己的CUDA或OpenCL上下文,针对相同的GPU。根据费米白皮书[1],应用程序级上下文切换不到25微秒,但在GPU上启动时,启动是有效的串行化的,因此费米不能很好地实现这一点。根据开普勒白皮书[2],有一种名为Hyper-Q的东西,它允许来自多个CUDA流、MPI进程或进程内线程的多达32个同时连接。

我的问题是:有没有人在开普勒GPU上尝试过这种方法,并验证了它的内核在从不同进程调度时是并发运行的?这只是一个CUDA功能,还是也可以与Nvidia GPU上的OpenCL一起使用?AMD的GPU支持类似的功能吗?

[1]http://www.nvidia.com/content/PDF/fermi_white_papers/NVIDIA_Fermi_Compute_Architecture_Whitepaper.pdf

[2]http://www.nvidia.com/content/PDF/kepler/NVIDIA-Kepler-GK110-Architecture-Whitepaper.pdf

针对第一个问题,NVIDIA在这里的博客中发布了一些hyper-Q结果。该博客指出,移植CP2K的开发人员能够更快地获得加速的结果,因为hyper-Q允许他们或多或少地按原样使用应用程序的MPI结构,并在单个GPU上运行多个列,从而获得更高的GPU有效利用率。如评论中所述,该(hyper-Q)功能目前仅在K20处理器上可用,因为它依赖于GK110 GPU。

我从费米体系结构中运行了同步内核,它工作得很好,事实上,它通常是从硬件中获得高占用率的唯一方法。我使用了OpenCL,您需要从一个独立的cpu线程运行一个单独的命令队列来完成这项工作。Hyper-Q是从另一个内核中调度新的数据并行内核的能力。这只适用于开普勒。

最新更新