Sandybridge微体系结构中的堆栈引擎是什么?

Gil*_*esz 9 x86 assembly intel cpu-architecture

我正在阅读http://www.realworldtech.com/sandy-bridge/,我在理解一些问题时面临一些问题:

专用堆栈指针跟踪器也存在于Sandy Bridge中并重命名堆栈指针,消除了串行依赖性并删除了多个uop.

什么是dedicated stack pointer tracker实际?

对于Sandy Bridge(和P4),英特尔仍然使用术语ROB.但重要的是要理解,在这种情况下,它只引用了飞行中uops的状态数组

事实上它意味着什么?请说清楚.

Pet*_*des 10

  1. 就像Agner Fog的微博文档解释的那样,堆栈引擎在管道的发布阶段(在将uops发布到核心的无序(OoO)部分之前)处理push/pop/call/ret 的rsp+=8/ rsp-=8部分.

    因此,核心的OoO执行部分只需要处理加载/存储部分,并使用堆栈引擎生成的地址.它偶尔具有插入一个微指令同步其抵消rsp当8位位移计数器溢出时,或当OOO核需要的值rsp直接(例如sub rsp, 8,或mov [rsp-8], eax之后call,ret,pushpop通常导致要在Intel的CPU插一个额外的微指令. AMD CPU显然不需要额外的同步uops).

    请注意,Agner的指令表显示Pentium-M以及后来解码pop reg为仅在加载端口上运行的单个uop.但Pentium II/III解码pop eax为2 uops; 1个ALU和1个负载,因为没有堆栈引擎来处理无序核心之外的ESP调整.除了获取额外的uops之外,一长串push/pop和call/ret会在ESP上产生一个串行依赖,因此无序执行必须在a值mov ebp, esp或地址可用之前通过ALU uops进行咀嚼mov eax, [esp+16].


  1. P6 microarch系列(PPro到Nehalem)将uop的输入值直接存储在ROB中.在发布/重命名时,"冷"寄存器输入从架构寄存器文件读入ROB(由于读取端口有限,可能是瓶颈.请参阅寄存器读取停顿).执行uop后,结果将写入ROB以供其他uop读取.当uops退出时,架构寄存器文件使用来自ROB的值进行更新.

    SnB系列微体系结构(和P4)具有物理寄存器文件,因此ROB存储寄存器编号(即间接级别)而不是直接存储数据.重新排序缓冲区仍然是CPU部分的优秀名称.

请注意,SnB引入了AVX,具有256b向量.使每个ROB条目足够大以存储双倍大小的向量大概是不可取的,因为只将它们保存在较小的FP寄存器文件中.

SnB简化了uop格式以节省功耗.这确实导致了uop微融合能力的牺牲:解码器和uop-cache仍然可以使用2寄存器(索引)寻址模式对存储器操作数进行微熔合,但在发布到OOO之前它们是"未层叠的".核心.

  • 一旦我开始阅读答案的第一行,我就可以知道它是由彼得·科德斯撰写的,只是出色的洞察力. (3认同)
  • @Gilgamesz:无序的CPU核心.(呵呵,谷歌不会为"ooo核心"提供这个,只为"ooo cpu"."ooo核心"是uop在"发行/重命名"和"退休"阶段之间的生命周期的一部分,其中uops在ROB.请参阅http://www.realworldtech.com/haswell-cpu/(及其早期的SnB写作)以获取图表. (2认同)