在上一篇連載中,筆者介紹了Sandy Bridge微架構中對性能有很大影響的幾處改進,然而最重要的執行單元的變化沒有涉及到,這部分的變化還跟Sandy Bridge新加入的AVX指令集相關。AVX(Advanced Vector Extensions,高級矢量擴展)是X86上重要的指令集改進,不僅僅在于其對性能的明顯提升,還在于其對現有X86指令集的多種革新。
強大的性能:256位向量計算
向量就是多個標量的組合,通常意味著SIMD(單指令多數據),就是一個指令同時對多個數據進行處理,達到很大的吞吐量。
Sandy Bridge的AVX將X86向量化寬度擴展到了256位,原有的16個128位XMM寄存器擴充為256位的YMM寄存器,可以同時處理8個單精度浮點數和4個雙精度浮點數,在理想情況下,Sandy Bridge的浮點吞吐能力可以達到前代的兩倍。
從Nehalem開始的微架構包含了3個運算端口:0、1和5,每個運算端口分為三個區域:ALU、SIMD INT、SIMD FP,分別執行整數和邏輯運算、SIMD整數和SIMD浮點運算。在每一個時鐘周期,每個運算端口可以分發一個uop,這個uop可以是三種運算中任意的一種。不同的運算區域可以同時運作。
Sandy Bridge微架構的所有執行單元都經過了修改以執行256位AVX指令,它并沒有直接將所有浮點執行單元擴充到256位寬度,而是采用了一種較為節約晶體管乃至能耗的方法:重用128位的SIMD整數和SIMD浮點路徑。
除了AVX帶來的性能增強之外,Sandy Bridge還繼續增強了AES指令集的性能,提升其吞吐量,此外,SHLD(移位)指令、ADC(進位加)指令和Multiply(64位乘數128位積)運算的性能也都得到了提升,SHLD指令性能提升增強了SHA-1計算能力,ADC吞吐量翻倍提升了大數值運算能力,而最后者提升了現有RSA程序25%的性能。
精簡X86指令集
除了明顯提升浮點運算性能之外,AVX指令集還是對X86指令集的一個精簡。我們知道由于是不定長的CISC指令集,X86指令集可以很容易地進行擴展,每一代處理器都像不要錢似的增加擴展指令集。然而目前的這種通過增加各種Prefix前綴來擴展指令集的方式已經達到了其極限,并且這種方式導致的指令集復雜化和長度增加,導致了執行文件的臃腫和解碼器單元的復雜化和低效化。
AVX指令集帶來了新的操作碼編碼方式,這種編碼方式叫做VEX(Vector Extension),其動機就是壓縮各式各樣的Prefix前綴,集中到一個比較固定的字段中,縮短指令長度,降低無謂的代碼冗余,并且也降低了對解碼器的壓力。
VEX編碼方式使用了兩種VEX Prefix,除了一個字節的字頭之外,分別具有1到2個字節的Payload(負載),在這個Payload里面就包括了所有的Prefix的內容,達到了精簡指令集的目的。
VEX前綴包含了X86-64指令使用的REX前綴以及原SSE指令使用的前綴,還融合了普通操作碼帶有的Escape字段,從某種意義上來說,VEX讓CISC的X86指令集往RISC精簡指令集靠近了一點,當然,CISC易于擴充、支持復雜靈活的尋址方式的特性依然無損。
強化X86指令集
基于歷史上X86處理器缺乏存儲單元的原因,X86指令集屬于雙操作數的破壞性指令集,例如,指令add ax, bx包含了ax和bx兩個操作數,作用是將寄存器ax和bx的數值相加,并保存到寄存器ax當中去,計算結束后,源操作數ax的內容就被計算結果“摧毀”了。
在傳統的僅具有8個通用寄存器的X86處理器上,這種編碼方式的使用實屬沒有辦法,同時期具有更多通用寄存器的RISC處理器都采用的是多操作數的非破壞性句法。在應用了Register Renaming寄存器重命名技術之后,X86處理器事實上也具有了很多的寄存器可供使用,因此Intel就動起了新的念頭。Sandy Bridge帶來的AVX指令集提供了新的3#12316;4操作數的非破壞性句法,在某種程度上,這彌補了X86指令集的體系缺陷。
例如,要實現xmm10 = xmm9 + xmm1,傳統X86處理器需要兩條指令:
movapps xmm10, xmm9
addpd xmm10, xmm1
在應用AVX指令集新的3操作數格式之后,只需要一條指令就能完成這個功能:
vaddpd xmm10, xmm9, xmm1
顯然,新的指令操作數明顯降低了指令的數量,處理器吞吐量得到了提升,代碼運行更快速,同時能耗也降低了。
X86指令集:不斷進化
CISC指令集的思想就是用復雜的硬件來完成盡可能多的工作,RISC則是使用盡量少的指令并通過復雜的程序來完成同樣的功能。每一代的X86指令集,都會對不同的應用增加新的指令集,這些指令集能高效地處理對應的應用。
Sandy Bridge新加入的AVX指令集讓X86從128位提升到256位向量運算,大幅度提升了性能,此外,AVX精簡了X86指令集的設計,并彌補了破壞性句法的體系缺陷,可以說是一個非常重要的改進。關于Sandy Bridge的微架構就介紹到這里,下回筆者將介紹Sandy Bridge的架構,這部分的變化也非常大,請等繼續分解。