我在GPU设备上创建了2个队列,想并行执行内核。这不需要在不同队列中的内核之间设置事件,但是同一队列中的内核必须按顺序执行。另外,我创建了2个CPU线程,每个CPU线程控制1个队列,CPU线程并行执行。现在看来不同队列之间的内核没有并行执行。所以有人可以给我一些建议吗?
感谢您的回答。这是有关我的平台的一些信息。
司机信息
操作系统:Centos 5.X
大多数 GPU 无法同时运行多个内核。这只是硬件限制,不是软件问题。您可以在多个 GPU(即多个 OpenCL 设备)上并行运行多个内核的执行。
无论如何,在您的场景中,许多 GPU 能够重叠内存传输(CPU <=> GPU)和内核执行。这取决于 OpenCL 驱动程序,但我已经看到 AMD 驱动程序重叠来自一个队列的内存传输和来自另一个队列的内核执行。
设备上可能只有一个计算单元会导致内核一次执行一个。如果是这样,内核可能必须由主机应用程序分区并交替排队以允许它们的“并行”执行。计算单元的数量由clGetDeviceInfo
forCL_DEVICE_MAX_COMPUTE_UNITS
参数返回。
如果有多个计算单元,如果设备参数的值大于1,则设备可以支持分区。在这种情况下,可以使用单独的命令CL_DEVICE_PARTITION_MAX_SUB_DEVICES
将设备“拆分”为多个子设备(例如两个)clCreateSubDevices
排队。每个子设备将独立于其他子设备(并与其他子设备并行)执行内核。
请注意,如果需要更优化的负载,主机应用程序可能需要解决子设备的不平衡负载。