opencl – Intel Gen8架构,计算每个执行单元的总内核实例

我正在参考
intel_gen8_arch

在我对SIMD引擎概念的理解中,很少有部分引起混淆.

5.3.2 SIMD FPU
在每个EU内,主要计算单元是一对SIMD浮点单元(FPU).
虽然称为FPU,但它们支持浮点和整数计算.这些单位
SIMD可以执行多达四个32位浮点(或整数)运算,或者SIMD最多执行
8个16位整数或16位浮点运算.每个SIMD FPU可以同时完成加法和乘法
(MAD)每个循环的浮点指令.因此,每个EU能够具有16个32位浮点
每个周期的操作:(添加多个)x 2 FPU x SIMD-4.

上述文档行清楚地说明了可以在每个执行单元上执行的最大浮点运算.

首先怀疑:
我认为它指的是执行单元的每个硬件线程而不是整个执行单元.

在5.3.5节中提到了
在Gen8计算架构上,大多数SPMD编程模型都使用此样式代码
生成和欧盟处理器执行.实际上,每个SPMD内核实例都会出现
在其自己的SIMD通道内串行和独立执行.实际上,每个线程都会执行
同时存在一个SIMD-Width内核实例数.因此对于SIMD-16编译了一个
计算内核,可以执行SIMD-16 x 7个线程= 112个内核实例
同时在一个欧盟上.类似地,对于计算内核的SIMD-32编译,32 x 7
threads = 224内核实例可以在单个EU上并发执行.

现在这部分插图似乎与第5.3.2节相矛盾.

特别,
1)因为它说EU的每个HW线程都有2个,SIMD-4单元然后SIMD-16如何工作.我们如何在7个线程上计算224.

另外,我们如何在SIMD-16或SIMD-32模式下编译内核?

最佳答案 5.3.2.该部分确实说每个欧盟可以执行16个32位操作.

每个欧盟有两个FPU,每个FPU可以执行4个操作.

2 pipes * 4 ops per pipe * 2   (since mad's are add+mul) = 16 ops per cycle

每个EU有7个线程(见图3),但欧盟只能从7个中的两个(已准备好)中选择指令(每个管道有一条指令).

正如上面提到的那样,将SIMD16指令视为SIMD4操作中的4个.因此,完成一个循环需要4个周期. SIMD32指令将通过相同的SIMD4管道进行8个周期.因此,无论SIMD宽度如何,机器吞吐量都是相同的(理论上). “更宽”的SIMD只意味着您每个工作负载使用更多的寄存器和更少的线程.

没有简单的方法可以选择内核编译宽度(SIMD8,SIMD16或SIMD32),您可能不希望对大多数工作负载执行此操作.不过,有一个英特尔扩展,你的驱动程序可能支持cl_intel_subgroups,可以控制线程宽度. (您必须使用特殊属性注释内核.)如果您希望SIMD通道(通道)直接相互共享数据(无需额外加载到SLM或全局内存),这将非常有用.

还可以从IDF查看this presentation.幻灯片80-87示出了从编译器SIMD(例如SIMD32或SIMD16)到EU的映射.

点赞