gpt4 book ai didi

opencl - 如何在 OpenCL 中充分利用 SIMD?

转载 作者:行者123 更新时间:2023-12-04 08:51:45 26 4
gpt4 key购买 nike

optimization guide of Beignet, an open source implementation of OpenCL targeting Intel GPUs

Work group Size should be larger than 16 and be multiple of 16.

As two possible SIMD lanes on Gen are 8 or 16. To not waste SIMDlanes, we need to follow this rule.


Compute Architecture of Intel Processor Graphics Gen7.5中也提到了:

For Gen7.5 based products, each EU has seven threads for a total of 28 Kbytes of general purpose register file (GRF).

...

On Gen7.5 compute architecture, most SPMD programming models employthis style code generation and EU processor execution. Effectively,each SPMD kernel instance appears to execute serially and independently within its own SIMD lane.

In actuality, each thread executes a SIMD-Width number of kernel instances >concurrently. Thus for a SIMD-16 compile of a computekernel, it is possible for SIMD-16 x 7 threads = 112 kernel instancesto be executing concurrently on a single EU. Similarly, for SIMD-32 x7 threads = 224 kernel instances executing concurrently on a singleEU.


如果我理解正确,请使用 SIMD-16 x 7 threads = 112 kernel instances例如,为了在一个 EU 上运行 224 个线程,工作组大小需要为 16。然后 OpenCL 编译器会将 16 个内核实例折叠成一个 16 channel 的 SIMD 线程,并在 7 个工作组上执行 7 次,并且在一个欧盟上运行它们?
问题一:到这里我是否正确?
然而 OpenCL spec还提供矢量数据类型。因此,通过传统的 SIMD 编程(如在 NEON 和 SSE 中)充分利用 EU 中的 SIMD-16 计算资源是可行的。
问题2:如果是这种情况,使用 vector-16 数据类型已经明确使用了 SIMD-16 资源,因此消除了 at-least-16-item-per-work-group 限制。是这种情况吗?
问题三:如果以上都是真的,那么这两种方法如何相互比较: 1) 112个线程被OpenCL编译器折叠成7个SIMD-16线程; 2) 7 个本地线程编码为显式使用 vector-16 数据类型和 SIMD-16 操作?

最佳答案

  • 几乎。您假设每个工作组有一个线程(注意,此上下文中的线程是 CUDA 所谓的“wave”。在英特尔 GPU 中,工作项是 GPU 线程的 SIMD channel )。如果没有子组,就无法强制工作组大小恰好是一个线程。例如,如果您选择 WG 大小为 16,编译器仍然可以自由地编译 SIMD8 并将其分布在两个 SIMD8 线程中。请记住,编译器会在知道 WG 大小之前选择 SIMD 宽度( clCompileProgramclEnqueueNDRange 之前)。 subgroups extension可能允许您强制使用 SIMD 宽度,但绝对不会在 GEN7.5 上实现。
  • OpenCL 矢量类型是在已经自动发生的隐式矢量化之上的可选显式矢量化步骤。你用吗float16例如。每个工作项将处理 16 个浮点数,但编译器仍将至少编译 SIMD8。因此,每个 GPU 线程将处理 (8 * 16) 个浮点数(尽管并行)。这可能有点矫枉过正。理想情况下,我们不想通过使用显式 OpenCL 矢量类型来显式矢量化我们的 CL。但是,如果内核没有做足够的工作,它有时会有所帮助(太短的内核可能很糟糕)。某处说 float4 是一个很好的经验法则。
  • 我想你的意思是 112 个工作项目?本地线程是指 CPU 线程还是 GPU 线程?
  • 如果您指的是 CPU 线程,则适用有关 GPU 的常见论点。当您的程序没有太大差异(所有实例都采用相似的路径)并且您使用数据的次数足够多以降低将数据传输到 GPU 或从 GPU 传输出的成本(算术密度)时,GPU 是很好的选择。
  • 如果您指的是 GPU 线程(GEN SIMD8 或 SIMD16 小动物)。目前没有(公开可见的)方式来明确地对 GPU 线程进行编程( 编辑 参见 subgroups extension(在 GEN7.5 上不可用))。如果可以,这将是与汇编语言类似的权衡。工作更难,编译器有时比我们做得更好,但是当您解决特定问题并拥有更好的领域知识时,您通常可以通过足够的编程工作做得更好(直到硬件更改和您聪明的程序假设失效。)
  • 关于opencl - 如何在 OpenCL 中充分利用 SIMD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33452659/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com