AMD YES是近年來比較火的一句話,,每當(dāng)EETOP發(fā)布關(guān)于AMD的相關(guān)文章,也總會(huì)收到網(wǎng)友的AMD YES!的留言,。從字面翻譯過來就是AMD真好,,AMD真香的意思。AMD YES實(shí)際上表示了AMD近幾年來逐漸走向成功,,也得到了大家的認(rèn)可,。
那么為什么AMD 能達(dá)到今天的高度?最主要的功臣應(yīng)當(dāng)歸功于AMD Zen架構(gòu)的成功,。今天我們就為大家扒一扒AMD Zen 成功背后不為人知的故事,。
以下內(nèi)容來自中國(guó)臺(tái)灣科技新報(bào)的專欄作者:癡漢水球的文章。
正文:
自從2017 年AMD 準(zhǔn)時(shí)推出「技術(shù)規(guī)格看起來稍微正常點(diǎn)」的Zen 微架構(gòu)CPU 后,,總算脫身逃離了2011 年以來推土機(jī)(Bulldozer)家族4 年工地秀的泥沼,,回到跟英特爾正面對(duì)決互毆的擂臺(tái),而2019 年7 納米制程的Zen 2,,在英特爾2015 年后就擠牙膏擠到青黃不接的當(dāng)下,,更讓AMD「稍微」重現(xiàn)了十多年前K8 時(shí)代的輝煌。這些各位讀者都很熟悉的故事,,就無需浪費(fèi)篇幅錦上添花──即使背后充滿看不見的波濤,。
俗語(yǔ)說得好,失敗為成功之母,,任何成功都建立在一路累積的基礎(chǔ)上,,AMD 亦不能免俗,讓 Zen 成功的一切條件,,無不是奠基于過往的遺產(chǎn)與教訓(xùn),。我們就由遠(yuǎn)到近,一步步抽絲剝繭,,重新踏上這條 AMD 走了25 年的漫漫長(zhǎng)路,。
Zen 才是真正的 K10
AMD CPU 代號(hào)的 K 源自「(IntelPentium)Killer」,,眾人皆知的 AMD 高效能 x86 CPU 演進(jìn)如下(不包含小核心 Bobcat 體系):
K5(1996):由超標(biāo)量(Superscalar)架構(gòu)大師Mike Johnson親自操刀的「Pentium Killer」,但英特爾并未開誠(chéng)布公的公開Pentium新增指令細(xì)節(jié),,為了確保與100%跟Pentium相容,,逆向工程搞了很久,上市日期一再推后,,讓癡癡等待的Compaq等的“花兒也謝了”,。K6(1997):直接購(gòu)并NexGen,修改現(xiàn)成的Nx686,,取消類似Pentium Pro的L2 Cache專用總線,,到內(nèi)建L2 Cache的K6-2+和K6-III才算大功告成,但已時(shí)不我與,。K7(1998):出身DEC Alpha團(tuán)隊(duì)的Dirk Meyer變成的「x86世界的Alpha 21264」,,AMD首次能與英特爾全面性較量效能。K8(2003):Fred Weber主導(dǎo)的K7強(qiáng)化版+x86-64+服務(wù)器等級(jí)的RAS(Reliability, Availability and Serviceability)+HyperTransport+整合型存儲(chǔ)器控制器,,讓AMD悲愿成就,,一舉攻入高獲利的企業(yè)服務(wù)器市場(chǎng)。K9:英文發(fā)音近似「狗」(Caine),,太過負(fù)面,,因此沒這個(gè)代號(hào)。K10(2007):4~6核K8強(qiáng)化版+整合式L3 Cache存儲(chǔ)器,,AMD開始「包水餃」兩顆打一顆,,也逐漸無力抵抗英特爾小步快跑的鐘擺(Tick Tock)攻勢(shì)。K11(2011):由IBM Power4的總工程師Chuck Moore操刀,,接連四代被英特爾鐘擺痛扁的「推土機(jī)」(Bulldozer)家族,,叢集式多執(zhí)行緒(CMT)和模組化浮點(diǎn)運(yùn)算器暗藏了AMD對(duì)Fusion大戰(zhàn)略的熊熊野心與對(duì)未來GPGPU局勢(shì)的離譜誤判。K12(預(yù)定2017):從頭到尾搞笑的「全新高效能64位元ARM處理器」,,還沒開始就結(jié)束了,,只活在簡(jiǎn)報(bào)里,無愧當(dāng)時(shí)「簡(jiǎn)報(bào)王」名號(hào),。Zen(2017):深度流水線,、追求高時(shí)鐘頻率、同時(shí)多執(zhí)行緒(SMT),,根本是Andy Glew原先的K10原案投胎轉(zhuǎn)世,。
總之,嚴(yán)格說來,,Zen 才是「真正的 K10」,。這句話你可以仔細(xì)再看一次,我會(huì)等你。
1990 年代初期創(chuàng)造英特爾革命性P6 微架構(gòu)5 位總工程師之一的Andy Glew,,對(duì)英特爾內(nèi)部提議代號(hào)「Yamhill」的64 位元x86 指令集被拒絕,,2002 年跳槽到AMD 參與x86-64指令集的制定工作,并短暫擔(dān)任K10 總工程師,。為何說「短暫」,?他老兄原本提案的K10 是類似英特爾NetBurst 的設(shè)計(jì):深度流水線、追求高時(shí)鐘頻率,、未犧牲執(zhí)行單元寬度、同時(shí)多執(zhí)行緒(SMT),,然后就又被打槍了,,只是這次動(dòng)手的換成AMD 高層。
他老兄一不爽,,又在2004 年跳回前東家英特爾,,但恐怕運(yùn)氣一直不太好,加入因太過「史詩(shī)級(jí)災(zāi)難」(單核心晶粒面積213mm? 幾乎是Prescott 兩倍,,TDP 又超過150W上看166W)而慘遭腰斬的Tejas 開發(fā)案,。2009 年再度離開英特爾,歷經(jīng) MIPS 和 nVidia,。瞧瞧LinkedIn 的個(gè)人介紹,,現(xiàn)在正待在搞 RISC-V 的SiFive。
為何真正的 K10 會(huì)沉寂這么久才浮上臺(tái)面,?這跟 AMD 研發(fā)能量明顯遠(yuǎn)不及英特爾,、難以承擔(dān)精密復(fù)雜的微架構(gòu)有很大關(guān)系,一顆當(dāng)兩顆用的SMT 并不是便于開發(fā)驗(yàn)證的東西,。據(jù) AMD 在 1998 年申請(qǐng)的幾份專利文件,,原始K8 有兩版,共同點(diǎn)只有一個(gè):兩個(gè)簡(jiǎn)單的「外寬內(nèi)窄」小核心,,明眼人腦中應(yīng)該馬上浮現(xiàn)推土機(jī)的雛型了,。
但AMD 大概是靠K7 和K8 日子過太爽了,遑論K8 讓AMD 大舉入侵高利潤(rùn),、市場(chǎng)動(dòng)量又很持久(意思是產(chǎn)品暫時(shí)輸人,,也不會(huì)很快被趕出來)的服務(wù)器市場(chǎng), 「先講求不傷身體,,再講求效果」的維穩(wěn)心態(tài)作祟,,或在2006 年7 月耗費(fèi)54 億美元購(gòu)并ATI 這件事,燒了太多錢,,不得不節(jié)約研發(fā)經(jīng)費(fèi),,遲遲不見全新后繼接班人。
此外,AMD 融合 CPU 和 GPU 的「Fusion 大戰(zhàn)略」(The Future Is Fusion)也影響了 CPU 發(fā)展策略,。AMD 過度樂觀預(yù)期GPU 的泛用化進(jìn)程,,認(rèn)定假以時(shí)日GPU 將可取代CPU 的浮點(diǎn)或部分SIMD整數(shù)運(yùn)算,讓推土機(jī)變成依附Fusion 的附庸,,擺明當(dāng)「天時(shí),、地利、人和」三者兼?zhèn)鋾r(shí),,直接用GPU 換掉兩個(gè)簡(jiǎn)單整數(shù)運(yùn)算核心共用的浮點(diǎn)運(yùn)算器,。
不過推土機(jī)在商業(yè)競(jìng)爭(zhēng)失敗,并不代表對(duì)之后Zen 的成功毫無貢獻(xiàn),,除了讓AMD 得到足夠「不能亂搞流水線前端」的教訓(xùn),,讓分支預(yù)測(cè)與指令流水線拖鉤的解耦式分支預(yù)測(cè)器( Decoupled Branch Predicator)是支撐Zen 效能競(jìng)爭(zhēng)力的一大功臣,甚至是Zen 2 可實(shí)做「機(jī)器學(xué)習(xí)分支預(yù)測(cè)器」的地基,。各位別急,,后面會(huì)提到。
反過來利用晶圓代工商業(yè)模式來提高晶體管密度與生產(chǎn)良率
AMD 創(chuàng)辦人 Jerry Sanders 有一句名言「有晶圓廠才是真男人」(Real men have fabs),,在今日真是莫大的諷刺,。
雖然像英特爾和昔日AMD 的高度垂直整合IDM(Integrated Design and Manufacture)商業(yè)模式,可確保設(shè)計(jì)和制程彼此最佳化,,但在追求Time To Market 的世界,,專業(yè)的無晶圓廠IC 設(shè)計(jì)公司(Fabless IC Design House)、IP 授權(quán)提供者,、電子輔助設(shè)計(jì)工具(EDA Tool)與晶圓代工業(yè)者(Foundry)的高度分工,,卻更能藉由成熟的「研發(fā)供應(yīng)鏈」互通有無,沿用早被諸多客戶千錘百煉的晶圓廠制程參數(shù),、現(xiàn)有IP 功能模組和函式庫(kù),,迅速完成產(chǎn)品的開發(fā)與驗(yàn)證,并縮短時(shí)程降低成本,。
SPARC 兩位要角之一的Fujitsu,,會(huì)在新世代HPC 產(chǎn)品A64FX 轉(zhuǎn)向ARM 并交由臺(tái)積電7 納米制程代工,其因在此,,光曾被蘋果和眾多客戶「嚴(yán)刑拷打」的寶貴經(jīng)驗(yàn),,對(duì)盡快搞定產(chǎn)品絕對(duì)是重中之重的無價(jià)之寶。
這件事也發(fā)生在放棄自有晶圓廠的 AMD,。K11 時(shí)代,,AMD 反過來利用晶圓代工生產(chǎn)GPU 的高密度函式庫(kù)和自動(dòng)化設(shè)計(jì)工具,砍掉多達(dá)30% 的CPU 芯片面積與耗電量,,特別是過往「動(dòng)用大量人力手工布線才能電路最佳化」的功能單元,,如復(fù)雜的浮點(diǎn)運(yùn)算器。「GPU 的電路設(shè)計(jì)最佳化程度優(yōu)于 CPU」這檔事,,在21 世紀(jì)初期的 AMD 連想都不敢想,。
這些經(jīng)驗(yàn)和努力,對(duì) Zen 的成功絕對(duì)舉足輕重,。就商業(yè)角度來看,,這也讓AMD 未來保有開發(fā)新型商業(yè)模式的彈性,中國(guó)中科海光(Hygon)的Dhyana 就是采用授權(quán)的Zen 核心,,當(dāng)然美國(guó)政府愿意「樂觀其成」那又是另一回事了,。
「RISC86」與4 道 x86 指令解碼的先行者
將指令格式與定址模式復(fù)雜到讓人頭痛的x86 指令,在指令解碼階段「轉(zhuǎn)譯」成一至數(shù)個(gè)固定長(zhǎng)度,、格式簡(jiǎn)潔的「類RISC」微指令(Microinstruciton),,以簡(jiǎn)化處理器執(zhí)行單元與數(shù)據(jù)路徑的設(shè)計(jì),利于提升時(shí)鐘頻率,,并「將晶體管預(yù)算砸在最值得被加速的簡(jiǎn)單指令,不常用到的復(fù)雜指令,,就用微碼(Microcode)ROM 產(chǎn)生ROP 微程式慢慢跑」,,已是20 年來x86 CPU 的共同特色,超標(biāo)量架構(gòu)大師Mike Johnson 領(lǐng)銜的K5 則是先驅(qū)(如果不限超標(biāo)量,,NexGen Nx586 則稍早),,將非固定長(zhǎng)度的x86 指令解碼成平均59 Bits 長(zhǎng)的ROP(RISC86Operation,發(fā)音是「ar-op」),。
AMD K5 還有個(gè)值得紀(jì)念之處:x86 史上首款單一核心最多可同時(shí)解碼4 個(gè)x86 指令的CPU,,下一款是相隔近十年的英特爾Merom 了,不提尷尬的K11,,AMDZen 更晚了自家「前輩」超過20 年,。
強(qiáng)化非循序指令執(zhí)行效率的兩段式微指令轉(zhuǎn)譯與「類VLIW」的微指令派發(fā)
x86 CPU 的指令解碼器將x86 指令轉(zhuǎn)成微指令,看起來好像很美好,,但隨著CPU 可同時(shí)非循序執(zhí)行的指令數(shù)量越來越多,,「微指令洪災(zāi)」就變成大麻煩,需要復(fù)雜的功能單元與相對(duì)應(yīng)的電路成本,,監(jiān)控管理一海票微指令的生老病死與相依性,,這也不利減少CPU 功耗。
在這就非得岔題談一談「首款雙核心服務(wù)器CPU」的IBM Power4 了,,為縮減指令控制邏輯的復(fù)雜度,,Power4 一次將5 個(gè)解碼后的指令「打包」成一個(gè)「一個(gè)蘿卜一個(gè)坑、每個(gè)指令垂直對(duì)應(yīng)一個(gè)執(zhí)行單元」的超長(zhǎng)指令(VLIW)包(一時(shí)腦筋轉(zhuǎn)不過來,,可想一下AMD GPU 以前的VLIW5),,里面5 個(gè)指令全部執(zhí)行完畢才能退返(Retire),控制邏輯單元只需管控相當(dāng)于100 個(gè)指令的20 個(gè)指令包,這讓Power4 這部分電路規(guī)模只有前代Power3 的一半,,且更便于拉抬CPU 時(shí)鐘頻率,。
AMD 則是從K7 開始兩段式微指令轉(zhuǎn)譯,指令解碼器先將x86 指令解碼一至兩個(gè)MOP(Macro-Operation),,到了內(nèi)部要在指令保留站(Reservation Station)「派發(fā)」(Dispatch)到執(zhí)行單元前,,再拆成更小的uOP(發(fā)音「ur-op」),接著才「真槍實(shí)彈上陣」,,避免一開始就把微指令拆光光,,淹沒指令管理單元,也變相將指令解碼器的復(fù)雜度分散到「大后方」,。
關(guān)于無法直接用「Fast Path」指令解碼器處理成 MOP 的復(fù)雜指令,,由「Vector Path」的微碼 ROM 產(chǎn)生一系列MOP 微程式。前面就提過,,所謂「RISC86」真正的精神就如同 RISC:把經(jīng)常用到的情況盡可能加速(Make The Common Case Fast.),,將最佳化資源集中在最常碰到的刀口。
同期英特爾的手段就讓人莞爾,,起源于Pentium M 的「Macro-Fusion」,,英特爾直接藉由增加指令保留站的運(yùn)算元數(shù)量,削減CPU 內(nèi)部微指令的總量,,例如用一個(gè)三運(yùn)算元(a =b+c)微指令代替兩個(gè)(a=a+b),,說穿了也稱不上什么「融合」,或還不如說「本來就應(yīng)該這樣做」更貼切,。
相對(duì)英特爾從Merom 開始,,指令保留站某些Port 擠滿了一堆不同性質(zhì)執(zhí)行單元的「爆漿撒尿牛丸」樣貌,AMD 那「整數(shù)浮點(diǎn)一邊一國(guó)的簡(jiǎn)潔風(fēng)」在「簡(jiǎn)單就是美」的推土機(jī)展露無疑,,非?!竀LIW」,就算沒有像IBM Power4 那樣「指令打包送快遞」,,但看在總工程師都是同一位如假包換的Chuck Moore 份上,,企圖簡(jiǎn)化復(fù)雜度以追求更高運(yùn)作時(shí)鐘頻率與更高投資效益的意圖是一致的。
盡管推土機(jī)家族的下場(chǎng)不是太好看,,但類似理念也同樣被Zen繼承,,反正各位只需了解一個(gè)殘酷的現(xiàn)實(shí):畢竟AMD 的研發(fā)能量遠(yuǎn)不如英特爾,不見得有雄厚本錢采取過于精密復(fù)雜的架構(gòu)風(fēng)格,,此類「窮人思維」在AMD CPU 發(fā)展史上無所不在,。
眾里尋他千百度才秾纖合度的分支預(yù)測(cè)
「電腦」(Computer)和「計(jì)算器」(Calculator)的不同點(diǎn)在于:電腦具備「條件判斷」的能力,依據(jù)不同條件,,執(zhí)行不同指令流,。各位可將電腦程式的運(yùn)作流程,,想像成一個(gè)「棋盤」,以一個(gè)角落為起點(diǎn),,對(duì)角線的角落當(dāng)終點(diǎn),,在棋盤上反覆移動(dòng),不限制前進(jìn)或后退,。如發(fā)生條件判斷的分支(Branch,,必須先等待條件判斷的執(zhí)行結(jié)果,才能判定該分支「發(fā)生」),,或無條件判斷的跳躍(Jump),,就會(huì)變更指令流,并中斷指令流水線運(yùn)作,,尤其前者傷害指令流水線化的CPU 效能,,才需要「以古鑒今」的分支預(yù)測(cè)(Branch Prediction)技術(shù)。
「過猶不及」的「分支預(yù)測(cè)」一向公認(rèn)是AMD 落后英特爾的技術(shù)弱點(diǎn),,到了 Zen 才改觀,。賈誼〈過秦論〉那句意謂秦始皇繼承六代功業(yè)的「奮六世之余烈」,套用到Zen看似突破性的分支預(yù)測(cè)技術(shù),,實(shí)在再適合不過了,,在Zen 之前,剛剛好也是6 世代:K5,、K6、K7,、K8,、K10、K11,,有夠巧,。
因 K11 的分支預(yù)測(cè)技術(shù)和前代相比簡(jiǎn)直徹頭徹尾大相徑庭,故不列于下表,。
一般我們談到的是「動(dòng)態(tài)」分支預(yù)測(cè),,透過小型化 Cache存儲(chǔ)器,記錄分支行為的歷史,,并隨時(shí)搜集各類參考資訊,,動(dòng)態(tài)的修正預(yù)測(cè)的結(jié)果。近年來拜「CPU 安全漏洞」所賜,,「預(yù)測(cè)執(zhí)行」(Speculative Execution),、「非循序執(zhí)行」(Out-Of-Order Execution)和「分支預(yù)測(cè)」等技術(shù)名詞,變得非常熱門也經(jīng)?;煜?。
各位只要記得,,對(duì)近代高效能CPU,「預(yù)測(cè)執(zhí)行=分支預(yù)測(cè)+非循序執(zhí)行」,,CPU 根據(jù)分支預(yù)測(cè)的結(jié)果,,先斬后奏「賭博」性執(zhí)行指令流,再藉由非循序執(zhí)行引擎維護(hù)指令執(zhí)行順序的一致性,,以及當(dāng)預(yù)測(cè)錯(cuò)誤時(shí),,回復(fù)該分支前的處理器狀態(tài)。
分支預(yù)測(cè)究竟有多重要,?假如有一顆CPU 沒有任何分支預(yù)測(cè)機(jī)制(或說有,,但總是預(yù)測(cè)錯(cuò)誤),當(dāng)執(zhí)行分支指令時(shí),,直到目標(biāo)指令被擷取,,所需要的時(shí)鐘頻率周期數(shù)「分支傷害」(Branch Penalty)是3 個(gè)時(shí)鐘頻率周期,分支占了程式碼五分之一,,那會(huì)損失多少效能,?
3 * ? =0.61 / (1+0.6) = 0.625
我們就可簡(jiǎn)單推算出,平均執(zhí)行每個(gè)指令都會(huì)多出 0.6 個(gè)時(shí)鐘頻率周期,,等于增加60% 執(zhí)行時(shí)間,,執(zhí)行效能僅剩下 62.5%。
很不幸的,,這個(gè)簡(jiǎn)單的案例還真的有倒楣的苦主:AMD K5的初版「SSA/5」(PR75 到PR100),,因不明原因,分支預(yù)測(cè)功能被關(guān)閉,,還「附贈(zèng)」奇怪的CPU 閑置狀態(tài),,「完全體」5K86(PR120 到PR200)的同時(shí)鐘頻率效能就硬是多了整整30%。讓人極度好奇,,假若 Compaq 知道他們死撐著不用 Pentium,,只為了等待這樣的產(chǎn)品,會(huì)做何感想,。
K5 的分支預(yù)測(cè)超級(jí)陽(yáng)春,,準(zhǔn)確率僅75%。當(dāng)連續(xù)執(zhí)行分支指令時(shí),,等于每道指令平均多 0.75 個(gè)時(shí)鐘頻率周期,,沿用上面「分支占五分之一」的算法是 0.15,效能僅剩 87%,,怎么看分?jǐn)?shù)都不及格,。但這時(shí)各位也應(yīng)心知肚明,后期 K5 多出來的 30% 效能大致上是怎么來的,,分支預(yù)測(cè)的確發(fā)揮了關(guān)鍵性作用,。
?。?5% * 0) + (25% * 3) = 0.750.75 * ? = 0.151 / (1 + 0.15) = 0.87
購(gòu)并NexGen 而來的K6 卻是AMD 史上罕見的「過度投資」,和K5 同為六階流水線,、但最多只能解碼兩個(gè)x86 指令的K6,,在分支預(yù)測(cè)暴力到整個(gè)過頭,足以傲視AMD 歷代CPU架構(gòu),,但這是天大的浪費(fèi),,況且分支預(yù)測(cè)越復(fù)雜,發(fā)生錯(cuò)誤的回復(fù)時(shí)間也就越長(zhǎng),,K6 的錯(cuò)誤代價(jià)就硬比K5 多出一到兩個(gè)時(shí)鐘頻率周期(3 vs. 4 或5 ),。
K6 的分支預(yù)測(cè)準(zhǔn)確率號(hào)稱高達(dá)95%,我們可推算出執(zhí)行每個(gè)分支指令只會(huì)多出0.2 到0.25 個(gè)時(shí)鐘頻率周期,,「分支占五分之一」就0.04 到0.05,,效能維持在95%到96%,遠(yuǎn)勝過K5,。
?。?5% * 0) + (5% * 4) = 0.2(95% * 0) + (5% * 5) = 0.251 / (1 + 0.04) = 0.961 / (1 + 0.05) = 0.95
不知道是不是針對(duì)K6「過度投資」的反動(dòng),或是覺得過于復(fù)雜的分支預(yù)測(cè)只會(huì)帶來反效果,,AMD 在1998 年MicroprocessorForum 揭露K7 的神秘面紗時(shí),,最讓人意外的不是和DECAlpha 21264 如出一轍的「體格」,而是「Long Pipeline, But SimpleBranch Predictor」,。
面對(duì)外界種種質(zhì)疑,,AMD 堅(jiān)持「更精確的分支預(yù)測(cè)器只會(huì)帶來更復(fù)雜的設(shè)計(jì)、更多的預(yù)測(cè)時(shí)鐘頻率周期與回復(fù)效能損失」,,還更大膽的將標(biāo)準(zhǔn)的2 位元Smith 演算法4 種狀態(tài),,砍成只剩下3 種(將Strongly not taken 和Weakly not take 合為一種not taken)。對(duì)照K7 壓倒性的龐大執(zhí)行單元,,在這種小地方偷工減料,真的是莫大諷刺,,但更扯的還在后頭,。
演進(jìn)自K7 的K8 與「壓榨K8 剩余價(jià)值」的K10,指令流水線更深,,沒有擺爛裝死的借口,,乍看之下「知恥近乎勇」亡羊補(bǔ)牢,但卻很精明的利用「L1 / L2 互斥性 Cache(ExclusiveCache)」的特性,,趁著數(shù)據(jù)從L1 指令 Cache「被驅(qū)逐」(Evicted)寫入L2 Cache時(shí),,將分支選擇器「偷放」在L2 Cache存儲(chǔ)器包含指令的 Cache區(qū)塊之ECC 欄位,「節(jié)儉」至此,,堪稱一絕,。
受制于不佳的分支預(yù)測(cè)精準(zhǔn)度與「連如此簡(jiǎn)單的整數(shù)核心都喂不飽」的L1 指令 Cache存儲(chǔ)器,,甚少人注意到指令流水線深達(dá)20 階的K11,解耦式分支預(yù)測(cè)器(DecoupledBranch Predicator)早已默默為Zen 2 的「機(jī)器學(xué)習(xí)分支預(yù)測(cè)器」TAGE(TAgged GEometric)分支預(yù)測(cè)器預(yù)先埋好了路基,。
相近于今日少為人知的Rise mP6,,K11 不等發(fā)生指令 Cache誤失才去抓取目標(biāo)指令,推土機(jī)的分支預(yù)測(cè)機(jī)制與指令擷取「脫鉤」,,主動(dòng)標(biāo)定分支預(yù)測(cè)目標(biāo)的相對(duì)位址,,如不存在于指令 Cache內(nèi),就「主動(dòng)出擊」預(yù)先擷取,,可掩蓋發(fā)生 Cache誤失時(shí)的延遲,,并替更耗時(shí)的機(jī)器學(xué)習(xí)分支預(yù)測(cè)器「爭(zhēng)取訓(xùn)練的時(shí)間」。
依照 AMD 的說法,,Zen 2 的分支錯(cuò)誤率比 Zen 減少了 30%,,意味著 Zen 從 97% 的精確度提升到 Zen 2 的 98%。但不論解耦式分支預(yù)測(cè)器還是機(jī)器學(xué)習(xí)分支預(yù)測(cè)器 TAGE,,都是英特爾研究多年并發(fā)表過學(xué)術(shù)論文的產(chǎn)物,,很可能早就導(dǎo)入產(chǎn)品了,但沒刻意拿出來說嘴,。不過花了這么長(zhǎng)的時(shí)間,,AMD 總算在分支預(yù)測(cè)趕上英特爾的水準(zhǔn),仍值得可喜可賀,。
激增有效實(shí)質(zhì)容量的互斥性 Cache架構(gòu)
各位有沒有想過:Ryzen Threadripper3990X 的「288MB」 Cache容量究竟是怎么算出來的,?
答案是「64 核心× 512kB 第二階 Cache」加上「8個(gè)CCD × 2 個(gè)CCX × 16MB 第三階 Cache」,因兩邊的內(nèi)容是「互斥」(Exclusive)的,,而第二階 Cache完全包含(Inclusive)了第一階 Cache的內(nèi)容,,所以有效容量是32MB+256MB=288MB,這也是AMD CPU 從K7 后期至今,,一個(gè)持之以恒的共同特征,,而英特爾則從Nehalem 開始,走上另一條徹底相反的路線,。
互斥性 Cache架構(gòu)的發(fā)生背景是K7 從Thunderbird 開始,,CPU直接整合256kB 或64kB 第二階 Cache存儲(chǔ)器,但K7 的第一階Cache總?cè)萘慷噙_(dá)128kB,,不讓兩者「油水分離」,,將會(huì)浪費(fèi)大量的有效容量,如Duron 的L1 竟然還是L2 兩倍的蠢事(128kB vs. 64kB),。從 K7 到 K10 是 L1 / L2 互換,,K11到 Zen 則調(diào)整成 L2 / L3 輪轉(zhuǎn)。
K8 / K10 利用這點(diǎn),,趁L1 指令Cache的數(shù)據(jù)搬到L2 時(shí),,將分支選擇器隨著預(yù)先解碼(Pre-decoded)和奇偶校驗(yàn)(Parity)欄位,,一并寫入確定存放指令的L2 Cache區(qū)塊之ECC 欄位,但互斥性 Cache架構(gòu)也是AMD CPU 最末階 Cache延遲過長(zhǎng)的元兇,。
服務(wù)器等級(jí)的存儲(chǔ)器自動(dòng)偵測(cè)容錯(cuò)機(jī)制
服務(wù)器要的是RAS:可靠性(Reliability),、可用性(Availability)、可服務(wù)性(Serviceability),,而最大的潛在威脅,,莫過于構(gòu)成地球低強(qiáng)度背景輻射的帶電粒子,所引起位元翻轉(zhuǎn)的存儲(chǔ)器軟錯(cuò)誤(Soft Error),,動(dòng)輒偶發(fā)的多位元錯(cuò)誤更是一大挑戰(zhàn),。K8 之所以能替AMD 敲開服務(wù)器天堂的大門,被偵錯(cuò)容錯(cuò)機(jī)制高度保護(hù)的 Cache存儲(chǔ)器與主存儲(chǔ)器,,以及檢測(cè)硬體錯(cuò)誤并回報(bào)軟體進(jìn)行復(fù)原處理的硬體檢查架構(gòu)(Machine Check Architecture,,MCA),統(tǒng)統(tǒng)功不可沒,。
從K8 到Zen,,ECC(Error-CorrectingCode)越來越強(qiáng)悍,L1 數(shù)據(jù) Cache存儲(chǔ)器可「修復(fù)單位元錯(cuò)誤,,偵測(cè)雙位元錯(cuò)誤」,,L2 / L3 Cache存儲(chǔ)器更「修復(fù)雙位元錯(cuò)誤,偵測(cè)三位元錯(cuò)誤」,,但「數(shù)據(jù)損壞了頂多重抓」的L1 指令 Cache「不太需要完善保護(hù),,只須奇偶校驗(yàn)」的原則毫無改變的跡象,事實(shí)上也沒必要,,起碼節(jié)約成本,。
K8 整合式存儲(chǔ)器控制器支援防止存儲(chǔ)器多位元錯(cuò)誤的 Chipkill 技術(shù),如何做到,?下面這張圖闡述得非常清晰,。
既然存儲(chǔ)器模組使用的 ECC 演算法無法糾正超過單位元的錯(cuò)誤,那么我們就「分而治之」,,讓超過單位元的錯(cuò)誤,,不會(huì)出現(xiàn)在單一存儲(chǔ)器模組。假設(shè)有4 條存儲(chǔ)器模組,,而存儲(chǔ)器模組顆粒數(shù)據(jù)總線的寬度為4 位元,我們各自分開存放ECC 偵錯(cuò)碼的額外顆粒的4 條數(shù)據(jù)線,,和另外3 條模組的數(shù)據(jù)線組成4 位元寬度,,即可預(yù)防單一存儲(chǔ)器模組發(fā)生超過1 位元的錯(cuò)誤。
論服務(wù)器可靠性RAS,,英特爾,、AMD 是半斤八兩,,像在Nehalem-EX(Xeon 7500 系列)時(shí)期,英特爾硬把Itanium 一整套搬到x86 平臺(tái)變成「MCA Recovery」,,可在存儲(chǔ)器區(qū)塊標(biāo)示硬體無法修復(fù)的錯(cuò)誤,,通知作業(yè)系統(tǒng)或虛擬機(jī)器管理員不再使用這些單元,關(guān)閉標(biāo)示錯(cuò)誤的數(shù)據(jù)并重新啟動(dòng)程式,,AMD 也從來沒有缺席(軟體支援性就見仁見智了),,但AMD 在21 世紀(jì)初期曾短暫從英特爾手上奪過服務(wù)器的技術(shù)優(yōu)勢(shì),依然值得大書特書,。
經(jīng)過千錘百煉的 Cache數(shù)據(jù)一致性協(xié)定
Cache數(shù)據(jù)一致性協(xié)定(Cache CoherenceProtocol)對(duì)多核心與多處理器平臺(tái)的效能的重大影響,,無論怎么說都是毋庸置疑的,不只服務(wù)器RAS,,x86 CPU 在AMD K7 問世的MOESI協(xié)定,,相較于行之有年的MESI,Owner 狀態(tài)允許尚未更新主存儲(chǔ)器的內(nèi)容前,,不同CPU 之間可提前共享,、并交換修改后的 Cache區(qū)塊,可大幅減輕系統(tǒng)總線的壓力,,這因K8 整合存儲(chǔ)器控制器,,而在多處理器環(huán)境,讓主存儲(chǔ)器分散在四處的NUMA(Non-Uniform Memory Access)架構(gòu),,更是決定效能的關(guān)鍵,。
AMD 或多或少有英特爾的 MESIF 協(xié)定殷鑒在前,Zen 進(jìn)一步擴(kuò)充成 MDOEFSI,。
L3 Cache「海納」L2 Cache標(biāo)簽(Tag)的巧思,,使其搖身一變,成為可過濾 Cache一致性協(xié)定廣播的Probe Filter(或稱之為Snoop Filter,,AMD 的行銷名稱是HT Assist) ,,不必像K10 切割部分L3 Cache容量,或在系統(tǒng)芯片組塞一大塊SRAM 當(dāng)成記錄所有 Cache區(qū)塊狀態(tài)的目錄,,僅付出低成本實(shí)現(xiàn)高效率的 Cache一致性,。
將MDOEFSI 協(xié)定的細(xì)節(jié)束之高閣,目前看來在實(shí)體CPU 芯片(CPU Complex)數(shù)量極多的EPYC 和Threadripper 運(yùn)行還不錯(cuò),,長(zhǎng)期大型單一晶粒共用L3 Cache的英特爾卻沒有這樣的特殊考慮,,也許當(dāng)英特爾哪天基于成本因素,被迫和AMD 一起「包水餃」,,那時(shí)才是考驗(yàn)英特爾 Cache一致性協(xié)定的最佳時(shí)機(jī),。
支持大量處理器延展性的系統(tǒng)連結(jié)架構(gòu)
最近 AMD 在財(cái)務(wù)分析師大會(huì)發(fā)表名為「Infinity Architecture」的 Infinity Fabric 3.0,不僅可連接多顆 CPU 和多顆 GPU,更可當(dāng)成CPU和 GPU 之間的橋梁,。
但這對(duì)AMD 來說并非新穎的概念,,AMD 早在十幾年前K8 的HyperTransport就打算這樣干了,而Infinity Fabric 就是從HyperTranspor延展出來的「超集合」,,擁有更完整的功能,,從定義AMD內(nèi)部SoCIP 區(qū)塊的通用控制方式,到解決異構(gòu)數(shù)據(jù)一致性的互連方案,,都是持續(xù)進(jìn)化中的Infinity Fabric 可大展身手的領(lǐng)域,。
AMD 未來面對(duì)的挑戰(zhàn)依舊嚴(yán)峻
本文標(biāo)題并不表示 AMD 這間公司就此功德圓滿?;仡?5 年的AMD K 系列CPU 迢迢來時(shí)路,,想必各位可漸漸感受到身為碩果僅存英特爾唯一x86 競(jìng)爭(zhēng)者(好吧,勉強(qiáng)還有臺(tái)灣VIA 的Centaur 和俄羅斯的Elbrus),,面對(duì)資源數(shù)倍于己的超級(jí)強(qiáng)敵,,身處毫無犯錯(cuò)余裕、如履薄冰,、步步為營(yíng)的艱困處境,,研制產(chǎn)品時(shí)的取舍與掙扎,更是AMD 困境的縮影,。
至于時(shí)下的AMD 是否「已經(jīng)」成功,,也是個(gè)巨大的問號(hào),服務(wù)器市場(chǎng)市占率,、營(yíng)收與獲利仍遠(yuǎn)遠(yuǎn)不及K8 核心Opteron 全盛期水準(zhǔn),,另一邊的GPU 戰(zhàn)場(chǎng),還是被nVidia 壓著打,,實(shí)際上只能算勉強(qiáng)站穩(wěn)腳步,,離「成功」兩字仍有一段相當(dāng)長(zhǎng)的距離。AMD 另一個(gè)比較大的潛在危機(jī)在于「未來性」,,這和公司能真正「發(fā)大財(cái)」互為表里,。
如果對(duì)比「蘇媽」和「皮衣教主」的演講內(nèi)容,相信大多數(shù)人仍會(huì)覺得前者「相當(dāng)傳統(tǒng)保守」,,后者「象征光明未來」,。從量子計(jì)算、人工智能到自駕車等新興應(yīng)用,,AMD 統(tǒng)統(tǒng)沾不上邊,,連在高效能運(yùn)算市場(chǎng)要反攻Top500 席次都還頗有難度,唯有鞏固并擴(kuò)張數(shù)據(jù)中心的獲利與營(yíng)收,,才有足夠銀彈投資未來,。偏偏這里又是英特爾重兵集結(jié),、拼死防御、明槍暗箭明招暗招毫無保留的「現(xiàn)金母?!梗–ash Cow),絕不會(huì)平白拱手讓人,。
AMD 能否守住得來不易的戰(zhàn)果,,唯有寄望晶圓代工商業(yè)模式有機(jī)會(huì)讓英特爾的制程霸權(quán)從此一去不復(fù)返,或英特爾再度犯下重大戰(zhàn)略失策,,但筆者對(duì)此的態(tài)度并不樂觀,,2020 年第三季的Zen 3 與第三代EPYC「Milan」對(duì)AMD 將是極為重要的命運(yùn)轉(zhuǎn)折點(diǎn)。從光鮮亮麗簡(jiǎn)報(bào)溢出來的滿滿憂慮,,其實(shí)都早寫在 AMD高層和無數(shù)員工的臉上,,只是你沒看出來。
好戲即將上演,,就讓我們拭目以待,。