我对此CL_DEVICE_MAX_COMPUTE_UNITS感到困惑。例如我的Mac上的Intel GPU,这个数字是48.这是否意味着同时运行的并行任务的最大数量是48或48的倍数,可能是96,144 ......? (我知道每个计算单元由一个或多个处理元素组成,每个处理元素实际上负责一个"线程"。如果48个计算单元中的每一个由多于1个处理元素组成,该怎么办? )。换句话说,对于我的Mac,"理想"加速虽然实际上是不可能的,但比CPU核心快48倍(我们假设单核心#34; CPU和GPU的计算速度相同),或48的倍数,可能是96,144。 ..?
答案 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 。但是有很多东西会成为这个理想的数字。
我们将效率称为理论上完美的百分比。因此,如果我们的工作负载每时钟运行大约530 FLOP,那么我们的效率比理论768高60%。我已经看到非常仔细调整的工作负载超过90%的效率,但它肯定可以做一些工作。
答案 1 :(得分:1)
您可以获得的理想加速比是处理元素的总数,在您的情况下,每个计算单元的处理元素数量为48 *。我不知道如何从OpenCL获取处理元素的数量(这并不意味着它是不可能的),但是你可以只为你的GPU谷歌。
据我所知,计算单元由一个或多个处理元素(通常用于GPU),寄存器文件和一些本地存储器组成。计算单元的线程以SIMD(单指令多数据)方式执行。这意味着计算单元的线程都在不同的数据上执行相同的操作。
此外,您获得的加速取决于您执行内核函数的方式。由于单个工作组无法在多个计算单元上运行,因此需要足够数量的工作组才能充分利用所有计算单元。此外,工作组大小应为CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE的倍数。