Intel CPU中move elimination插槽的工作原理是什么?
Andreas Abel与Jan Reineke在描述uiCA的论文中讨论了move elimination:
4.1.4 Move Elimination。[...]然而,这种move elimination并非总能成功。[...]我们开发了微基准测试,利用这些计数器分析move elimination何时成功。[...]
以下模型与我们的观察结果一致。处理器会跟踪被多个架构寄存器使用的物理寄存器。我们称每个此类物理寄存器占用一个elimination slot。对应的寄存器被覆盖后,elimination slot会被释放。
- 一个周期内可消除的move指令数量取决于可用elimination slot的数量以及前一周期成功消除的数量。
你之前的认知存在偏差:在乱序处理器的寄存器重命名到提交阶段,物理寄存器完全可以被多个架构寄存器同时指向,这正是move elimination的核心基础。
举个直观例子:当执行mov rax, rbx指令时,寄存器重命名单元不会为rax分配新的物理寄存器,而是直接将rax的架构寄存器映射到rbx当前对应的物理寄存器。此时rax和rbx两个架构寄存器共享同一个物理寄存器,这个物理寄存器就会占用一个elimination slot。
当后续有指令覆盖其中一个架构寄存器(比如mov rax, rcx),rax会被重新映射到新的物理寄存器,原来的共享物理寄存器就不再被rax指向,此时对应的elimination slot就会被释放,供后续的move elimination使用。
简言之,move elimination插槽是处理器用来跟踪“被多个架构寄存器共享的物理寄存器”的资源,它的数量限制了同一周期内可消除的move指令数量——每成功消除一次move,就会产生一对共享同一物理寄存器的架构寄存器,需要占用一个插槽来维持这种映射关系。
内容的提问来源于stack exchange,提问作者Margaret Bloom

