上文中筆者介紹了Nehalem微架構(gòu)中存在的一些問(wèn)題,到了Sandy Bridge這一代,這些問(wèn)題還存在嗎?下面我們就來(lái)詳細(xì)解析Sandy Bridge的微架構(gòu),并介紹相對(duì)于Nehalem微架構(gòu)的改進(jìn)。
前端:
分支預(yù)測(cè)和微指令緩存
分支預(yù)測(cè)、指令拾取、預(yù)解碼以及解碼這幾個(gè)部件組成了處理器微架構(gòu)的Front-End前端部分。在Nehalem 微架構(gòu)中,指令拾取和預(yù)解碼存在問(wèn)題,在一些情況下會(huì)導(dǎo)致指令吞吐量過(guò)低,因此其前端是整個(gè)流水線當(dāng)中最容易成為瓶頸的階段。Sandy Bridge沒(méi)有直接在指令拾取和預(yù)解碼階段進(jìn)行改動(dòng),而是對(duì)整個(gè)前端部分進(jìn)行了重新設(shè)計(jì),通過(guò)革新的分支預(yù)測(cè)單元以及在解碼階段加入一個(gè)新的部件來(lái)增強(qiáng)整個(gè)前端部分的輸出能力,同樣達(dá)到了消除瓶頸的目的。
處理器的前端從L1 I-Cache拾取指令,在指令拾取單元沒(méi)有什么變化的情況下,Sandy Bridge的L1 I-Cache也有了些改進(jìn),提升了大型應(yīng)用程序下的性能。首先,它從Nehalem的4路組關(guān)聯(lián)提升到了8路組關(guān)聯(lián),從而降低了Cache Line碰撞的幾率,降低了頁(yè)面沖突;其次,L1 I-Cache對(duì)應(yīng)的L1 ITLB也略微擴(kuò)大,2M/4MB對(duì)應(yīng)的TLB表項(xiàng)從Nehalem的7+7提升到了8+8(對(duì)每一個(gè)硬件線程提供8個(gè)表項(xiàng)),可以覆蓋更大的代碼地址空間。
分支預(yù)測(cè)是一個(gè)既能提升性能又能降低能耗的做法,成功的分支預(yù)測(cè)可以避免無(wú)謂分支代碼執(zhí)行的性能、功耗損失。Sandy Bridge的分支預(yù)測(cè)單元在Nehalem的基礎(chǔ)上進(jìn)行了完全的重造。通過(guò)對(duì)分支表結(jié)構(gòu)的壓縮定義,BTB(Branch Target Buffer,分支目標(biāo)緩存)在同樣容量下將保存的分支目標(biāo)翻番,同樣,GBH(Global Branch History,全局分支歷史表)也能保存更多、更深的項(xiàng)目,總的來(lái)說(shuō),分支預(yù)測(cè)準(zhǔn)確率將會(huì)進(jìn)一步提升。
前端變化中作用更明顯的解碼器旁邊加入的uop cache(微指令緩存),這個(gè)部件和NetBurst微架構(gòu)的Trace Cache作用非常相似,不過(guò)卻是經(jīng)過(guò)了更多的調(diào)整和優(yōu)化,并且更加簡(jiǎn)潔。uop cache保存了已經(jīng)解碼的微指令,并且更加接近處理器的后端,因此也可以被稱(chēng)為L(zhǎng)0 I-Cache。根據(jù)英特爾的說(shuō)法,通常的應(yīng)用當(dāng)中其命中率可以達(dá)到80%,在命中這個(gè)緩存之后,包括復(fù)雜的解碼器在內(nèi)的其它前端部件可以關(guān)閉以節(jié)約能源,而由uop cache本身輸出指令。這個(gè)設(shè)計(jì)可以很明顯地降指令拾取低延遲乃至分支懲罰,讓前端可以在更多的時(shí)間內(nèi)處于持續(xù)輸出4 uop/cycle的狀態(tài),這很大程度消除了Nehalem前端的瓶頸。
后端:
物理寄存器文件架構(gòu)
Front-End前端緊接著的是Back-End后端部分,Sandy Bridge在后端部分也有了很大的變化,其中一個(gè)變化來(lái)自于寄存器文件的變遷。在之前,我們介紹了Nehalem微架構(gòu)采用的RRF(Retirement Register File,回退寄存器文件)存在的會(huì)導(dǎo)致寄存器讀停頓的問(wèn)題,Sandy Bridge通過(guò)采用了PRF(Physical Register File,物理寄存器文件)結(jié)構(gòu)來(lái)消除了這個(gè)問(wèn)題,和前面的uop cache一樣,PRF的設(shè)計(jì)也是從NetBurst架構(gòu)借鑒而來(lái)。幾乎所有的高性能處理器都采用了PRF的方式。
在Nehalem微架構(gòu)當(dāng)中,ROB(ReOrder Buffer,重排序緩存)順序保存了所有uop及其所有的重命名寄存器的數(shù)據(jù)和狀態(tài),架構(gòu)寄存器則保存在RRF當(dāng)中。在Sandy Bridge的PRF上,ROB不再保存重命名寄存器的數(shù)據(jù),取而代之的是保存多個(gè)指向PRF的指針,架構(gòu)寄存器包含在RRF當(dāng)中,通過(guò)狀態(tài)位來(lái)標(biāo)識(shí)。
物理寄存器文件有什么好處?首先,它消除了舊有的寄存器讀停頓造成的瓶頸,現(xiàn)在它不再受限于RRF三個(gè)讀取端口的限制,所有不同寄存器的內(nèi)容都可以同時(shí)進(jìn)行讀取,不會(huì)再引起流水線停頓。其次,物理寄存器文件消除了寄存器間數(shù)據(jù)的復(fù)制和移動(dòng),而只需要更改指針的指向即可,這節(jié)約了大量的數(shù)據(jù)移動(dòng)能耗,特別是在Sandy Bridge的AVX指令集支持更多的操作數(shù)以及支持的最大寄存器寬度翻倍的情況下。最后,ROB從保存數(shù)據(jù)變成保存指針導(dǎo)致了結(jié)構(gòu)上的簡(jiǎn)化,從而增大了ROB的容量,進(jìn)一步提升了處理器亂序執(zhí)行的性能。
Sandy Bridge的ROB從Nehalem的128項(xiàng)提升到了168項(xiàng),PRF物理寄存器文件包含了兩個(gè)部分:每項(xiàng)64bit 、一共160項(xiàng)目的整數(shù)寄存器文件和每項(xiàng)256bit 、一共144項(xiàng)目的浮點(diǎn)寄存器文件,并且PRF是每個(gè)硬件線程各自一份。在Sandy Bridge架構(gòu)當(dāng)中,還增加了一個(gè)硬件監(jiān)測(cè)機(jī)構(gòu),在使用SAVE/RESTORE指令進(jìn)行線程切換或者虛擬機(jī)切換的時(shí)候,可以?xún)H僅恢復(fù)/保存線程所使用到的寄存器,而不是恢復(fù)/保存所有的架構(gòu)寄存器,從而節(jié)約了上下文切換的時(shí)間,這可以提升處理器運(yùn)行大量線程和多個(gè)虛擬機(jī)的能力。
后端:
存取單元
微指令經(jīng)過(guò)重命名階段和讀取PRF數(shù)據(jù)之后進(jìn)入Reservation Station保留站,通過(guò)統(tǒng)一的調(diào)度器安排發(fā)射到6個(gè)不同的執(zhí)行單元之中。Sandy Bridge的Reservation Station容量從Nehalem的36項(xiàng)目提升到了54項(xiàng)目,增加了50%,亂序執(zhí)行窗口的擴(kuò)大可以提升處理器的亂序執(zhí)行能力。
Sandy Bridge的執(zhí)行單元也有了很大的改進(jìn)。執(zhí)行單元包括計(jì)算單元以及存取單元,這兩個(gè)都變化甚大,不過(guò)這里我們先介紹存取單元的變化,因?yàn)橹敖榻B過(guò)Nehalem 微架構(gòu)在這方面是個(gè)潛在的瓶頸。計(jì)算單元的改進(jìn)留到下一篇文章中再介紹。
Sandy Bridge架構(gòu)和Nehalem一樣具有3個(gè)存取端口,Store端口維持不變而Load端口的數(shù)量提升到了兩個(gè),并且這兩個(gè)Load端口的AGU地址生成單元均能生成Store操作使用的地址。Load端口翻番在某種程度上是為了適應(yīng)Sandy Bridge 處理器新增的AVX指令集帶來(lái)的256位計(jì)算能力,因?yàn)槊總€(gè)Load端口的寬度是128位。然而,現(xiàn)有的各種應(yīng)用也可以立即從中獲益,因?yàn)镹ehalem微架構(gòu)的Load端口僅占所有執(zhí)行單口的1/6,而Load操作通??梢哉紦?jù)uop當(dāng)中的約1/3。Sandy Bridge的雙Load端口可以每個(gè)時(shí)鐘周期進(jìn)行兩個(gè)128位Load操作,消除了上一代的瓶頸,工作起來(lái)也更為靈活。
和Load/Store單元連接的MOB(Memory Ordering Buffer,內(nèi)存排序緩存)也得到了增強(qiáng),MOB和前面的ROB一起屬于將亂序執(zhí)行和順序回退連接起來(lái)的重要部件。在MOB當(dāng)中,Load緩存從Nehalem的48項(xiàng)目提升到了64項(xiàng)目,提升幅度為33%,Store緩存從32項(xiàng)目略微提升到了36項(xiàng)目。Sandy Bridge的MOB一共可以容納100個(gè)訪存操作,這些數(shù)據(jù)操作均為256位寬度。
和Load能力翻倍配對(duì)的是L1 D-Cache的增強(qiáng),它的帶寬提升到了48字節(jié),也就是384位,比以往的32字節(jié)提升了50%,以同時(shí)支持兩個(gè)128位的Load和一個(gè)128位的Store操作。搭配的L1 DTLB據(jù)說(shuō)也有所改進(jìn),增加了4個(gè)支持1GB頁(yè)面的項(xiàng)目,以進(jìn)一部消除Nehalem微架構(gòu)在面對(duì)海量?jī)?nèi)存應(yīng)用下的性能問(wèn)題,這4個(gè)大頁(yè)面DTLB項(xiàng)目應(yīng)該是全關(guān)聯(lián)的,其它的L1 DTLB則應(yīng)該維持4路關(guān)聯(lián)不變。
在L2 Cache方面,Sandy Bridge相對(duì)Nehalem沒(méi)有太大的變化。
可以看到,通過(guò)將Nehalem 微架構(gòu)和NetBurst微架構(gòu)進(jìn)行融合,引入NetBurst上的微指令緩存和物理寄存器文件架構(gòu),并改進(jìn)Load/Store單元和L1 D-Cache帶寬設(shè)計(jì),Sandy Bridge消除了上一代Nehalem微架構(gòu)存在的比較明顯的三個(gè)瓶頸,還順帶獲得了更多的附加增益。Sandy Bridge在整個(gè)流水線的方方面面都得到了改進(jìn),然而還有一個(gè)很重要的部分沒(méi)有被提及:運(yùn)算單元,這個(gè)部分的變化和Sandy Bridge引入的AVX指令集緊密聯(lián)系,請(qǐng)看下回繼續(xù)分解。