将一定数量的OpenCL工作项放入CPU有什么意义?

将一定数量的OpenCL工作项放入CPU有什么意义?,opencl,Opencl,我试图理解为什么我可以在一个CPU中有比一个GPU在一个维度上更多的工作项 平台0设备0 ==CPU== DEVICE_VENDOR: Intel DEVICE NAME: Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz MAXIMUM NUMBER OF PARALLAEL COMPUTE UNITS: 4 MAXIMUM DIMENSIONS FOR THE GLOBAL/LOCAL WORK ITEM IDs: 3 MAXIMUM NUMBER OF WO

我试图理解为什么我可以在一个CPU中有比一个GPU在一个维度上更多的工作项

平台0设备0

==CPU==

DEVICE_VENDOR: Intel
DEVICE NAME: Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
MAXIMUM NUMBER OF PARALLAEL COMPUTE UNITS: 4
MAXIMUM DIMENSIONS FOR THE GLOBAL/LOCAL WORK ITEM IDs: 3
MAXIMUM NUMBER OF WORK-ITEMS IN EACH DIMENSION: (1024 1 1  )
MAXIMUM NUMBER OF WORK-ITEMS IN A WORK-GROUP: 1024
平台0设备1

==GPU==

DEVICE_VENDOR: Intel Inc.
DEVICE NAME: Intel(R) Iris(TM) Graphics 6100
MAXIMUM NUMBER OF PARALLAEL COMPUTE UNITS: 48
MAXIMUM DIMENSIONS FOR THE GLOBAL/LOCAL WORK ITEM IDs: 3
MAXIMUM NUMBER OF WORK-ITEMS IN EACH DIMENSION: (256 256 256  )
MAXIMUM NUMBER OF WORK-ITEMS IN A WORK-GROUP: 256
上面是我的测试代码的结果,用于打印OpenCL框架可以使用的实际硬件的信息


我真的不明白为什么CPU部分中的最大工作项数为1024。拥有这么多工作项的真正意义是什么?

CPU比GPU更通用。他们的OpenCL实现看起来像是工作组的序列化(但在指令上是交错的),因为每个计算单元都是作为一个整体发布工作组的物理核心。因为它们是序列化/交错的,所以它们依赖于飞行中的指令。CPU在运行中有100-200条指令,如果这些指令是AVX/SSE,那么您可以期望在运行中有800-1600条标量数据操作。如果OpenCL实现在引擎盖下进行矢量化,那么这在每个工作组1024个工作项的范围内

由于GPU使用大量的线程级并行来填充管道,以使更多的指令在运行中,因此它们不需要像CPU那样多的ILP,因此每个工作组只需256个线程就可以正常工作,并且这些线程并行运行。线程级并行比指令级并行更容易填充管道。对于每条流水线,Intel有7路、Nvidia 16路、Amd 40路线程级并行。Iris6100的每个子片有(8个EUs)64条管道。64条管道x 7意味着它也可以有多个工作组在运行中,就像Nvidia和Amd GPU一样。可能每个工作组拥有更多的线程/工作项不会为该iGPU带来更高的性能,而每个工作组拥有1024个以上的线程也不会为该CPU带来更高的性能

CPU还为计算单元提供256kB二级缓存,这可能是每个工作组最多1024个工作项的另一个限制因素,用于高效保存每个工作项的状态

作为图像处理示例:

  • 您可以通过在CPU(1024个线程)上安装32x32个映像补丁来分治映像。但这需要在内核中重新计算2D索引,因为CPU支持一维内核
  • 您可以通过在iGPU(256个线程)上使用16x16个图像补丁来分治图像
  • iGPU上的256x1
  • CPU上的1024x1
  • iGPU上的8x4
  • iGPU上的1x256x1
  • iGPU上的1x1x256
  • 但不是CPU上的1x1024x1
它们是每个工作组的工作项数,通常是每个计算单元允许的最大飞行中工作项数的一小部分。 对于这个图像处理示例,每个计算单元最多可以运行数千个像素,对于高端GPU最多可以运行50k-100k个像素

在CPU的其他维度上只有1(imo)源于CPU的OpenCL实现是一种仿真。它没有硬件来加速其他维度的线程id值的计算。但是GPU可能在硬件上有这种支持,这样它们就可以在不降低性能的情况下拥有更多的维度,因为CPU上的1D内核必须计算一些模和除法来模拟第二维度和第三维度,这是简单内核的瓶颈

如果CPU也模拟了第二维度和第三维度,那么如果开发人员在不知情的情况下将一个3d内核展平为一维索引,内核内部会出现一些模和分割,并进一步降低速度。但GPU甚至可能不是引擎盖下的计算模块。它们可能只是一些与寄存器一样快的查找表或其他一些快速访问的常量

这只是每个工作组的限制。每次内核启动都可以启动多个工作组,因此不会影响在不同设备(如CPU、GPU或iGPU)中处理的最大映像大小。每个图像由多个工作组处理,用于从1x1x1到32x32x1或其他大小的平铺