Assembly Sandybridge微体系结构中的堆栈引擎是什么?
我正在阅读,在理解一些问题时遇到了一些问题: Sandy Bridge中还提供了专用堆栈指针跟踪器 并重命名堆栈指针,消除串行依赖关系和 删除多个UOP 什么是专用堆栈指针跟踪器 对于Sandy Bridge(和P4),Intel仍然使用ROB一词。但是它 关键是要理解,在这种情况下,它仅指 飞行中UOP的状态数组 这实际上意味着什么?请说清楚Assembly Sandybridge微体系结构中的堆栈引擎是什么?,assembly,x86,intel,cpu-architecture,Assembly,X86,Intel,Cpu Architecture,我正在阅读,在理解一些问题时遇到了一些问题: Sandy Bridge中还提供了专用堆栈指针跟踪器 并重命名堆栈指针,消除串行依赖关系和 删除多个UOP 什么是专用堆栈指针跟踪器 对于Sandy Bridge(和P4),Intel仍然使用ROB一词。但是它 关键是要理解,在这种情况下,它仅指 飞行中UOP的状态数组 这实际上意味着什么?请说清楚 与此类似,堆栈引擎在管道的发布阶段(在向核心的无序(OoO)部分发布UOP之前)处理push/pop/call/ret的rsp+=8/rsp-=8部分
rsp+=8
/rsp-=8
部分
因此,内核的OoO执行部分只需使用堆栈引擎生成的地址处理加载/存储部分。当8位位移计数器溢出时,或当OoO内核直接需要rsp
的值时(例如sub-rsp、8
或mov[rsp-8],它有时必须插入uop以同步其与rsp
的偏移量在调用
、ret
、push
或pop
之后,eax
通常会导致在Intel CPU上插入额外的uop。AMD CPU显然不需要额外的同步uop)
请注意,Agner的指令表显示奔腾M和更高版本将pop reg
解码为仅在加载端口上运行的单个uop。但是奔腾II/III将pop eax
解码为2个UOP;1个ALU和1个负载,因为在故障堆芯之外没有堆栈引擎来处理ESP调整。除了获取额外的UOP,一长串的push/pop和call/ret会对ESP产生串行依赖性,因此在mov ebp、ESP
或mov eax、[ESP+16]
的地址可用之前,无序执行必须仔细检查ALU UOPSnB简化了uop格式以节省电源。不过,这确实导致uop微融合功能的牺牲:解码器和uop缓存仍然可以使用2寄存器(索引)寻址模式对内存操作数进行微融合。堆栈机器有点像另一个执行/内存端口。正如福格所说: 通过PUSH、POP、CALL和RET指令修改堆栈指针是由一个特殊的堆栈引擎完成的。。。这将减轻管道修改堆栈指针的μ操作负担 这就是rsp+=8/rsp-=8算法。它们由堆栈机器处理,而无需竞争执行端口资源。但还有更多 16深硬件返回地址堆栈(英特尔64和IA-32体系结构优化参考手册第3.4.1.4节)是返回地址的快速阴影。它出现在奔腾M中。它也用于收益预测。在Fog的微体系结构文档中搜索“返回堆栈缓冲区”只需一点时间,但不会更多
因此,现在您有了一些很好的硬件来减少堆栈算法的执行端口争用和快速缓存返回地址值。你可以通过试图智胜堆叠机器来让它的生活变得困难。基本上,始终匹配呼叫/重试、推送和弹出。那你就可以开始了。OOO core你能扩展一下缩写吗?@Gilgamesz:out-order CPU core。(嗯,谷歌没有给“ooo核心”这个词,只给了“ooo cpu”这个词。“ooo核心”是uop生命周期的一部分,介于“发布/重命名”和“退役”阶段之间,uop在ROB中。参见(和他早期的SnB writeup)对于图表。当我开始阅读Peter Cordes写的答案的第一行时,我就可以知道答案是什么时候写的,这是一个很好的洞察力。如果使用
mov-rbp、rsp
或[rsp+8],在push
之后使用pop
并不重要
用于本地,或在推送和弹出之间的任何类似操作。任何明确使用堆栈指针的操作都会强制堆栈引擎插入额外的uop以更新OOO核心的值。这更像是:在调用后(应返回ret
),弹出一次要比添加rsp便宜,8
,代码大小也更小。你把返回地址预测器和堆栈引擎放在一起,这比有用的要复杂得多,依我看。它们是相互正交的;彼此可以独立存在,你可以独立观察它们的效果。真正的代码中断s堆栈引擎一直在运行,但使用add esp,16
而不是4pop
指令,或使用push rbx
/sub rsp,128
在保存要稍后还原的寄存器后,在函数开始处保留堆栈空间。最小化必须插入的额外UOP是有用的,但不是很重要。B但是不要破坏call/ret配对!@PeterCordes“但是使用”我不能解析那个句子。使用?哦,我想我漏掉了句子的结尾:但是使用add/sub而不是push/po