在optimization guide of Beignet, an open source implementation of OpenCL targeting Intel GPUs如何充分利用OpenCL中的SIMD?
工作组大小应大于16和是多个的16
作为根上两个可能的SIMD通道是8或16。为了不浪费SIMD 车道,我们需要遵循这个规则。
在Compute Architecture of Intel Processor Graphics Gen7.5还提到:
对于基于Gen7.5产品,每个EU有七个线程总共通用寄存器文件的28千字节(GRF)。
...
在Gen7.5计算架构,最SPMD编程模型采用 这种风格的代码生成和欧盟的处理器执行。实际上, 每个SPMD内核实例似乎在其自己的SIMD通道中串行且独立地执行。
实际上,每个线程同时执行一个SIMD宽度的内核实例数。 因此,对于计算 内核的SIMD-16编译,可能的是SIMD-16×7个=线程112个内核实例 是在单个EU同时执行。类似地,对于SIMD-32 x 7个线程= 224个内核实例在单个的 EU上同时执行。
如果我正确理解它,使用SIMD-16 x 7 threads = 112 kernel instances
作为示例,为了在一个EU运行224个螺纹,工作组大小需要是16。然后OpenCL编译器将折叠16个内核实例为16 SIMD线程,并在7个工作组上执行7次,并在单个EU上运行它们?
问题1:我是否正确?
但是OpenCL spec也提供矢量数据类型。因此,通过传统的SIMD编程(如NEON和SSE)充分利用EU中的SIMD-16计算资源是可行的。
问题2:如果是这种情况,使用vector-16数据类型已经明确使用SIMD-16资源,因此删除了每工作组至少16个项目的限制。是这样吗?
问题3:如果以上为真,那么如何两个方法相互比较:1) 112螺纹折叠成由OpenCL编译7 SIMD-16线程; 2) 7个原生线程编码为明确使用vector-16数据类型和SIMD-16操作?