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

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部分

我正在阅读,在理解一些问题时遇到了一些问题:

Sandy Bridge中还提供了专用堆栈指针跟踪器 并重命名堆栈指针,消除串行依赖关系和 删除多个UOP

什么是专用堆栈指针跟踪器

对于Sandy Bridge(和P4),Intel仍然使用ROB一词。但是它 关键是要理解,在这种情况下,它仅指 飞行中UOP的状态数组

这实际上意味着什么?请说清楚

  • 与此类似,堆栈引擎在管道的发布阶段(在向核心的无序(OoO)部分发布UOP之前)处理push/pop/call/ret的
    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 UOP


  • P6 Microach系列(PPro至Nehalem)将uop的输入值直接存储在ROB中。在发出/重命名时,“冷”寄存器输入从体系结构寄存器文件读取到ROB中(由于读取端口有限,这可能是一个瓶颈。请参阅寄存器读取暂停)。执行uop后,结果将写入ROB,以便其他uop读取。UOP退役时,体系结构寄存器文件将使用ROB中的值进行更新

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

  • 注意,SnB引入了AVX,有256b个向量。与仅将每个ROB条目保存在较小的FP寄存器文件中相比,将每个ROB条目设置为足以存储两倍大小的向量可能是不可取的


    SnB简化了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
    而不是4
    pop
    指令,或使用
    push rbx
    /
    sub rsp,128
    在保存要稍后还原的寄存器后,在函数开始处保留堆栈空间。最小化必须插入的额外UOP是有用的,但不是很重要。B但是不要破坏call/ret配对!@PeterCordes“但是使用”我不能解析那个句子。使用?哦,我想我漏掉了句子的结尾:但是使用add/sub而不是push/po