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

时间:2019-04-07 21:13:25

标签: 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 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。拥有那么多工作项的真正含义是什么?

1 个答案:

答案 0 :(得分:0)

CPU比GPU更通用。他们的OpenCL实现对于工作组来说看起来像是序列化的(但在指令上交错),因为每个计算单元都是发出整个工作组的物理核心。由于它们是序列化/交错的,因此它们依赖于飞行指令。 CPU正在进行100-200条指令,如果这些指令是AVX / SSE,则可以进行800-1600条标量数据运算。如果将OpenCL实施在后台进行矢量化处理,则每个工作组的工作项数应在1024个范围之内。

由于GPU使用大量的线程级并行度来填充流水线以拥有更多的运行中指令,因此它们不需要的CPU数量就比CPU多,因此每个工作组仅需要256个线程就可以正常工作,并且这些线程可以在平行。线程级并行比指令级并行更容易填充管道。英特尔为每个管道提供7路,Nvidia 16路,Amd 40路线程级并行度。 Iris6100的每个子分块都有(8个EU)64条管道。 64个管线x 7意味着它也可以同时具有多个工作组,就像Nvidia和Amd GPU一样。每个工作组可能拥有更多的线程/工作项可能不会为该iGPU带来更高的性能,每个工作组拥有1024个以上的线程不会为该CPU带来更高的性能。

CPU还具有用于计算单元的256kB L2缓存,这可能是每个工作组最多1024个工作项的另一个限制因素,以有效地保存每个工作项的状态。

作为图像处理示例:

  • 您可以通过在CPU(1024个线程)上安装32x32的图像补丁来分割和征服图像。但这需要在内核中重新计算2D索引,因为CPU支持1D内核。
  • 您可以通过在iGPU(256个线程)上安装16x16补丁来分割和征服图像。
  • iGPU上的
  • 256x1
  • CPU上的1024x1
  • iGPU上的
  • 8x8x4
  • iGPU上的
  • 1x256x1
  • iGPU上的
  • 1x1x256
  • 但在CPU上不是1x1024x1

它们是每个工作组中工作项的数量,通常是每个计算单元允许的最大飞行中工作项的一部分。 对于此图像处理示例,每个计算单元最多可运行数千个像素,而高端GPU则最多可飞行50k至100k像素。

在其他尺寸的CPU(imo)上只有1来自CPU的OpenCL实现,它是一种仿真。它没有硬件来加速其他维度的线程ID值的计算。但是GPU可能在硬件上具有这种支持,因此它们可以具有更大的尺寸而不会降低性能,因为CPU上的一维内核必须计算一些模和除法以模拟第二维和第三维,这是简单内核的瓶颈。

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

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