OpenCL:被CL_DEVICE_MAX_COMPUTE_UNITS

时间:2017-05-13 01:57:46

标签: opencl

我对此CL_DEVICE_MAX_COMPUTE_UNITS感到困惑。例如我的Mac上的Intel GPU,这个数字是48.这是否意味着同时运行的并行任务的最大数量是48或48的倍数,可能是96,144 ......? (我知道每个计算单元由一个或多个处理元素组成,每个处理元素实际上负责一个"线程"。如果48个计算单元中的每一个由多于1个处理元素组成,该怎么办? )。换句话说,对于我的Mac,"理想"加速虽然实际上是不可能的,但比CPU核心快48倍(我们假设单核心#34; CPU和GPU的计算速度相同),或48的倍数,可能是96,144。 ..?

2 个答案:

答案 0 :(得分:2)

总结:你的加速有点复杂,但你的机器(英特尔GPU,可能是GEN8或GEN9)fp32吞吐量 768 FLOPs(GPU)时钟和1536(fp16)。我们假设fp32,所以小于768x(可能是三分之一取决于CPU速度)。请参阅下面的推理和一些非常重要的注意事项。

快速入门CL_DEVICE_MAX_COMPUTE_UNITS: 使用带有GPU驱动程序的CL_DEVICE_MAX_COMPUTE_UNITS时,英特尔做了一些不可思议的事情。

来自clGetDeviceInfo(OpenCL 2.0)。 CL_DEVICE_MAX_COMPUTE_UNITS说

  

OpenCL设备上的并行计算单元数。一个   工作组在单个计算单元上执行。最小值为1.

然而,英特尔图形驱动程序实际上并没有遵循这个定义,而是返回EU的数量(执行单位)---欧盟一组SIMD ALU和7个不同SIMD线程的插槽(寄存器和什么不是) 。每个SIMD线程代表8,16或32个工作项,具体取决于编译器选择的内容(我们想要更高,但注册压力可能会迫使我们降低)。

工作组实际上仅限于“Slice”(see the figure in section 5.5 "Slice Architecture"),恰好是24个EU(最近的HW)。选择GEN8或GEN9文档。每个切片都有自己的SLM,屏障和L3。鉴于你的苹果书正在报告48个欧盟,我会说你有两个片段。

最高加速: 让我们忽略这个主要的烦恼并使用欧盟号码(以及上面的那些档案文档)。对于“加速”,我正在比较CPU上的单线程FP32计算。在CPU上具有良好的并行化等,当然加速会更少。

在理想情况下,48个EU中的每一个都可以在每个时钟发出两次SIMD4操作。假设这些是融合的乘法 - 加法(实际上是两个操作),这给了我们:

48 EUs * 2 SIMD4 ops per EU * 2 (if the op is a fused multiply add) 
= 192 SIMD4 ops per clock
= 768 FLOPs per clock for single precision floating point

所以你的理想加速实际上是 ~768 。但是有很多东西会成为这个理想的数字。

  1. 设置和拆卸时间。让我们忽略这一点(假设WL时间在运行时占主导地位)。
  2. 当CPU运行得更快时,GPU时钟最大可达千兆赫兹。因为这个比例在。(粗略地说1/3可能是CPU上的3Ghz和GPU上的1Ghz)。
  3. 如果计算没有大量乘法 - 添加“mads”,除以2,因为我加倍。然而,许多重要的工作量都是“疯狂”的。
  4. 执行大多是非分歧的。如果SIMD线程分支到if-then-else,则整个SIMD线程(8,16或32个工作项)必须执行该代码。
  5. 注册银行冲突延迟会降低EU ALU吞吐量。通常情况下,编译器可以很好地避免这种情况,但理论上它可以稍微咀嚼你的性能(通常是几个百分点,具体取决于寄存器压力)。
  6. 缓冲区地址计算也可以减少几个百分点(欧盟必须花时间做整数计算来读写地址)。
  7. 如果使用过多的SLM或障碍,GPU必须保留一些欧盟闲置状态,以便机器上的每个工作项都有足够的SLM。 (您可以调整算法来解决此问题。)
  8. 我们必须保持WL计算限制。如果我们在数据访问层次结构中烧掉任何缓存,我们会遇到没有线程准备在EU上运行并且必须停止的情况。假设我们避免这种情况。 ?。我可能忘记了其他可能出错的事情。
  9. 我们将效率称为理论上完美的百分比。因此,如果我们的工作负载每时钟运行大约530 FLOP,那么我们的效率比理论768高60%。我已经看到非常仔细调整的工作负载超过90%的效率,但它肯定可以做一些工作。

答案 1 :(得分:1)

您可以获得的理想加速比是处理元素的总数,在您的情况下,每个计算单元的处理元素数量为48 *。我不知道如何从OpenCL获取处理元素的数量(这并不意味着它是不可能的),但是你可以只为你的GPU谷歌。

据我所知,计算单元由一个或多个处理元素(通常用于GPU),寄存器文件和一些本地存储器组成。计算单元的线程以SIMD(单指令多数据)方式执行。这意味着计算单元的线程都在不同的数据上执行相同的操作。

此外,您获得的加速取决于您执行内核函数的方式。由于单个工作组无法在多个计算单元上运行,因此需要足够数量的工作组才能充分利用所有计算单元。此外,工作组大小应为CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE的倍数。