巨集融合Macro-fusionMacro-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指令中的第一條必須是影響標誌位的指令,如TESTCMP;第二條必須是條件跳轉。這樣的組合在編譯器生成的代碼中非常常見,因此程序不需要重新編譯就可以獲得性能提升。

Core和Nehalem微架構只支持將TESTCMP作為第一條指令。具體而言,當第一條指令是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微架構的處理器中,英特爾進一步拓展了巨集融合的支持範圍。例如,除TESTCMP外,ADDSUB等作為第一條指令也可以參與巨集融合。

限制 編輯

  • 一個時鐘周期里最多只能完成一次巨集融合。
  • 第一條指令的兩個操作數中必須至少有一個暫存器,即不支持記憶體立即數之間的比較。
  • Intel Core微架構處理器的巨集融合只支持32位程序,包括在64位作業系統下運行的32位程序。這也是某些程序的32位版本較其64位版本運行更快的原因之一。Nehalem微架構以後的Intel處理器支援64位巨集融合。

參考資料 編輯

  1. ^ Intel® 64 and IA-32 Architectures Optimization Reference Manual (PDF). [2009-02-05]. (原始內容 (PDF)存檔於2009-02-05) (英語). 
  2. ^ AnandTech. Smart Decoding. Intel Core versus AMD's K8 architecture. [2009-02-05]. (原始內容存檔於2007-08-06) (英語). 
  3. ^ 威盛凌珑(VIA Nano™) 处理器. [2009-02-05]. (原始內容存檔於2009-02-17).