Sandybridge 微架构中的堆栈引擎是什么?
What is the stack engine in the Sandybridge microarchitecture?
我正在阅读 http://www.realworldtech.com/sandy-bridge/,但我在理解某些问题时遇到了一些问题:
The dedicated stack pointer tracker is also present in Sandy Bridge
and renames the stack pointer, eliminating serial dependencies and
removing a number of uops.
dedicated stack pointer tracker
实际上是什么?
For Sandy Bridge (and the P4), Intel still uses the term ROB. But it
is critical to understand that, in this context, it only refers the
status array for in-flight uops
实际上是什么意思?请说清楚。
和Agner Fog's microarch doc explains一样,栈引擎在issue阶段处理push/pop/call/ret的rsp+=8
/rsp-=8
部分流水线(在向核心的乱序 (OoO) 部分发出 uops 之前)。
所以核心的OoO执行部分只需要处理load/store部分,地址由栈引擎生成。当 8 位位移计数器溢出时,或者当 OoO 内核直接需要 rsp
的值(例如 sub rsp, 8
或 mov [rsp-8], eax
在 call
、ret
、push
或 pop
之后通常会导致在 Intel CPUs 上插入一个额外的 uop。AMD CPUs 显然不需要额外的同步微指令)。
请注意,Agner 的指令表显示 Pentium-M 和更高版本将 pop reg
解码为仅在加载端口上运行的单个 uop。但是 Pentium II/III 将 pop eax
解码为 2 微码; 1 个 ALU 和 1 个负载 ,因为没有堆栈引擎来处理乱序内核之外的 ESP 调整。除了采用额外的 uops 之外,push/pop 和 call/ret 的长链会产生对 ESP 的串行依赖性,因此乱序执行必须在 [=22] 的值可用之前仔细检查 ALU uops =],或 mov eax, [esp+16]
.
的地址
P6 微架构系列(PPro 到 Nehalem)将 uop 的输入值直接存储在 ROB 中。在 issue/rename、"cold" 处,寄存器输入从架构寄存器文件读取到 ROB(由于读取端口有限,这可能是一个瓶颈。请参阅寄存器读取停顿)。执行一个uop后,将结果写入ROB,供其他uop读取。当 uops 退出时,架构寄存器文件使用来自 ROB 的值进行更新。
SnB 系列微架构(和 P4)有一个物理寄存器文件,因此 ROB 存储寄存器号(即间接级别)而不是直接存储数据。 Re-Order Buffer 对于 CPU.
的那部分仍然是一个很好的名字
请注意,SnB 引入了 AVX,具有 256b 个向量。与仅将它们保存在较小的 FP 寄存器文件中相比,使每个 ROB 条目都足够大以存储双倍大小的向量可能是不可取的。
SnB 简化了 uop 格式以节省功耗。不过,这确实导致了 uop 微融合能力的牺牲:解码器和 uop 缓存仍然可以使用 2 寄存器(索引)寻址模式对内存操作数进行微融合,but they're "unlaminated" before issuing into the OOO core.
堆栈机有点像另一个 execution/memory 端口。正如 Fog 所说:
The modification of the stack pointer by PUSH, POP, CALL and RET instructions is done by a special stack engine. ... This relieves the pipeline from the burden of μops that modify the stack pointer.
这就是 rsp+=8 / rsp-=8 算术。它们由堆栈机器处理,无需竞争执行端口资源。但还有更多。
16 层硬件 return 地址堆栈(Intel® 64 和 IA-32 架构优化参考手册第 3.4.1.4 节)是 return 地址的快速影子。它出现在 Pentium M 中。它也用于 return 预测。在 Fog 的微体系结构文档中搜索 "return stack buffer" 一点点但不多。
现在您有了一些不错的硬件来减少堆栈算法的执行端口争用和快速缓存 return 地址值。你可以通过智取它来让堆叠机器的生活变得困难。基本上,总是匹配 calls/rets 和 push 和 pops。那你就可以开始了。
我正在阅读 http://www.realworldtech.com/sandy-bridge/,但我在理解某些问题时遇到了一些问题:
The dedicated stack pointer tracker is also present in Sandy Bridge and renames the stack pointer, eliminating serial dependencies and removing a number of uops.
dedicated stack pointer tracker
实际上是什么?
For Sandy Bridge (and the P4), Intel still uses the term ROB. But it is critical to understand that, in this context, it only refers the status array for in-flight uops
实际上是什么意思?请说清楚。
和Agner Fog's microarch doc explains一样,栈引擎在issue阶段处理push/pop/call/ret的
rsp+=8
/rsp-=8
部分流水线(在向核心的乱序 (OoO) 部分发出 uops 之前)。所以核心的OoO执行部分只需要处理load/store部分,地址由栈引擎生成。当 8 位位移计数器溢出时,或者当 OoO 内核直接需要
rsp
的值(例如sub rsp, 8
或mov [rsp-8], eax
在call
、ret
、push
或pop
之后通常会导致在 Intel CPUs 上插入一个额外的 uop。AMD CPUs 显然不需要额外的同步微指令)。请注意,Agner 的指令表显示 Pentium-M 和更高版本将
pop reg
解码为仅在加载端口上运行的单个 uop。但是 Pentium II/III 将pop eax
解码为 2 微码; 1 个 ALU 和 1 个负载 ,因为没有堆栈引擎来处理乱序内核之外的 ESP 调整。除了采用额外的 uops 之外,push/pop 和 call/ret 的长链会产生对 ESP 的串行依赖性,因此乱序执行必须在 [=22] 的值可用之前仔细检查 ALU uops =],或mov eax, [esp+16]
. 的地址
P6 微架构系列(PPro 到 Nehalem)将 uop 的输入值直接存储在 ROB 中。在 issue/rename、"cold" 处,寄存器输入从架构寄存器文件读取到 ROB(由于读取端口有限,这可能是一个瓶颈。请参阅寄存器读取停顿)。执行一个uop后,将结果写入ROB,供其他uop读取。当 uops 退出时,架构寄存器文件使用来自 ROB 的值进行更新。
SnB 系列微架构(和 P4)有一个物理寄存器文件,因此 ROB 存储寄存器号(即间接级别)而不是直接存储数据。 Re-Order Buffer 对于 CPU.
的那部分仍然是一个很好的名字
请注意,SnB 引入了 AVX,具有 256b 个向量。与仅将它们保存在较小的 FP 寄存器文件中相比,使每个 ROB 条目都足够大以存储双倍大小的向量可能是不可取的。
SnB 简化了 uop 格式以节省功耗。不过,这确实导致了 uop 微融合能力的牺牲:解码器和 uop 缓存仍然可以使用 2 寄存器(索引)寻址模式对内存操作数进行微融合,but they're "unlaminated" before issuing into the OOO core.
堆栈机有点像另一个 execution/memory 端口。正如 Fog 所说:
The modification of the stack pointer by PUSH, POP, CALL and RET instructions is done by a special stack engine. ... This relieves the pipeline from the burden of μops that modify the stack pointer.
这就是 rsp+=8 / rsp-=8 算术。它们由堆栈机器处理,无需竞争执行端口资源。但还有更多。
16 层硬件 return 地址堆栈(Intel® 64 和 IA-32 架构优化参考手册第 3.4.1.4 节)是 return 地址的快速影子。它出现在 Pentium M 中。它也用于 return 预测。在 Fog 的微体系结构文档中搜索 "return stack buffer" 一点点但不多。
现在您有了一些不错的硬件来减少堆栈算法的执行端口争用和快速缓存 return 地址值。你可以通过智取它来让堆叠机器的生活变得困难。基本上,总是匹配 calls/rets 和 push 和 pops。那你就可以开始了。