重新排序缓冲区和未修改的寄存器

Reorder buffer and not modified registers

The reorder buffer can handle no more than three reads per clock cycle from registers that have not been modified recently.

来自Agner Fog's material。但是,我的疑问是: 为什么修改寄存器很重要?为什么这很重要?

首先,这仅适用于 Sandybridge 之前的英特尔 P6 系列微体系结构。 (PPro 给 Nehalem)。

这种 P6 系列瓶颈通常称为寄存器读取停顿,有时也称为 "ROB-read stalls",因为在 issue/rename 期间,值被读取 ROB 中;将微指令分派到执行端口时,执行单元的输入总是从 ROB(或旁路网络)读取。

AMD、Intel P4 和 Intel Sandybridge 系列使用物理寄存器文件设计。 SnB 系列在寄存器读取端口上没有瓶颈。 (或者是吗?当我们在 HSW 和(上限)SKL 上读取非常多的寄存器时,某些效果似乎会限制吞吐量。My post on Agner blog。但它可能是瓶颈调度而不是 issue/rename;我没有完成了突发实验,只是稳定状态。没有理由认为该机制与 P6 系列相同。)


最近修改的架构寄存器是由尚未退出的指令写入的。数据已经在 ROB1 中可用,而不必在 issue/rename 期间从永久寄存器文件中读取。随着指令被添加到 ROB,在 issue/rename 期间每个周期可以读取多少这样的 "cold" 寄存器是有限制的。 Nehalem 增加了一些。

Agner Fog 的 microarch PDF(您已经阅读过)解释了细节;请参阅 PPro 部分,以及 Core2/Nehalem 部分中的更新。

脚注 1:或正在从旁路网络中的一个执行单元转发到下一个执行单元,对于尚未完成执行的输入。