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

Intel Gen8 architecture calculating total kernel instances per execution unit

我正在参考 intel_gen8_arch

有些部分让我对 SIMD 引擎概念的理解产生了混淆。

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

以上几行文档清楚地说明了每个执行单元可以完成的最大浮点运算。

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

在 5.3.5 节中提到 在 Gen8 计算架构上,大多数 SPMD 编程模型都采用这种风格的代码 生成和欧盟处理器执行。实际上,每个 SPMD 内核实例似乎 在其自己的 SIMD 通道内串行和独立执行。实际上,每个线程执行 并发的 SIMD 宽度内核实例数。因此对于一个 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。部分确实是说每个 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 只能从 7 个线程中的两个(准备好的)中选择指令(每个管道一个指令)。

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

没有简单的方法来选择内核编译宽度(SIMD8、SIMD16 或 SIMD32),您可能不想为大多数工作负载这样做。尽管如此,您的驱动程序可能支持 Intel 扩展 cl_intel_subgroups,它可以让您控制线程宽度。 (您必须使用特殊属性注释内核。)如果您希望 SIMD 通道(通道)直接彼此共享数据(无需额外加载 SLM 或全局内存),这将很有用。

另请参阅 IDF 的 this presentation。幻灯片 80-87 说明了从编译器 SIMD(例如 SIMD32 或 SIMD16)到欧盟的映射。