我正在阅读http://www.realworldtech.com/sandy-bridge/,我在理解一些问题时遇到了一些问题:
桑迪Bridge中还提供了专用的堆栈指针跟踪器,它可以重命名堆栈指针,从而消除串行依赖性并删除大量微操作。dedicated stack pointer tracker
到底是什么?
对于桑迪Bridge(和P4),Intel仍然使用术语ROB。但是,在此上下文中,它仅指正在进行的微操作的状态数组,这一点非常重要
它实际上是什么意思?请说清楚。
我正在阅读http://www.realworldtech.com/sandy-bridge/,我在理解一些问题时遇到了一些问题:
桑迪Bridge中还提供了专用的堆栈指针跟踪器,它可以重命名堆栈指针,从而消除串行依赖性并删除大量微操作。dedicated stack pointer tracker
到底是什么?
对于桑迪Bridge(和P4),Intel仍然使用术语ROB。但是,在此上下文中,它仅指正在进行的微操作的状态数组,这一点非常重要
它实际上是什么意思?请说清楚。
2条答案
按热度按时间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, 8
或mov [rsp-8], eax
在call
、ret
、push
或pop
之后通常会导致在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。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微融合内存操作数。
kcrjzv8t2#
堆栈机器有点像另一个执行/内存端口。正如Fog所说:
PUSH、POP、CALL和RET指令对堆栈指针的修改是由一个特殊的堆栈引擎完成的.
这就是rsp+=8 / rsp-=8的算法。它们由堆栈机器处理,而不会竞争执行端口资源。但还有更多。
深度为16的硬件返回地址堆栈(《英特尔® 64和IA-32架构优化参考手册》的3.4.1.4部分)是返回地址的快速阴影。它出现在奔腾M中。它也用于返回预测。搜索Fog的微架构文档以了解“返回堆栈缓冲区”。
所以现在你有了一些不错的硬件来减少堆栈算法的执行端口争用,还有一个快速的缓存返回地址值。你可以通过试图智取堆栈机器来让它的生活变得困难。基本上,总是匹配调用/ret和push和pops。然后你就可以开始了。