在過去的一個月里,AMD發(fā)布了許多公告。AMD正在準(zhǔn)備推出他們的第三代Ryzen臺式機處理器。這些處理器將利用AMD最新的微架構(gòu)Zen 2,采用臺積電領(lǐng)先的7nm工藝制造。
我們先來看看核心的微架構(gòu)改進(jìn)。
Zen 2
新芯片的核心是Zen 2。這一核心將用于AMD的移動APU、高性能臺式機處理器和數(shù)據(jù)中心芯片。
Zen 2是繼Zen之后的下一個主要微架構(gòu)。隨著Zen 2的推出,AMD承諾分別基于Cinebench 1T和Spec2006進(jìn)行13-15%的IPC改進(jìn)。要了解他們?nèi)绾文軌蛱崛PC的收益,我們需要仔細(xì)研究基礎(chǔ)微架構(gòu)的變化。
前端
前端的很大一部分已經(jīng)進(jìn)行了重新設(shè)計。在沒有標(biāo)識分支的典型情況下,從下一個64B塊的地址開始從第一級高速緩存提取指令。Zen最初提供了一個64 KiB L1緩存。它由4路256組(4 ways of 256 sets)組成。Zen 2對L1進(jìn)行了大改。關(guān)聯(lián)性已經(jīng)變?yōu)?路64組(8 ways of 64 sets),緩存大小減半到32 KiB。如果沒有AMD的更多細(xì)節(jié),我們很難描述其他變化,更高的關(guān)聯(lián)性也應(yīng)該降低未命中率。AMD指出,通過減小指令緩存的大小,并利用該區(qū)域來增加一些其他組件,特別是BPU和OC,它們能夠從每單位面積的硅中獲得更好的性能。順便說一下,從組織的角度來看,Zen 2現(xiàn)在和英特爾的Skylake和Sunny Cove是一樣的。值得注意的是,一級指令高速緩存轉(zhuǎn)換后備緩沖區(qū)保持不變。它仍然是完全關(guān)聯(lián)的64條目深度緩沖區(qū),能夠存儲4 KiB、2 MIB和1 GiB頁面。
高速緩存線保持64字節(jié),每個周期可以獲取32個字節(jié)。在不太常見的高速緩存未命中的情況下,L1將為包含未命中地址的線生成填充請求。每個周期最多32個字節(jié)可以從共享L2傳輸?shù)街噶罡咚倬彺妗?/p>
除了由提取生成的填充請求外,分支預(yù)測器和預(yù)提取器還可以發(fā)出額外的請求。這一點很重要,因為預(yù)取器能夠利用空間局部性以避免停頓。這是AMD花了很多努力改進(jìn)的另一個領(lǐng)域。
最好的預(yù)測器會贏嗎?
分支預(yù)測單元的目標(biāo)是預(yù)測條件分支的下一個地址。換句話說,猜測它是否被占用了。這里的基本思想是猜測指令流的路徑,而不是通過停止流水線直到最終知道路徑來浪費周期。然而,這必須明智地進(jìn)行,因為糟糕的預(yù)測會直接導(dǎo)致工作的浪費。當(dāng)發(fā)生分支時,將其存儲在分支目標(biāo)緩沖區(qū)中,以便可以更容易地確定和采用(或不采用)后續(xù)分支。諸如Zen之類的現(xiàn)代微處理器通過不僅將最后一個分支的歷史而是最后幾個分支的歷史存儲在全局歷史寄存器(GHR)中,以便提取分支之間的相關(guān)性(例如,如果采用較早的分支,則可能也將采用下一個分支),從而進(jìn)一步實現(xiàn)這一點。
Zen上的BTB是一個三級緩存——每個緩存都具有更高的容量,但代價是更長的延遲。Zen 2保持結(jié)構(gòu)不變,但幾乎將第二級和第三級BTB中的條目數(shù)量增加了一倍,分別從256和4K增加到512和7K條目。
順便說一句,在Zen中,第一級(L0)BTB中的查找是零延遲查找,而L1和L2 BTB中的后續(xù)表查找分別導(dǎo)致一個和四個冒泡。目前還不清楚Zen 2是否改變了這些成本。
Zen采用了一種稱為散列感知器的動態(tài)預(yù)測器。利用人工智能的大肆宣傳,營銷人員喜歡將其稱為神經(jīng)網(wǎng)絡(luò)預(yù)測器。感知器是最簡單的機器學(xué)習(xí)形式,與其他一些機器學(xué)習(xí)算法相比,感知器本身更易于實現(xiàn)硬件。它們往往也比gshare之類的預(yù)測器更準(zhǔn)確,但它們的實現(xiàn)確實更復(fù)雜。Zen上的實際實現(xiàn)尚不清楚,但我們至少可以描述一個簡單的實現(xiàn)是什么樣子的。當(dāng)處理器遇到條件分支時,它的地址用于從感知器表中獲取感知器。對于我們來說,感知器只不過是權(quán)重向量。這些權(quán)重表示歷史分支的結(jié)果與預(yù)測的分支之間的相關(guān)性。例如,考慮以下三種模式:“TTN”、“NTN”和“NNN”。如果這三個模式都導(dǎo)致下一個分支沒被采用,那么或許我們可以說前兩個分支之間沒有相關(guān)性,并為它們分配很小的權(quán)重。先前分支的結(jié)果是從全局歷史寄存器中獲取的。寄存器中的各個位用作輸入。輸出值是計算出的權(quán)重和先前分支歷史的點積。在這種情況下,負(fù)輸出可能意味著“不采取”,而其他值可能被預(yù)測為“采取”。值得一提的是,分支歷史之外的其他輸入也可以用于推理相關(guān)性,盡管不知道是否有現(xiàn)實世界的實現(xiàn)利用了這一想法。Zen的實現(xiàn)可能要復(fù)雜得多,或許是對不同類型的歷史進(jìn)行采樣。盡管如此,它的工作方式仍然是一樣的。
鑒于Zen流水線的長度和寬度,錯誤的預(yù)測可能導(dǎo)致超過100個槽被刷新。這直接導(dǎo)致性能的損失。Zen 2保留了散列感知器預(yù)測器,但增加了第二層新的TAGE預(yù)測器。這個預(yù)測器是由Andre Seznec在2006年首次提出的,它是對Michaud的PPM類預(yù)測器的改進(jìn)。TAGE預(yù)報器贏得了上一屆分支預(yù)測(CBP)大賽(2006-2016)的全部四項冠軍。TAGE的理念是,程序中的不同分支需要不同的歷史長度。換句話說,對于某些分支,非常小的歷史記錄效果最好。例如1位預(yù)測器:如果某一分支以前采用過,它將再次采用。不同的分支可能依賴于先前的分支,因此需要更長的多位歷史以充分預(yù)測它是否將被采用。標(biāo)記幾何歷史長度(TAGE)預(yù)測器由多個全局歷史表組成,這些表使用不同長度的全局歷史寄存器索引,以便涵蓋所有這些情況。寄存器使用的長度形成了幾何級數(shù),因此得名。
使用TAGE預(yù)測器的想法是,它試圖找出哪個分支的歷史數(shù)量最適合哪個分支,將最長的歷史優(yōu)先于較短的歷史。
這種多預(yù)測器方案類似于分支目標(biāo)緩沖區(qū)的分層。第一級預(yù)測器是感知器,用于快速查找(例如,單周期分辨率)。第二級TAGE預(yù)測器是一個復(fù)雜的預(yù)測器,需要很多周期才能完成,因此必須在簡單預(yù)測器之上分層。換句話說,L2預(yù)測器速度較慢,但更好,因此用于對較快和較不準(zhǔn)確預(yù)測器的結(jié)果進(jìn)行雙重檢查。如果L2預(yù)測器與L1預(yù)測器不同,則當(dāng)TAGE預(yù)測器覆蓋感知器預(yù)測器時,會發(fā)生少量刷新,提取返回并使用L2預(yù)測,因為L2預(yù)測器被認(rèn)為是更準(zhǔn)確的預(yù)測。
除了使用TAGE預(yù)測器以外,AMD沒有透露更多的內(nèi)容。值得指出的是,至少就字面而言,TAGE預(yù)測器不再被認(rèn)為是最好的預(yù)測器。之后,Seznec在TAGE預(yù)測器上進(jìn)行了改進(jìn),增加了統(tǒng)計校正器(TAGE-SC),后來又增加了循環(huán)預(yù)測器(TAGE-SC-L)。替代方案包括BATAGE預(yù)測器。盡管如此,我們得到的結(jié)論是,有更多的機會找到更好的分支預(yù)測器,這是一個非常活躍的研究領(lǐng)域。
AMD表示,與之前的感知器相比,新的分支預(yù)測單元顯示出的誤預(yù)測率目標(biāo)低30%。因為現(xiàn)代微處理器的精確度高達(dá)90%。與在Zen中的實現(xiàn)相比,這種錯誤預(yù)測率的大幅降低將直接轉(zhuǎn)化為更高的IPC。事實上,如此大的改進(jìn)可以單獨占據(jù)Zen 2聲稱的性能提升的很大一部分。
改變現(xiàn)狀
關(guān)于AMD的這一代芯片,我們注意到的一件事是現(xiàn)狀的變化。從歷史上看,英特爾在設(shè)計最先進(jìn)、性能最高的預(yù)測器方面投入了大量資源。另一方面,AMD往往落后于一個“足夠好”的更保守的預(yù)測器。隨著Zen的成功,Zen 2的情況變得有所不同。雖然AMD正在摘取所有唾手可得的成果,但它們現(xiàn)在正直接瞄準(zhǔn)英特爾,而英特爾一直擁有無可爭辯的領(lǐng)先優(yōu)勢。換句話說,AMD似乎對他們目前的核心設(shè)計充滿信心,可以騰出更多的資源來解決次要的缺陷。