opencl:同一设备上的不同队列可以并行执行内核吗?

时间:2013-07-08 01:23:02

标签: opencl gpu

我在GPU设备上创建了2个队列,并且想要并行执行内核。这不需要在不同队列中的内核之间设置事件,但必须按顺序执行相同队列中的内核。此外,我创建了2个CPU线程,每个CPU线程控制1个队列,并且CPU线程并行执行。现在看来不同队列之间的内核没有并行执行。所以有人可以给我一些建议吗?

感谢您的回答。这里有关于我的平台的一些信息。enter image description here

有关驱动程序enter image description here

的信息

Os:Centos 5.X

2 个答案:

答案 0 :(得分:2)

大多数GPU无法同时运行多个内核。这只是硬件限制,而不是软件问题。您可以在多个GPU(即多个OpenCL设备)上并行运行多个内核的执行。

无论如何,在您的场景中,许多GPU能够重叠内存传输(CPU< => GPU)和内核执行。这取决于OpenCL驱动程序,但我看到AMD驱动程序重叠来自一个队列的内存传输和来自另一个队列的内核执行。

答案 1 :(得分:1)

设备上可能只有一个计算单元会导致一次执行一个内核。如果是这样,内核可能必须由主机应用程序分区并交替排队以允许它们“并行”执行。对于clGetDeviceInfo参数,计算单位的数量由CL_DEVICE_MAX_COMPUTE_UNITS返回。

如果有多个计算单元,如果设备参数CL_DEVICE_PARTITION_MAX_SUB_DEVICES的值大于1,则设备可能支持分区。在这种情况下,设备可以“拆分”为多个子设备(例如两个)使用clCreateSubDevices和单独的命令队列。每个子设备将独立于(并且与其他子设备并行)执行内核。

注意,如果需要更优的负载,主机应用可能需要解决子设备的不平衡负载。