共享GPU在支持OpenCL的程序之间的使用

5

是否有一种方法可以在两个独立的OpenCL程序之间共享GPU,或更具体地说,在两个需要GPU同时执行OpenCL内核的独立进程之间共享GPU?如果有,那么如何实现呢?

2个回答

4

这要看你所说的“共享”是指什么。

通常情况下,您可以创建两个进程,它们都在同一GPU上创建一个OpenCL设备。然后由驱动程序/操作系统/GPU负责确保一切正常运行。

尽管如此,大多数实现都会对GPU执行进行时间分片以使其发生(就像图形处理一样)。

不过我感觉这可能并不完全符合您的需求。您能否提供一个用例来详细说明您的问题?


使用情况是单个进程使用OpenCL利用GPU长时间运行。如果启动了另一个也需要GPU的OpenCL进程,该如何处理?您的答案表明驱动程序将进行时间片分配,即在任何给定时间将整个GPU分配给一个进程。这肯定是低效的,因为与每个进程相关联的数据必须在设备和主机之间来回复制。 - Chris
@Chris:简短的回答是,并不需要复制所有数据。执行是分时的,但如果两者都适合于卡片上(内存被“虚拟化”),则内存可以保持共享。如果不适合,则肯定会复制数据。时间切片的粒度也很粗糙。假设我们谈论的是Windows,在WDDM 1.1中,CL内核运行永远不会被中断,等等。有关更多信息,请参见http://en.wikipedia.org/wiki/Windows_Display_Driver_Model。 - Bahbar
特别说明:http://download.microsoft.com/download/5/b/9/5b97017b-e28a-4bae-ba48-174cf47d23cd/PRI103_WH06.ppt - Bahbar
这个PPT真的很有趣。在Linux下,更细粒度的时间切片将如何实现? - Chris
@Chris:不知道。但可以确定的是,至少到目前为止,GPU硬件并没有真正支持任意时间片切割(Fermi可能是个例外,不确定)。因此,操作系统无法提供硬件不支持的功能。 - Bahbar
好的,谢谢讨论。看起来Fermi支持更好的上下文切换和并发内核执行:http://www.nvidia.com/content/PDF/fermi_white_papers/NVIDIA_Fermi_Compute_Architecture_Whitepaper.pdf - Chris

4

目前的GPU(除了Nvidia的Fermi)不支持同时执行多个内核。此外,到目前为止,GPU不支持抢占式多任务处理;它完全是合作的!一个内核的执行不能被暂停并在以后继续执行。因此,任何基于时间的GPU共享的粒度取决于内核的执行时间。

如果您运行多个需要GPU访问的程序,则应确保您的内核具有较短的运行时间(<100ms是经验法则),以便GPU时间可以在需要GPU周期的内核之间进行时间分配。这也很重要,否则主机系统的图形将变得非常不响应,因为它们也需要GPU访问。这甚至可能导致一个无限或长时间循环的内核似乎会使系统崩溃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接