Opencl 英特尔Gen8体系结构计算每个执行单元的内核实例总数

Opencl 英特尔Gen8体系结构计算每个执行单元的内核实例总数,opencl,intel,gpgpu,simd,Opencl,Intel,Gpgpu,Simd,我引用的是 在我对SIMD引擎概念的理解中,很少有章节会引起混淆 5.3.2 SIMD FPU 在每个EU中,主要计算单元是一对SIMD浮点单元(FPU)。 虽然称为FPU,但它们同时支持浮点和整数计算。这些单位 SIMD最多可以执行四个32位浮点(或整数)操作,或者SIMD最多可以执行四个32位浮点(或整数)操作 八个16位整数或16位浮点运算。每个SIMD FPU可以同时完成加法和乘法 (MAD)每个周期的浮点指令。因此,每个EU都能够使用16位32位浮点 每个周期的操作:(添加+多个)x

我引用的是

在我对SIMD引擎概念的理解中,很少有章节会引起混淆

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

文档的上面几行清楚地说明了可以在每个执行单元上执行的最大浮点操作

第一个疑问: 我认为它指的是执行单元的每个硬件线程,而不是整个执行单元

第5.3.5节中提到 在Gen8计算体系结构上,大多数SPMD编程模型都使用这种类型的代码 生成和EU处理器执行。实际上,每个SPMD内核实例似乎 在其自己的SIMD通道内连续独立执行。实际上,每个线程都执行 并发的内核实例数的SIMD宽度。因此,对于SIMD-16编译的 计算内核时,可以执行SIMD-16 x 7线程=112个内核实例 同时在一个单一的欧盟。类似地,对于计算内核的SIMD-32编译,32 x 7 线程=224个内核实例可以在单个EU上并发执行

现在,本节说明似乎与第5.3.2节相矛盾

具体来说,, 1) 既然它说EU的每个硬件线程有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),但EU只能从7个线程中的两个(准备就绪)中选择指令(每个管道一个指令)

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

没有简单的方法可以选择内核编译宽度(SIMD8、SIMD16或SIMD32),而且对于大多数工作负载,您可能不希望这样做。不过,您的驱动程序可能支持一个Intel扩展,它允许您控制线程宽度。(您必须使用特殊属性对内核进行注释。)如果您希望SIMD通道(通道)彼此直接共享数据(无需向SLM或全局内存加载额外负载),这将非常有用


也可以从IDF处查看。幻灯片80-87演示了从编译器SIMD(如SIMD32或SIMD16)到EU的映射。

SIMD-16只是“逻辑”的,可以说,每个SIMD-4 FPU以顺序方式执行4条指令。您不需要为SIMD-16或SIMD-32编译,只需编写代码以使用适当的向量类型(分别为32位和16位)。您能在回答中添加SIMD-32如何工作的说明吗?当然。编辑答案以包含此内容。