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
就像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
,push
或pop
通常导致要在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]
.
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之前它们是"未层叠的".核心.