Zen 3 只是 Zen 2 的增量变化,因此 Wikichip 没有重复架构细节部分。请参阅https://en.wikichip.org/wiki/amd/microarchitectures/zen_2#Block_Diagram。
对于延迟,在https://uops.info/上,您可以查看哪些 ALU 指令是单 uop,以及测量的延迟是多少。除非存在固有的旁路延迟作为使用指令的唯一方式的一部分(例如可能在 中pmovmskb
),否则这些延迟与底层功能单元相同。
对于早期的微架构,包括 Intel 从 Core 2 到 Haswell 和 AMD K8/K10/Bulldozer,David Kanter 写了一些非常好的微架构深入研究。
阅读这些,尤其是 Sandy-bridge 和 Haswell,将有助于理解 Zen(因为它们有相似之处)。但请注意,Zen 甚至可以将内存目标解码add [rdi], eax
为单个前端 uop,这与 Intel 不同的是,所需的加载和存储操作是单独的 uop,必须进行微融合才能在不占用额外带宽的情况下挤过前端。
但是 Bulldozer 就像 Zen 一样,为整数和 FP 执行单元设置了单独的调度程序队列。与 Intel 不同,它们不共享整数和 FP 之间的“端口”,因此这些操作不会在后端相互竞争。
你的书说 Haswell 有 8 个“功能单元”
这并不完全正确。英特尔 CPU 将执行单元分组到不同的端口上,但这并不意味着连接到/通过一个端口的所有执行单元在物理上都是一个大“功能单元”或执行单元的一部分。
例如,Andy Glew(英特尔 P6 微架构的架构师之一)评论了 x86 架构中的“欧盟”是什么?(计算有效地址?),说“我没有涉及共享起始端口和完成端口的专业 EU 组的复杂性,更不用说 RF 读写端口、灵活的延迟等。很难解释这些问题英特尔编译器作者指南,当我在 1994 年为 P6 编写第一个版本时。 ”
Kanter 在https://www.realworldtech.com/haswell-cpu/4/上的 SnB 和 HSW 图表显示了这一点
例如:端口 1 有三个独立的(组)执行单元通过它连接:
- 整数 ALU(包括对 imul 和 popcnt 等 3 周期延迟操作的支持,与任何其他端口上的整数 ALU 不同)
- SIMD FP ALU,具有 FMA/MULPS/PD(完全流水线化的 5 个周期延迟)和单独的 ADDPS(3 个周期延迟)。它们也竞争回写/完成端口,因此计划将尽量避免在 MULPS 两个周期后在端口 1 上启动 ADDPS。
- SIMD 整数 ALU 包括 blend、VPADDB 等。
这三个执行单元(或执行单元组?)是单独转发域的一部分(因此,如果您对 SIMD-FP 的输出进行 SIMD 整数移位mulps
,例如提取指数字段,则会绕过延迟)。FP ALU 很可能在物理上靠近 FP 寄存器文件,与整数单元分开。拥有单独的“域”还可以处理可能需要转发到什么的组合爆炸,以及简单的信号扇出。(如果很多东西需要读取同一条总线,则需要更强的信号才能在所有电容负载下将其电压驱动到逻辑 1 或逻辑 0。)
Skylake 放弃了单独的 SIMD-FP-add ALU,只在 FMA 硬件上以与 fma/mul 相同的延迟运行它。SIMD-FP add 很可能是 Haswell 中真正的一个单独的执行单元,而不仅仅是 FMA 单元的不同配置,否则您会期望他们会在端口 0 和 1 上使用 FMA 单元来做到这一点。但addps
只有在 Haswell 上有 1/clock 的吞吐量。(相关:为什么Intel的Haswell芯片让浮点乘法比加法快一倍?)
我不知道端口 1 上的整数 ALU 是否与 SIMD 内容竞争回写。可能不是,因为整数和 FP 具有不同的寄存器文件。不过,他们确实需要将 uop 标记为在 ROB(重新排序缓冲区)中执行完毕,并且 ROB 是统一的。(不过,uop 可以在调度到执行端口后很快离开 RS(调度程序);这不需要等待完成,只知道它的数据确实按预期准备好了,因此不需要重播. 如果它正在读取加载的结果,并且加载结果没有在缓存中命中,因此没有准备好预期的延迟,则可能会发生这种情况。)
幸运的是,港口与欧盟的区别主要只是“有趣的事实”
对于性能,你真的只需要知道来自https://uops.info/的数字,以及哪些 uops 相互竞争执行端口/单元。不是是否addps
和fma...ps
实际使用相同的晶体管。(以及https://agner.org/optimize/和供应商优化手册,以了解向这些执行单元提供工作的管道的详细信息,并绕过它们之间的延迟。)
但是,了解 CPU 的工作原理当然很有趣。它有时与了解同一 CPU 系列的不同型号的不同之处相关:
Skylake-X(支持 AVX-512)有一个有趣的效果:当 512 位微指令在运行时,它会关闭端口 1 上的 SIMD ALU,将它们连接到处理来自端口 0 的微指令的 512 位 FMA 单元。
但它不会关闭整数 ALU:这是 popcnt / imul / lzcnt / slow-LEA 唯一可以执行的地方,它仍然可以运行 1 周期简单整数的东西。这是一个非常明确的例子,执行单元与端口分开,只是通过它们到达。
(许多 Skylake-AVX512 CPU 有第二个 512 位 FMA 单元连接到端口 5,它们可以为 512 位 uops 供电。一些 Xeon Bronze / Silver 没有。Ice Lake 笔记本电脑和 Rocket Lake 芯片没有;512- bit FP add/mul/FMA 具有 1 个时钟吞吐量,而不是每 0.5 个时钟 1 个 。https://www.extremetech.com/computing/263963-intel-reverses-declares-skylake-x-cpus-two-avx-512 -units有一篇关于 Skylake-X 高端桌面芯片的短文,描述了机制。)
Agner Fog 在他的微架构指南中还介绍了端口 1 的内容,以及当任何 512 位微指令在运行时只有两个矢量 ALU 端口处于活动状态这一事实。