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

  • 本文关键字:CPU 意味着 工作 OpenCL opencl
  • 更新时间 :
  • 英文 :


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

平台 0 设备 0

== 中央处理器 ==

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

== 显卡 ==

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 个线程即可正常工作,并且这些线程并行运行。线程级并行性比指令级并行性更容易填充管道。英特尔为每个管道提供 7 路、Nvidia 16 路、AMD 40 路线程级并行性。Iris6100的每个子切片都有(8个EU)64个管道。64 个管道 x 7 意味着它也可以在飞行中有多个工作组,就像 Nvidia 和 AMD GPU 一样。每个工作组拥有更多线程/工作项可能不会为该 iGPU 带来更高的性能,并且每个工作组拥有超过 1024 个线程不会为该 CPU 带来更高的性能。

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

作为图像处理示例:

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

它们是每个工作组的工作项数,通常它们是每个计算单元允许的最大正在进行的工作项数的一小部分。 对于此图像处理示例,每个计算单元最多可以传输数千个像素,对于高端 GPU,最多可以传输 50k-100k 像素。

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

如果 CPU 也模拟了第 2 维和第 3 维,那么如果开发人员在不知不觉中将 3d 内核展平为一维索引,那么背景上就会有一些模数和划分,内核内部会进一步变慢。但GPU甚至可能不是引擎盖下的计算模块。它们可能只是一些与寄存器或其他一些快速访问常量一样快的查找表。

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

最新更新