观察 x86 寄存器依赖性

Observing x86 register dependencies

除了 x86 中的体系结构寄存器(eax、ebx 等)之外,是否还有任何其他处理器寄存器(例如标志)需要由流水线处理器中的记分板强制执行 RAW 依赖项?

从字面上看,每个寄存器都保证,如果您写入它,后面的指令将读取新值。

x86 是根据串行执行定义的;流水线和无序执行需要为 一切 保留这种错觉,包括段寄存器、FP 舍入模式、控制和调试 regs,显然还有 FLAGS。

A CPU 需要检测 RAW (and other) hazards 或编写写入该寄存器序列化(排空管道)的指令。


是的,当然FLAGS被重命名了,否则WAW / WAR hazards会导致几乎每个整数指令之间的错误依赖,当然RAW真正的依赖必须被检测到这样读取FLAGS的指令才能得到尽管乱序执行,但输入正确。

现代 x86 CPU 做 register renaming (Tomasulo's algorithm), not just scoreboarding. Hopefully you mean using a scoreboard to detect those dependencies as part of register renaming?

当然还有 FP/SIMD 寄存器,包括包含 TOP 字段的 x87 状态字,因为这是重命名 x87 寄存器的一部分。

避免对寄存器进行重命名的唯一方法是对其进行写入以序列化执行,这样就不会有运行中的指令仍需要读取或写入旧值。例如在某些微体系结构上,段寄存器未重命名,因此 mov Sreg, reg 必须耗尽 ROB。

在某些 uarches 上,MXCSR and/or x87 control 字(包含舍入模式)未重命名。 google 找到的 random Intel document 记录了 resource_stalls 的性能计数器子事件,其中可能包括 MXCSR 重命名停顿周期。 uarch 的 IDK:

MXCSR rename stall cycles

Stalls due to the MXCSR register rename occurring too close to a previous MXCSR rename. The MXCSR provides control and status for the MMX registers.

另请参阅 Agner Fog's microarch pdf,其中可能会提到一些类似的细节。