【问题标题】:Reorder buffer and not modified registers重新排序缓冲区和未修改的寄存器
【发布时间】:2016-08-02 03:57:34
【问题描述】:

重排序缓冲区每个时钟周期最多可以处理 3 次读取 来自最近未修改的寄存器。

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

【问题讨论】:

  • 您声明的上下文不清楚,但我猜他指的是早期奔腾将永久寄存器读取次数增加到三个,希望三个寄存器读取端口足以防止寄存器读取停止。

标签: performance assembly x86 intel cpu-architecture


【解决方案1】:

首先,这仅适用于 Sandybridge 之前的 Intel P6 系列微架构。 (PPro 对 Nehalem)。

这个 P6 系列瓶颈通常称为寄存器读取停止,有时也称为“ROB 读取停止”,因为值在发出/重命名期间被读取进入 ROB;在将微指令分派到执行端口时,始终从 ROB(或旁路网络)读取执行单元的输入。

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


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

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

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

【讨论】:

  • 请向我推荐一些关于微架构的东西(可能很短;)​​)
  • @Gilgamesz:嗯,阅读 Agner Fog 的微架构指南,你已经是了,不是吗?还是来自“优化装配”指南的建议?从 Sandybridge 部分开始,因为这是目前主要的相关 uarch。一旦您了解了管道如何处理指令,优化 asm 指南中的建议就会更有意义。
猜你喜欢
  • 2017-03-25
  • 1970-01-01
  • 2020-06-05
  • 2013-12-08
  • 1970-01-01
  • 2018-06-04
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多