原文出处:https://easyperf.net/blog/2018/02/23/MacroFusion-in-Intel-CPUs
(这个分析工作没有利用Gem5,可以进一步分析实际的微融合,宏融合)
在原文作者之前的文章中,写过关于微指令融合的文章。微融合是指:当来自 同一汇编指令 的多个UoP融合成一个操作。在core2和nehalem体系结构中引入的Intel体系结构(IA)的另一个有趣的特性是宏融合。它是指将来自 不同汇编指令(区别于微融合) 的UoP合并为一个UOP时的情况。
宏融合的描述可以在Agner Fog的微体系结构手册中找到(https://www.agner.org/optimize/microarchitecture.pdf):
在某些情况下,解码器将算术或逻辑指令与随后的条件转移指令融合到单个计算和分支μop中。在执行单元上,计算和分支微操不分为两部分,而是由分支单元作为单个微操执行。这意味着宏OP融合在流水线的所有阶段中节省带宽,从解码到退休。
Example
.loop:
dec rdi
jnz .loop
ret
在这个组件中没有做很多有用的工作,但是它是宏观融合最简单的例子。我们只是在每次迭代中减小RDI,当它达到0时,退出循环并返回。
和以前一样,我使用UARCH-bench(https://github.com/travisdowns/uarch-bench )工具在Ivy Bridge处理器上进行了实验:
UOPS_RETIRED.RETIRE_SLOTS -统计每个周期使用的退出时段数。(融合域)
UOPS_RETIRED.ALL -统计失效的微操作数。(未使用的域)
可以在这个网址看到更多作者的计算结果:https://easyperf.net/blog/2018/02/15/MicroFusion-in-Intel-CPUs
如我们所见,每个循环中失效的指令数是2。但它们在解码器中融合成一个UOP,并以融合的方式执行。我们可以这样说,因为失效的UOP数量在融合域和未融合域中是相同的。
Limitations
在不同的体系结构中,存在许多不同的限制。例如,如果将nop放在中间,它将破坏宏观融合: