【问题标题】:What is the meaning of having a certain number of OpenCL work-items into a CPU?将一定数量的 OpenCL 工作项放入 CPU 是什么意思?
【发布时间】:2019-04-08 22:13:06
【问题描述】:

我试图让你理解为什么我可以在一个 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。拥有这么多工作项的真正含义是什么?

【问题讨论】:

    标签: opencl


    【解决方案1】:

    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 L2 缓存,这可能是每个工作组最多 1024 个工作项以有效保存每个工作项状态的另一个限制因素。

    作为图像处理示例:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-06
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      相关资源
      最近更新 更多