【轉(zhuǎn)】華為麒麟9000s TSV new微架構(gòu)評測(上):如閃電般歸來

【轉(zhuǎn)】華為麒麟9000s TSV new微架構(gòu)評測(上):如閃電般歸來

作者:JamesAslan
喜歡畫畫和攝影的硅工碼農(nóng)(滑稽)
傳說中的胖子
等?
目錄
收起
前言
基準(zhǔn)測試
前端
取指
ICache
供指帶寬
BTB
RAS
BP
IJP
ITLB
后端
流水線寬度
執(zhí)行單元
幕間
前言
4年前鯤鵬920攜TSV110閃亮登場,麒麟990緊隨其后但仍使用了Arm公版微架構(gòu)。我不禁暢想,是不是有一天能在手機(jī)上看到自研CPU微架構(gòu),是不是有一天世界舞臺(tái)上會(huì)多一位apple-level的玩家。然而4年可以發(fā)生太多事情,暮然回首,無論是自己還是世界都已經(jīng)歷了滄海桑田般的巨變。于我而言,TSV new有點(diǎn)像一位“老朋友”。2019年它的坊間傳聞就不脛而走,2020年它的身影出現(xiàn)在了cpu_type.h文件的一隅,2022年的HPCA論文又似乎是它無聲的吶喊。這般若即若離讓我難以捉摸,沒想到素未謀面的重逢竟在一個(gè)尋常的午后。一覺醒來的我不抱希望得點(diǎn)擊Mate60pro的購買按鈕,卻得來全不費(fèi)功夫。輕舟已過萬重山,四年不見,落花時(shí)節(jié)又逢君,歡迎回來。
基準(zhǔn)測試
這部分在先行測試中已經(jīng)涵蓋,可以查閱往期文章:
JamesAslan:麒麟9000s大中核規(guī)格對比、初步性能測試723 贊同 · 134 評論文章

前端
隨著現(xiàn)代程序體量的膨脹,處理器面臨越發(fā)巨大的前端壓力;為了應(yīng)對龐大的程序代碼段帶來的海量跳轉(zhuǎn)指令,高性能處理器的BTB容量、分支預(yù)測器容量不斷擴(kuò)展,相關(guān)算法也在不斷演進(jìn)。
從前的評測文章中,我們并沒有涉及真正意義上的取指寬度(Fetch width)。

該圖中標(biāo)注出的三組流水級寬度實(shí)際上都是Decode寬度的某種體現(xiàn),而非真正從ICache取指的帶寬。在今后的文章中,我們將盡可能測試真正的ICache取指寬度,因此相關(guān)數(shù)據(jù)無法與之前的文章直接比較,望注意。
取指
現(xiàn)代處理器的取指寬度往往大于后續(xù)流水級寬度,更寬的取指級有幾點(diǎn)好處:
現(xiàn)代處理器的分支預(yù)測系統(tǒng)往往存在各種限制,如每周期只能預(yù)測不大于2條分支指令、每周期只能預(yù)測1條taken分支指令等。這就會(huì)導(dǎo)致分支密集指令時(shí),每周期的取指無法達(dá)到預(yù)定數(shù)量就被迫終止,進(jìn)而導(dǎo)致后端指令供給不足;隨著處理器后端的寬度持續(xù)增長,這一問題越發(fā)嚴(yán)重。因此,將取指級盡可能加寬有助于我們在理想工況(分支稀疏)下積攢更多的指令,平衡非理想工況下不足的取指帶寬。
以定長指令集ARM為例,一個(gè)64Byte ICache行能存儲(chǔ)16條4Byte指令。處理器對Cache SRAM的讀取往往以行為單位(對于部分處理器的ICache而言是半行為單位),因此每次讀取行為ICache都會(huì)提供8-16條指令。對ICache的讀取涉及ITLB、Tag、Data SRAM的開關(guān),功耗開銷較大,丟棄額外的指令較為可惜;不如引入Fetch Buffer(Instruction Queue)這一緩沖隊(duì)列,將額外的指令存儲(chǔ)下來。
當(dāng)Instruction Queue滿時(shí),前端可以關(guān)閉,減少功耗。
經(jīng)過測試TSV new的取指級寬度大于11,遠(yuǎn)大于后續(xù)流水級的最窄處(6),超出了我對一款6發(fā)射處理器的預(yù)期。我們暫時(shí)無從得知這一數(shù)字到底落在12-16間的哪一處,但這樣的寬度無疑能輕松滿足目前TSV new的需求;個(gè)人猜測為16,畢竟cache行都已經(jīng)打開了,不取白不取。這也表明這款前端設(shè)計(jì)時(shí)可能考慮了后續(xù)迭代需求,以適應(yīng)未來更寬的微架構(gòu)。作為參考,一些更寬的微架構(gòu)能夠支持每周期16條指令的取指,如Apple Firestorm。
ICache
我們可以通過巧妙而細(xì)致的測試確定ICache的bank粒度。與數(shù)據(jù)側(cè)一樣,ICache也要分bank以滿足取指帶寬需求,因?yàn)榉种D(zhuǎn)的目標(biāo)地址在cache行內(nèi)的位置是我們無法控制的。

TSV new的ICache以半行為粒度分為上下兩個(gè)bank,沒有采用cacheline粒度的地址interleave。從設(shè)計(jì)需求上來看,上下半行獨(dú)立訪問的設(shè)計(jì)已經(jīng)足以應(yīng)對各種正常的跨行取指場景;從樂子人的角度來看,這樣的粒度還是比較粗糙,不如蘋果炫酷。至此,我們也能推斷出TSV new每次取指理論讀取16條指令,而非12條(否則ICache的bank粒度需要更細(xì))。
供指帶寬
程序的執(zhí)行始于取指,處理器前端的指令供給能力至關(guān)重要;一旦前端無法提供足夠的指令,縱使后端的亂序執(zhí)行能力再強(qiáng)也無力回天。對于TSV new這樣的6發(fā)射處理器,我們期望其每周期能夠向后端供給至少6條指令。


TSV new使用了64KB的ICache,大于Arm一般在Cortex A series上慣用的32KB。在整個(gè)64KB區(qū)間內(nèi)TSV new的取指帶寬穩(wěn)定為6,因此沒有明顯的存在mop cache的跡象,至少mop cache沒有被用于提高供指帶寬。mop cache在Arm等定長指令集上存在的意義存疑,可能減配的loop buffer是個(gè)更經(jīng)濟(jì)的選擇。Arm的mop Cache對nop指令進(jìn)行了壓縮優(yōu)化。倘若使用nop指令測試取指,mop cache每周期能夠供給近乎雙倍的指令,表明mop cache中每個(gè)表項(xiàng)可能存儲(chǔ)了兩條nop指令;TSV new沒有配備mop cache自然沒有此類優(yōu)化。當(dāng)指令足跡溢出mop cache后A78的供指帶寬下降到了4條/周期;而TSV new并沒有mop cache且配備了6個(gè)譯碼器,因此沒有此類限制。
TSV new和A78的L2 Cache取指帶寬相較ICache取指帶寬并未嚴(yán)重下滑;不過TSV new在絕對值上保持領(lǐng)先,達(dá)到了>5條/周期,十分優(yōu)秀。作為參考,一些早期處理器上此時(shí)的取指帶寬甚至?xí)陆抵?條/周期。較高的L2 Cache供指帶寬對潛在的服務(wù)器用途十分重要,小小的64KB ICache是不足以應(yīng)對某些code footprint巨大的服務(wù)器負(fù)載的。對于取指而言,TSV new的L2 Cache的有效容量在512KB左右;與Arm一樣,海思有意限制了代碼段可以占據(jù)的L2 Cache容量,指令只能使用一半左右的空間(~512KB)。
當(dāng)代碼段溢出到LLC后,TSV new的取指帶寬下降到了~2.5條/周期,十分優(yōu)秀;A78此時(shí)的帶寬為正好2條/周期。與L2階段不同的是,TSV new似乎允許指令占據(jù)超過一半的LLC空間。總體而言TSV new的取指能力十分優(yōu)秀,比TSV110不知道高到哪里去了。
BTB
對于采用了分離式前端(英文表述:decoupled branch prediction更為準(zhǔn)確)的設(shè)計(jì)而言,BTB是前端的絕對核心組件;其負(fù)責(zé)在譯碼前識(shí)別指令流中的跳轉(zhuǎn)指令并提供相應(yīng)的跳轉(zhuǎn)目標(biāo)地址,頻繁的BTB miss會(huì)造成嚴(yán)重的性能損失。對于沒有采用分離式前端的設(shè)計(jì)而言,BTB也要負(fù)責(zé)盡快給出跳轉(zhuǎn)目標(biāo)地址,減少取指流水線的空泡,保證取指帶寬。


首先我們可以看到非常明顯的L0 BTB和L1 BTB:
TSV new的L0 BTB容量為64項(xiàng),疑似全相聯(lián);與A78項(xiàng)數(shù)一致;沒有每周期2 taken指令的優(yōu)化。
TSV new的L1 BTB容量為1024項(xiàng),組相聯(lián);索引hash留下了一定的死角,在最稀疏的情況下由于hash沖突無法使用全部的L1 BTB容量。
我們換用hash友好的測法重測,此時(shí)L1 BTB的容量更為清晰:

其次,TSV new似乎采用了傳統(tǒng)BTB設(shè)計(jì),而非basic-block設(shè)計(jì)。在L1 BTB中每個(gè)Cache行對應(yīng)的最大分支數(shù)量為8,導(dǎo)致分支最致密的情況下L1 BTB完全失效。
然后,TSV new的行為更符合我個(gè)人眼中的分離式前端設(shè)計(jì),也就意味著其還有巨大的L2 BTB,估算其L2 BTB容量為~6K,可能配備了某種程度的表項(xiàng)壓縮優(yōu)化導(dǎo)致圖像難以辨認(rèn)。這樣的前端配置超越了A78,接近Zen3;但是落后于當(dāng)前的Zen4、RaptorCove、ARM公版一眾新核心。不過相較TSV110而言這是長足的進(jìn)步,也就不難解釋TSV new在verilator負(fù)載中的優(yōu)秀表現(xiàn)了。
最后,BTB方面的遺憾有二。其一是0-bubble BTB的容量偏小,一眾廠商已經(jīng)進(jìn)入1000項(xiàng)時(shí)代。其二是2-taken優(yōu)化缺席,當(dāng)然這一點(diǎn)想要發(fā)揮全部功效還需要潛在的指令融合、loop buffer、后端優(yōu)化等一系列配套措施。
RAS
指令流中的call、return調(diào)用是較為特殊的分支指令情況,其棧形式的特征催生了專門用于預(yù)測此類場景的RAS(Return Address Stack)。簡而言之,call指令壓棧,return指令彈棧;而硬件棧(RAS)結(jié)構(gòu)的深度就影響了處理器在復(fù)雜函數(shù)調(diào)用場景中的性能表現(xiàn)。

TSV new的RAS容量為16項(xiàng)。


當(dāng)RAS溢出時(shí),TSV new在回滾后對棧頂做了一定程度的恢復(fù),行為模式與Arm類似;而icestorm則在回滾后做了其他形式的修正(諸如有效的清空)。
RAS CapacityTSV new16A7616A7716A7816X116A71016Icestorm32Zen432
BP
分支預(yù)測器是當(dāng)代高性能處理器前端中的又一核心組件,負(fù)責(zé)在流水線早期給出分支指令跳轉(zhuǎn)與否的猜測,引導(dǎo)指令流的方向。在推測執(zhí)行的超標(biāo)量處理器中,分支預(yù)測器的準(zhǔn)確率會(huì)極大影響處理器的性能和能效表現(xiàn)。


本測試考察分支預(yù)測器在不同歷史pattern長度、不同分支數(shù)量(需要預(yù)測)情況下的準(zhǔn)確性表現(xiàn)。
與A78相比,TSV new的BP預(yù)測器規(guī)模顯著得大。盡管在追蹤少量長歷史分支時(shí)兩者表現(xiàn)相近,但是隨著需要追蹤的分支指令數(shù)量變多,TSV new就開始占據(jù)優(yōu)勢。在極端情況下TSV new的歷史追蹤能力是A78的兩倍,甚至超過了經(jīng)歷了BP增強(qiáng)的A710。
在分支預(yù)測器失效前,TSV new的分支吞吐都接近2條/周期,較為理想。雖然不能由此確定前端的最大分支吞吐,但是至少后端的2組BRU如預(yù)期工作著,并且似乎大部分情況下都能retire 2條分支指令。
TSV new的預(yù)測器有一定的cascading特征,當(dāng)分支歷史超過一定長度后無論分支數(shù)量是多是少,分支的吞吐量都會(huì)經(jīng)歷一個(gè)可見的下滑;推測此時(shí)主預(yù)測器的過多介入導(dǎo)致了前端空泡增多。當(dāng)然,這并不能說明一定有多個(gè)BP預(yù)測器,也可能是同一預(yù)測器的使用了不同歷史長度的預(yù)測表有不同的介入延遲。
由于目前無法訪問性能計(jì)數(shù)器,TSV new在實(shí)際負(fù)載中的分支預(yù)測表現(xiàn)我們不得而知。實(shí)際負(fù)載中的分支預(yù)測表現(xiàn)其實(shí)更考驗(yàn)corner case的覆蓋和修正,無法直接從規(guī)模推知;但是規(guī)格是表現(xiàn)的基礎(chǔ),TSV new的BP規(guī)格展現(xiàn)了很大的潛力。以X1的BP表現(xiàn)作為參考,TSV new的BP經(jīng)過finetune后也許可以優(yōu)于Goldencove,并在追蹤海量分支指令時(shí)比肩Zen3。這對于一款同時(shí)會(huì)用于server和client的微架構(gòu)無疑是個(gè)好消息。
IJP
IJP(Indirect Jump Predictor)作為BP(Branch Predictor)的一部分,負(fù)責(zé)預(yù)測間接跳轉(zhuǎn)的地址。與預(yù)測跳轉(zhuǎn)與否的BP不同的是,IJP需要在多個(gè)可能的跳轉(zhuǎn)目標(biāo)中選擇本次的跳轉(zhuǎn)目標(biāo),并引導(dǎo)指令流。


首先考察TSV new IJP在不同歷史pattern長度(但是可能目標(biāo)均只有2個(gè))、不同間接跳轉(zhuǎn)數(shù)量(需要預(yù)測)情況下的準(zhǔn)確性表現(xiàn)。與之前測試的眾多Arm核類似,TSV new在32和64條間接跳轉(zhuǎn)指令時(shí)經(jīng)歷了一定程度的性能衰減;但是這種衰減可能并非IJP失效導(dǎo)致的,因?yàn)槠洳]有完全導(dǎo)致分支預(yù)測錯(cuò)誤而回滾,只是增加了延遲。與之前測試的眾多Arm Cortex微架構(gòu)不同的是,2條間接跳轉(zhuǎn)指令時(shí)TSV new IJP內(nèi)部沒有發(fā)生Hash沖突,因此沒有Cortex A series上突兀的意料外性能衰減。從規(guī)模上來看,TSV new的IJP不及A78;無論是少分支長歷史還是多分支短歷史,TSV new的表現(xiàn)均不及A78。


接下來,考察TSV new IJP在不同可能跳轉(zhuǎn)目標(biāo)、不同間接跳轉(zhuǎn)數(shù)量(需要預(yù)測)情況下的準(zhǔn)確性表現(xiàn)。TSV new在32-64條間接跳轉(zhuǎn)指令時(shí)經(jīng)歷了一定程度的性能衰減。其間接跳轉(zhuǎn)預(yù)測器的有效容量約為1024項(xiàng),該規(guī)模小于A78,更不及經(jīng)歷了IJP加強(qiáng)的A710。不過,考慮到日常應(yīng)用中間接跳轉(zhuǎn)指令出現(xiàn)的頻次一般較低,采用克制的IJP規(guī)格合情合理。
ITLB
TLB是現(xiàn)代處理器中容易被忽視的一個(gè)部件,其負(fù)責(zé)虛擬地址至物理地址的翻譯。在一般情況下TLB并不會(huì)成為瓶頸,但是隨著現(xiàn)代程序體量的膨脹,TLB承受的壓力也與日俱增。這一點(diǎn)在服務(wù)器負(fù)載中尤為明顯,因此對于可能用于服務(wù)器用途的TSV new也十分重要。

TSV new的ITLB容量為48項(xiàng),取指時(shí)可以訪問的L2 TLB容量為1024項(xiàng)。值得注意的是,TSV new在2048項(xiàng)有一個(gè)較為明顯的小階躍。
ITLB CapacityL2 TLB(for instruction) CapacityTSV new481024A76321024A77321024A78321024X1481024A710481024
后端
處理器的后端負(fù)責(zé)指令的執(zhí)行,當(dāng)代高性能處理器普遍配備了亂序超標(biāo)量機(jī)制,后端的設(shè)計(jì)也是紛繁復(fù)雜。
流水線寬度
在超標(biāo)量處理器中我們著重關(guān)注前端與mid-core部分的寬度。
流水級寬度Fetch(ICache)16(12+)Fetch(mop Cache)N/ADecode6Rename6
TSV new沒有配備mop cache,這一選擇也是情理之中;畢竟要在Arm ISA上從mop cache中獲得可觀收益,條件會(huì)比X86嚴(yán)苛很多。既然沒有mop cache,那么保障供指帶寬的重任就全部壓在了ICache之上;理想情況下TSV new的ICache每周期能夠向Instruction Queue(anyway,各家的名稱不同,或者叫Fetch Buffer balabala)填入16條指令,對于一款6發(fā)射處理器而言是綽綽有余了。
無論是出于補(bǔ)齊產(chǎn)品線還是穩(wěn)扎穩(wěn)打磨礪團(tuán)隊(duì)的目的,似乎大部分設(shè)計(jì)公司總會(huì)經(jīng)歷這樣一條由4發(fā)射到6發(fā)射再到更高更遠(yuǎn)的路徑,TSV110和TSV new就分別處于上述的兩個(gè)關(guān)鍵節(jié)點(diǎn)上,TSV new的6發(fā)射設(shè)計(jì)可謂意料之中。4-6發(fā)射的甜點(diǎn)寬度直到如今仍然是高性能處理器市場的絕對主流,TSV new的寬度配置適中,可以預(yù)見后續(xù)會(huì)有許多基于它的迭代改進(jìn)。
執(zhí)行單元
執(zhí)行部件數(shù)量延遲ALU41BRU2
MUL23DIV117(支持提前退出)AGU(ld+st)4
AGU(ld)2
AGU(st)2
FPU4
FADD42FMUL43FDIV1?7-8FMA44
TSV new相較TSV110在整數(shù)端增加了一組ALU和一組MUL,MUL延遲由4周期下降至3周期,但是仍然有下降空間。TSV new配備了2組BRU,在密集跳轉(zhuǎn)應(yīng)用中能夠保證后端吞吐量,符合現(xiàn)代應(yīng)用程序發(fā)展的趨勢。乘除法單元上TSV new選擇了非對稱配置,由于除法指令使用較少這一選擇是合理的。除法器支持提前退出,當(dāng)被除數(shù)變?yōu)?時(shí)算法可以立即結(jié)束。
相較TSV110,TSV new的理論訪存能力大幅提升。一方面,TSV new采用了Intel式的全分離式AGU設(shè)計(jì),與使用了1個(gè)load/store AGU+load AGU的TSV110相比,理論峰值帶寬翻倍。但是與Arm公版相比時(shí)情況就較為復(fù)雜。以A78為例,其3個(gè)AGU中2個(gè)支持load/store操作,1個(gè)只支持load操作;因此A78的峰值load能力是更強(qiáng)的(此處我們不考慮DCache通路寬度,僅針對能夠操作地址的數(shù)量),但是在某些比例的load、store混合流中帶寬又會(huì)低于TSV new,這就是取舍的藝術(shù)了。需要指出的是,分離式AGU相較共享AGU會(huì)顯著增加發(fā)射隊(duì)列、物理寄存器堆的設(shè)計(jì)復(fù)雜度,同時(shí)LDQ和STQ的設(shè)計(jì)也會(huì)相應(yīng)更為復(fù)雜。對于一款6發(fā)射處理器而言,這樣的訪存單元配置較為合理,但也談不上豪華;可以預(yù)見在不久的將來TSV new new也會(huì)擁有第三個(gè)load AGU。
TSV new的浮點(diǎn)側(cè)相較TSV110有了史詩級提升,其配備了四組FPU,基本完全對稱。數(shù)量翻倍的同時(shí),各類指令的延遲終于降低至了正常水平。不過需要注意的是,不同運(yùn)行中得到的FMA、FADD單元數(shù)量結(jié)果不一致,個(gè)人推測有一些可能:
浮點(diǎn)寄存器堆有讀端口爭搶和寫端口爭搶,且由某些簡單規(guī)則定義的;某些序列會(huì)讓分配算法卡入corner case導(dǎo)致帶寬下降,這算是一種bug?
浮點(diǎn)寄存器堆有分block處理,由重命名階段控制block分配,某些序列會(huì)讓分配算法卡入corner case導(dǎo)致帶寬下降,這也算是一種bug?
總體而言TSV new的后端執(zhí)行單元配置較為均衡和傳統(tǒng),符合我們對一款現(xiàn)代6發(fā)射處理器的期待。
幕間
在下篇中我們將對Mid-core、訪存子系統(tǒng)、核外系統(tǒng)進(jìn)行逆向探究。最近事情真是好多啊23333,個(gè)人精力實(shí)在有限,能做這件事的時(shí)間無法預(yù)計(jì)(潛在的咕咕咕預(yù)告)。
分析與測試:lyz、lxy
發(fā)布于 2023-09-10 18:53?IP 屬地北京
華為
麒麟9000s
中央處理器 (CPU)