将一定数量的OpenCL工作项放入CPU有什么意义?
我试图理解为什么我可以在一个CPU中有比一个GPU在一个维度上更多的工作项 平台0设备0 ==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
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