AVX-512 指令究竟是如何在 ALU 上执行的?

How exactly are AVX-512 instructions executed on ALU?

我无法理解如何在单个时钟周期内在 ALU 上使用 512 位寄存器。是否有多个 ALU 来划分数据,或者是否有专门的 ALU 可以处理这个?

是的,例如,SIMD 512 位 ALU 复制 16 个 32 位 FMA 单元,这就是 CPUSIMD 的全部想法:提供宽 EU,以便更多工作可以在相同数量的情况下通过管道说明。

例如请注意 Haswell 中的“256 位 FMA”执行单元。 (参见 David Kanter's deep-dive 与 Sandybridge 的比较。)还要注意 Haswell 如何将 load/store 路径 from/to L1d 缓存从 128 位扩展到 256 位。 (Sandybridge 每 256 位 AVX 加载或存储执行一次地址生成,但在 EU 中花费 2 个周期处理数据。)

多个微体系结构通过将 SIMD 指令拆分为两个半角微指令来工作,例如用于 SSE 的 Intel Pentium-M 和用于 AVX 的 AMD Zen 1,分别只有 64 位或 128 位 SIMD 执行单元。但是现有的 x86 CPU 都没有支持 SIMD 指令集,其宽度是其向量 ALU 的两倍。关于其他 ISA 的 IDK。

有关这些的详细信息,请参阅 https://agner.org/optimize/ and https://uops.info/

是的,这会占用很大的管芯面积;这是反对 AVX-512 的主要论据之一,即在更多内核上花费该区域对大多数程序来说会更好。 (引用 Linus Torvalds 的话说,这是一种“强力病毒”;作为内核开发人员,他可能不太愿意看到更广泛的 SIMD 的好处,尽管我认为他明白 user-space 甚至在所有地方都使用 SIMD对于 memcpy。)

面积成本是英特尔 CPUs 通常只有半宽 SIMD divide/sqrt 单元的原因,因此 CPU 支持的最宽 SIMD 分区必须拆分。