Macro-Operation Fusion (Macro-Op Fusion, MOP Fusion or Macrofusion) 在现代的微架构中被广泛的使用。该技术即为相邻的marco-operations 可以被合并为单条macro-operaton,在译码期间或者更早。这些指令在后面被译码为fused-uops。
影响处理器的性能的三个因素之一是指令个数。通过减少指令个数,可以使用更少的资源完成更多的工作。macro-fusion 背后的思想就是将邻近的指令进合并为一条指令。一条被融合的指令在其生命周期内都是融合的。因此融合的指令可以使用更少的bit完成更多的工作,释放了执行单元和追踪信息(重命名单元),节省了从译码到退休的带宽,最终可以节省功耗。
marco-op fusion的一个特殊的影响是它也有助于那些非编译的workload,比如很多的运行时解释语言PHP。
X86
Intel
Intel 自从酷睿,就在所有的现代微架构中采用macro-op fusion技术。
历史
Intel在2000年10月申请了融合指令的专利。2006年,在酷睿微架构中首次引入,此后的微架构中一直有采用。
原理
在macro-ops的边界被确定和标记后,它们被发送到instruction queues,然后进入译码器。这个阶段是可以确定并利用macro-opration的时机。注意这是自译码之前,因此译码的带宽也可以被节省。
条件分支在基本上所有的workload中,都是很常用的操作。Intel预计它占据了所有指令的15%。一对相互依赖的指令首先会与一套准则进行比对。比如,第一个源操作数或者目标操作数一定要是寄存器,并且第二个源操作数一定要是立即数或者是non-RIP 相关的内存地址。融合会将使用一条指令的行为来代表两条指令。
通过比对修改标志位的指令(如CMP或者ADD)和后续的一条jump 指令,可以实现融合。产生的输出是单条的 操作-分支指令。最终的融合的指令的声明周期会在pipeline内一直维持,直到可能在执行单元需要在单端口或者双端口上执行时才会拆分。
- 两条指令一定相连,中间没有其他指令
- 第一条指令一定是以下的指令: CMP, TEST, ADD, SUB, INC, DEC, or AND.
- 第二条指令一定是条件跳转,比如JA, JAE, JE, JNE
- 如果第一条指令是cacheline的63byte末尾,而第二条指令是下一条cacheline的开头,那么也无法融合。
此外,每周期只能融合一条指令。如果有机会执行两条macrofusion,那么只有第一对会被融合,第二对会被忽略。
macro-fusion的条件
欢迎关注我的公众号《处理器与AI芯片》