英特尔第八代架构计算每个执行单元的总内核实例数

4
我正在参考intel_gen8_arch,但是SIMD引擎的概念让我有些困惑。
5.3.2 SIMD FPUs 在每个执行单元(EU)中,主要的计算单元是一对SIMD浮点数单位(FPU)。虽然称为FPU,但它们支持浮点和整数计算。这些单位可以SIMD执行最多四个32位浮点(或整数)操作,或者SIMD执行最多八个16位整数或16位浮点操作。每个SIMD FPU可以在每个周期内完成同时加法和乘法(MAD)浮点指令。因此,每个EU每个周期可以进行16个32位浮点操作:(加法+乘法) x 2个FPUs x SIMD-4。
上述文档清楚地说明了每个执行单元上可以执行的最大浮点操作。
第一个疑问: 我认为它是指每个执行单元的硬件线程,而不是整个执行单元。
在5.3.5节中提到 在Gen8计算架构中,大多数SPMD编程模型采用这种样式的代码生成和EU处理器执行。实际上,每个SPMD内核实例似乎在其自己的SIMD通道中串行和独立地执行。实际上,每个线程并发地执行SIMD-Width数量的内核实例。因此,对于计算内核的SIMD-16编译,可以在单个EU上同时执行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模式编译内核?

SIMD-16 可以说是“逻辑上的”,每个 SIMD-4 FPU 按顺序执行 4 条指令。你不需要为 SIMD-16 或 SIMD-32 进行编译,只需编写代码以使用相应的矢量类型(分别为 32 位和 16 位)。 - user703016
1个回答

2
第5.3.2节确实表示每个EU可以执行16个32位操作。每个EU都有两个FPU,每个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指令看作4个SIMD4操作。因此,完成一个指令需要4个周期。一个SIMD32指令将通过这些相同的SIMD4管道需要8个周期。因此,无论SIMD宽度如何,机器吞吐量都是相同的(理论上)。 “更宽”的SIMD意味着您使用更多的寄存器和更少的工作负载线程。
没有简单的方法来选择内核编译宽度(SIMD8、SIMD16或SIMD32),对于大多数工作负载,您可能不想这样做。然而,有一个Intel扩展程序cl_intel_subgroups,您的驱动程序可能支持,它可以让您控制线程宽度。(您必须用特殊属性注释内核。)如果您想要使SIMD通道(通道)直接共享数据(无需额外加载到SLM或全局内存),这可能很有用。
也可以查看来自IDF的this presentation。幻灯片80-87展示了编译器SIMD(例如SIMD32或SIMD16)到EU的映射。

1
你能在你的回答中加入SIMD-32如何工作的解释吗? - Manish Kumar
当然。已经编辑了答案以包含此内容。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接