我接受拱门的参考
很少有章节在我对SIMD引擎概念的理解中造成混乱。
5.3.2SIMDFPU在每个EU中,主要计算单元是一对SIMD浮点单元(FPU).虽然被称为FPU,但它们同时支持浮点运算和整数计算.这些单元可以执行最多4个32位浮点(或整数)操作,或者SIMD执行最多8个16位整数或16位浮点操作。每个SIMD FPU可以同时完成每个周期的加和乘(MAD)浮点指令.因此,每个欧盟每个周期可以进行16次32位浮点操作:(add + mul) x2 FPU xSIMD-4。
文档的上述行清楚地说明了在每个执行单元上可以执行的最大浮点操作。
第一个疑问:我认为它指的是执行单元的每个硬件线程,而不是整个执行单元。
在5.3.5节中提到了Gen8计算体系结构,大多数Gen8编程模型都使用这种风格的代码生成和EU处理器的执行。实际上,每个SPMD内核实例似乎在它自己的SIMD车道内依次独立地执行。实际上,每个线程同时执行一个SIMD宽度数的内核实例.因此,对于计算内核的SIMD-16编译,SIMD-16x7线程=112个内核实例可以在单个EU上并发执行。类似地,对于计算内核的SIMD-32编译,32x7线程=224个内核实例可以在单个EU上并发执行。
现在,本节插图似乎与5.3.2节相矛盾。
具体来说,因为它说每个欧盟的HW线程有2,SIMD-4单元,那么SIMD-16是如何工作的。我们如何在7个线程上达到224的计算。
另外,我们如何以SIMD-16或SIMD-32模式编译内核?
发布于 2015-08-05 22:20:58
5.3.2.部分确实是说,每个欧盟可以执行16 32位操作。每个欧盟有两个FPU,每个可以执行4个操作。
2 pipes * 4 ops per pipe * 2 (since mad's are add+mul) = 16 ops per cycle每个EU有7个线程(参见图3),但是EU只能从其中的两个(已经准备好)中选择指令(每个管道一个指令)。
正如Mai在上面所提到的,将SIMD16指令看作是SIMD4操作中的4个。因此,它需要4个周期来完成一个。一个SIMD32指令将需要8个周期通过相同的SIMD4管道。因此,不管SIMD宽度如何,机器吞吐量都是相同的(理论上)。“更宽”SIMD仅仅意味着每个工作负载使用更多的寄存器和更少的线程。
选择内核编译宽度(SIMD8、SIMD16或SIMD32)并不容易,您可能不希望在大多数工作负载中这样做。不过,您的驱动程序可能支持子群的英特尔扩展,它允许您控制线程宽度。(您必须用一个特殊属性对内核进行注释。)如果您希望SIMD通道(通道)直接与彼此共享数据(而不需要额外负载到SLM或全局内存),这是非常有用的。
还可以查看以色列国防军的这份报告。幻灯片80-87演示了从编译器SIMD (例如SIMD32或SIMD16)到欧盟的映射。
https://stackoverflow.com/questions/31826502
复制相似问题