我们有跨设备分配主要任务的多设备系统。每个子任务包括:
- 入队写缓冲区
- 入队内核
- 排队读取缓冲区
所有队列都是异步的,命令队列是有序的。我们分配一个回调到cl_event
队列读取缓冲区,我们确定主要任务是否完成。如果不是,我们再安排一个子任务到队列中。
不幸的是,我们发现让主机的 CPU 保持忙碌并不允许它处理来自其他设备 (GPU) 的回调,并且大多数时候它们不参与工作。这个想法是从我们用来完成主要任务的设备列表中排除主机的 cpu。
我们有跨设备分配主要任务的多设备系统。每个子任务包括:
所有队列都是异步的,命令队列是有序的。我们分配一个回调到cl_event
队列读取缓冲区,我们确定主要任务是否完成。如果不是,我们再安排一个子任务到队列中。
不幸的是,我们发现让主机的 CPU 保持忙碌并不允许它处理来自其他设备 (GPU) 的回调,并且大多数时候它们不参与工作。这个想法是从我们用来完成主要任务的设备列表中排除主机的 cpu。
您应该研究设备裂变。如果您的平台支持此功能,您将能够创建具有任意 cpu 内核组合的 opencl 设备。在这里查看详细信息。此扩展将允许您为主机应用程序保存一些内核。
我喜欢它允许您创建共享不同级别高速缓存的子设备的方式。您可能对 CL_DEVICE_PARTITION_BY_NAMES_EXT 感兴趣(在页面上搜索“CL_DEVICE_PARTITION_BY NAMES_EXT”)。