![]() |
1
2
理论上是的,你可以,cl api允许它。但是平台/实现必须支持它,我认为大多数cl实现都不支持它。 为此,请获取CPU设备和GPU设备的cl_device_id,并使用clcreateContext创建这两个设备的上下文。 |
![]() |
2
2
不,你不能同时在CPU和GPU上自动扩展内核,它可以是一个也可以是另一个。 您可以这样做,但这将涉及手动创建和管理两个命令队列(每个设备一个)。 |
![]() |
3
2
一个上下文只能用于一个平台。如果您的多设备代码需要跨平台工作(例如,Intel平台CPU OpenCL和Nvidia GPU),则需要单独的上下文。 但是,如果GPU和CPU恰好在同一个平台上,那么可以使用一个上下文。 如果您在同一平台上使用多个设备(两个相同的GPU或来自同一制造商的两个GPU),那么您可以共享上下文,只要它们都来自一个clgetdeviceids调用。 编辑: 我应该补充一点,GPU+CPU上下文并不意味着任何自动管理的CPU+GPU执行。通常,让驱动程序分配一个内存缓冲区是一个最佳实践,该缓冲区可以由GPU进行DMA以获得最大性能。在CPU和GPU处于同一环境中的情况下,可以跨两个设备共享这些缓冲区。 你仍然需要自己分担工作量。我最喜欢的负载平衡技术是使用事件。每隔n个工作项,将一个事件对象附加到一个命令(或将一个标记排队),然后等待您在n个工作项之前设置的事件(前一个)。如果您不需要等待,那么您需要在该设备上增加n,如果您必须等待,那么您应该减少n。这将限制队列深度,n将在理想深度周围徘徊以使设备保持忙碌。无论如何,您都需要这样做,以避免导致GUI导致饥饿。只需在每个命令队列中保留n个命令(CPU和GPU有单独的n个命令),它就可以完美地划分。 |
![]() |
4
1
不能将内核扩展到多个设备。但是,如果您重新运行的代码不依赖于其他结果(即:处理16KB的数据块,这需要大量处理),则可以在GPU和CPU上启动相同的内核。在GPU和CPU上放置一些块。 这样可以提高性能。 您可以这样做,创建一个为CPU和GPU共享的CLContext,以及2个命令队列。 这不适用于所有的谷粒。有时,内核代码应用于所有输入数据,并且不能分为部分或块。 |