宏融合
宏融合(Macro-fusion或Macro-ops fusion)是一项旨在提高x86处理器性能的技术。支持宏融合的处理器可令多条(通常为两条)x86指令融合为一条执行,从而提高了处理器的吞吐率。
原理
x86是典型的CISC架构。为了便于实现流水线和超标量,90年代中期以后的主流x86处理器均在前端使用解码器将x86指令翻译成类似RISC指令的微指令送入后端执行。一条x86指令将被解码成一条或多条微指令。受解码单元和执行单元数目限制,在同一时钟周期内,前端能够解码的宏指令最大数量和后端能够执行的微指令最大数量都是有限的固定值。宏融合将在程序中经常连续出现的若干条x86指令在解码前融合成一条,从而提高了解码器的效率;同时,融合后的多条x86指令可以被解码成一条微指令,从而也提高了后端执行的效率。[1]据估计,运行典型的x86程序时,宏融合可以带来约11%的性能提升[2]。
英特尔基于Core和更新微架构的处理器、威盛凌珑处理器[3]和超微(AMD)基于Bulldozer和更新微架构的处理器均支持宏融合。
可被宏融合的指令
在英特尔的实现中,特定的两条连续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等作为第一条指令也可以参与宏融合。
限制
- 一个时钟周期里最多只能完成一次宏融合。
- 第一条指令的两个操作数中必须至少有一个寄存器,即不支持内存和立即数之间的比较。
- Intel Core微架构处理器的宏融合只支持32位程序,包括在64位操作系统下运行的32位程序。这也是某些程序的32位版本较其64位版本运行更快的原因之一。Nehalem微架构以后的Intel处理器支援64位宏融合。
参考资料
- ^ Intel® 64 and IA-32 Architectures Optimization Reference Manual (PDF). [2009-02-05]. (原始内容 (PDF)存档于2009-02-05) (英语).
- ^ AnandTech. Smart Decoding. Intel Core versus AMD's K8 architecture. [2009-02-05]. (原始内容存档于2007-08-06) (英语).
- ^ 威盛凌珑(VIA Nano™) 处理器. [2009-02-05]. (原始内容存档于2009-02-17).