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

时间:2016-04-14 18:50:56

标签: assembly x86 intel cpu-architecture

我正在阅读http://www.realworldtech.com/sandy-bridge/,我在理解某些问题时遇到了一些问题:

  

专用堆栈指针跟踪器也存在于Sandy Bridge中   并重命名堆栈指针,消除串行依赖和   删除了一些uops。

实际上dedicated stack pointer tracker是什么?

  

对于Sandy Bridge(以及P4),英特尔仍然使用术语ROB。但它   至关重要的是要理解,在这种情况下,它只涉及到   飞行中的状态数组

事实上它是什么意思?请说清楚。

2 个答案:

答案 0 :(得分:8)

  1. Agner Fog's microarch doc explains类似,堆栈引擎在管道的发布阶段处理push / pop / call / ret的rsp+=8 / rsp-=8部分(在发出uops之前)核心的无序(OoO)部分。

    因此,核心的OoO执行部分只需要处理加载/存储部分,并使用堆栈引擎生成的地址。当8位位移计数器溢出时,或者当OoO核心直接需要rsp的值(例如rsp或{{}时,它偶尔必须插入一个uop来同步sub rsp, 8的偏移量。 1}} mov [rsp-8], eax之后,callretpush通常会在英特尔CPU上插入额外的uop.AMD CPU显然不需要额外的同步uops)。

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

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

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

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

      SnB简化了uop格式以节省电量。这确实导致了uop微融合能力的牺牲:解码器和uop-cache仍然可以使用2寄存器(索引)寻址模式but they're "unlaminated" before issuing into the OOO core微融合存储器操作数。

答案 1 :(得分:-1)

堆栈计算机有点像另一个执行/内存端口。正如福格所说:

  

通过PUSH,POP,CALL和RET指令修改堆栈指针是由一个特殊的堆栈引擎完成的。 ...这使管道免受修改堆栈指针的μops的负担。

这样就照顾了rsp + = 8 / rsp- = 8算术。它们由堆栈计算机处理而不竞争执行端口资源。但还有更多。

16深度硬件返回地址堆栈(英特尔®64和IA-32架构优化参考手册的第3.4.1.4节)是返回地址的快速阴影。它出现在奔腾M中。它也用于返回预测。在Fog的Microarchitecture doc中搜索“返回堆栈缓冲区”一点但不是很多。

所以现在你有一些不错的硬件来减少堆栈算法的执行端口争用和快速缓存返回地址值。你可以通过试图超越它来使堆叠机的生活变得困难。基本上,总是匹配呼叫/ rets和推送和弹出。然后你很高兴。

相关问题