assembly Sandybridge微架构中的堆栈引擎是什么?

vc9ivgsu  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(87)

我正在阅读http://www.realworldtech.com/sandy-bridge/,我在理解一些问题时遇到了一些问题:
桑迪Bridge中还提供了专用的堆栈指针跟踪器,它可以重命名堆栈指针,从而消除串行依赖性并删除大量微操作。
dedicated stack pointer tracker到底是什么?
对于桑迪Bridge(和P4),Intel仍然使用术语ROB。但是,在此上下文中,它仅指正在进行的微操作的状态数组,这一点非常重要
它实际上是什么意思?请说清楚。

ykejflvf

ykejflvf1#

1.与Agner Fog's microarch doc explains类似,堆栈引擎在管道的issue/rename阶段处理push/pop / call/ret的rsp+=8/rsp-=8部分(在将uop发送到核心的Out-of-Order(OoO)部分(后端)之前)。
所以后端只需要处理加载/存储部分,地址由堆栈引擎生成。当8位位移计数器溢出时,或者当OOO后端直接需要rsp的值时,它偶尔需要插入一个uop来同步其从rsp的偏移量(例如sub rsp, 8mov [rsp-8], eaxcallretpushpop之后通常会导致在Intel CPU上插入额外的uop。AMD CPU显然不需要额外的同步uop)。
请注意,Agner的指令表显示Pentium-M和更高版本将pop reg解码为仅在加载端口上运行的单个uop,但Pentium II/III将pop eax解码为2个uop; 1个ALU和1个负载,因为没有堆栈引擎来处理后端之外的ESP调整。除了需要额外的uop,一长串的push/pop和call/ret创建了对ESP的串行依赖性,因此在mov ebp, esp的值或mov eax, [esp+16]的地址可用之前,乱序执行必须咀嚼ALU uop。

  1. P6微拱家族(PPro到Nehalem)将uop的输入值直接存储在ROB中。在发出/重命名时,“冷”寄存器输入从架构寄存器文件读取到ROB中(由于有限的读端口,这可能是一个瓶颈。参见寄存器读暂停)。执行uop后,结果被写入ROB以供其它uop读取。当uop引退时,用来自ROB的值更新架构寄存器文件。
    SnB系列微架构(和P4)有一个物理寄存器文件,所以ROB存储寄存器号(即间接层)而不是直接存储数据。Re-Order Buffer仍然是CPU这部分的一个很好的名字。
    请注意,SnB引入了AVX,有256 b个向量。与仅将它们保存在较小的FP寄存器文件中相比,使每个ROB条目足够大以存储双倍大小的向量可能是不可取的。
    SnB简化了uop格式以节省保存功耗,但这确实牺牲了uop微融合能力:解码器和uop缓存仍然可以使用2寄存器(索引)寻址模式but they're "unlaminated" before issuing into the OoO back-end微融合内存操作数。
kcrjzv8t

kcrjzv8t2#

堆栈机器有点像另一个执行/内存端口。正如Fog所说:
PUSH、POP、CALL和RET指令对堆栈指针的修改是由一个特殊的堆栈引擎完成的.
这就是rsp+=8 / rsp-=8的算法。它们由堆栈机器处理,而不会竞争执行端口资源。但还有更多。
深度为16的硬件返回地址堆栈(《英特尔® 64和IA-32架构优化参考手册》的3.4.1.4部分)是返回地址的快速阴影。它出现在奔腾M中。它也用于返回预测。搜索Fog的微架构文档以了解“返回堆栈缓冲区”。
所以现在你有了一些不错的硬件来减少堆栈算法的执行端口争用,还有一个快速的缓存返回地址值。你可以通过试图智取堆栈机器来让它的生活变得困难。基本上,总是匹配调用/ret和push和pops。然后你就可以开始了。

相关问题