宏融合
原理
x86是典型的CISC架构。为了便于实现流水线和超标量,90年代中期以后的主流x86处理器均在前端使用解码器将x86指令翻译成类似RISC指令的微指令送入后端执行。一条x86指令将被解码成一条或多条微指令。受解码单元和执行单元数目限制,在同一时钟周期内,前端能够解码的宏指令最大数量和后端能够执行的微指令最大数量都是有限的固定值。宏融合将在程序中经常连续出现的若干条x86指令在解码前融合成一条,从而提高了解码器的效率;同时,融合后的多条x86指令可以被解码成一条微指令,从而也提高了后端执行的效率。据估计,运行典型的x86程序时,宏融合可以带来约11%的性能提升。
目前,英特尔基于Core、Nehalem和Sandy Bridge微架构的处理器和威盛凌珑处理器均支持宏融合,而超微(AMD)的处理器尚不支持这项技术。
可被宏融合的指令
在英特尔的实现中,特定的两条连续x86指令可以被一个解码单元在一个时钟周期内解码成一条微指令,因此4个解码单元可在一个时钟周期里解码5条x86指令。这两条x86指令中的第一条必须是影响标志位的指令,如TEST或CMP;第二条必须是条件跳转。这样的组合在编译器生成的代码中非常常见,因此程序不需要重新编译就可以获得性能提升。
Core和Nehalem微架构只支持将TEST或CMP作为第一条指令。具体而言,当第一条指令是TEST时,第二条指令可以是任何的条件跳转指令;而当第一条指令是CMP时,Core微架构的处理器仅在第二条指令是JA(JNBE)、JAE(JNB、JNC)、JE(JZ)、JNA(JBE)JNAE(JC、JB)或JNE(JNZ)时支持宏融合,但Nehalem微架构的处理器在第二条指令是JL(JNGE)、JGE(JNL)、JLE(JNG)、JG(JNLE)时也支持宏融合。
在Sandy Bridge微架构的处理器中,英特尔进一步拓展了宏融合的支持范围。例如,除TEST和CMP外,ADD和SUB等作为第一条指令也可以参与宏融合。
限制
一个时钟周期里最多只能完成一次宏融合。
第一条指令的两个操作数中必须至少有一个寄存器,即不支持内存和立即数之间的比较。
以下限制仅适于用Core微架构的处理器
宏融合只支持32位程序,包括在64位操作系统下运行的32位程序。这也是某些程序的32位版本较其64位版本运行更快的原因之一。
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
- 有价值
- 一般般
- 没价值