周耀陽(yáng) 韓博陽(yáng) 藺嘉煒 王凱帆 張林雋 余子濠 唐 丹,3 王 卅,2 孫凝暉包云崗,2
1 (處理器芯片全國(guó)重點(diǎn)實(shí)驗(yàn)室(中國(guó)科學(xué)院計(jì)算技術(shù)研究所)北京 100190)
2 (中國(guó)科學(xué)院大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 北京 100049)
3 (北京開(kāi)源芯片研究院 北京 100080)
4 (香港大學(xué)電機(jī)電子工程系 香港 999077)
在近幾年的芯片敏捷開(kāi)發(fā)浪潮中,得益于Chisel,BlueSpec,PyMtl 等新興的硬件描述語(yǔ)言和Rocketchip等SoC 平臺(tái),直接基于寄存器傳輸級(jí)(register-transfer level,RTL)描述進(jìn)行CPU 架構(gòu)的設(shè)計(jì)變得越來(lái)越常見(jiàn)[1-6].隨著社區(qū)的不斷發(fā)展,基于這些語(yǔ)言的開(kāi)源設(shè)計(jì)架構(gòu)越來(lái)越先進(jìn),其設(shè)計(jì)也越來(lái)越復(fù)雜,例如加州大學(xué)伯克利分校開(kāi)源的Boom 和中國(guó)科學(xué)院計(jì)算技術(shù)研究所開(kāi)源的香山處理器[4,6-8].復(fù)雜的設(shè)計(jì)對(duì)現(xiàn)有的性能評(píng)估設(shè)施提出了更高的要求,例如AWS 的云化FPGA 已經(jīng)難以容納目前最復(fù)雜的開(kāi)源處理器核[4].
為了使設(shè)計(jì)規(guī)模不受限制,部分工作[4]采用了基于RTL 軟件仿真器的技術(shù)路線.但是對(duì)于復(fù)雜設(shè)計(jì)而言,常用的RTL 軟件仿真器(例如Verilator[9]和VCS)仿真復(fù)雜設(shè)計(jì)的速度僅有500~3 000 cycle/s[4].為了加速仿真流程,利用采樣和功能預(yù)熱來(lái)減少仿真指令數(shù)是最常見(jiàn)的方法[10-12].雖然這些方法起初是在GEM5等CPU 架構(gòu)模擬器上誕生,但在RTL 軟件仿真器上,有越來(lái)越多的工作通過(guò)采樣和檢查點(diǎn)等方法來(lái)減少仿真指令數(shù)、縮短仿真時(shí)間[4,13].
采樣方法基于機(jī)器學(xué)習(xí)或者統(tǒng)計(jì)學(xué)方法從冗長(zhǎng)的程序中選擇很少一部分片段作為代表來(lái)進(jìn)行性能測(cè)量,獲得程序性能計(jì)數(shù)器,用于估算整個(gè)程序的性能(如圖1 所示).這些采樣方法的典型代表是SimPoint[10]和SMARTS[11].對(duì)于SPECCPU?這樣的大型程序而言,這些采樣方法[10-11]可以將總測(cè)量指令數(shù)縮減到千分之一以下.
Fig.1 Existing sampling-based simulation methods圖1 現(xiàn)有的基于采樣的仿真方法
采樣方法會(huì)引入冷啟動(dòng)問(wèn)題,即程序在特定采樣點(diǎn)(region of interest, ROI)開(kāi)始執(zhí)行時(shí),處理器的微架構(gòu)狀態(tài)與從頭開(kāi)始運(yùn)行時(shí)是不同的.為此,引入了預(yù)熱機(jī)制,即在采樣點(diǎn)開(kāi)始之前增加一段不參與數(shù)據(jù)統(tǒng)計(jì)的預(yù)熱執(zhí)行階段(如圖1(b)所示),使微結(jié)構(gòu)狀態(tài)更貼近從頭開(kāi)始執(zhí)行[10-11,14].在提高其準(zhǔn)確度的同時(shí),預(yù)熱也造成了額外的仿真指令數(shù).為此,通過(guò)功能預(yù)熱、虛擬化預(yù)熱等方法來(lái)降低預(yù)熱帶來(lái)的額外開(kāi)銷[11,15-17].
如圖2 所示,即使應(yīng)用了現(xiàn)有的檢查點(diǎn)技術(shù)[4]和Verilator 的多線程加速[9],仍然存在需要仿真超30 h的檢查點(diǎn)(每個(gè)檢查點(diǎn)均采用Verilator 開(kāi)啟16 線程仿真,運(yùn)行40M 指令).研究表明,為了降低單檢查點(diǎn)的指令數(shù),可以縮短單個(gè)檢查點(diǎn)的采樣長(zhǎng)度[10-11],但不能縮短預(yù)熱長(zhǎng)度,否則會(huì)損失性能[14,18](詳見(jiàn)1.3節(jié)).因此預(yù)熱時(shí)間占比會(huì)從現(xiàn)在的約50%進(jìn)一步上升,可見(jiàn),加速RTL 預(yù)熱非常重要.
Fig.2 Emulation time distribution of 492 checkpoints from SPECCPU? 2006圖2 來(lái)自SPECCPU? 2006 的492 個(gè)檢查點(diǎn)的仿真時(shí)間分布
為了加速RTL 仿真預(yù)熱,本文通過(guò)profiling(嘗試不同的預(yù)熱長(zhǎng)度)根據(jù)程序預(yù)熱需求將預(yù)熱過(guò)程分為3 段,如圖3 所示.對(duì)這3 段分而治之:1)完全跳過(guò)非必要預(yù)熱;2)對(duì)可功能預(yù)熱段采用功能預(yù)熱加速;3)對(duì)必須采用RTL 仿真的部分使用并行加速和調(diào)度優(yōu)化.為了達(dá)成修改方案,需要回答3 個(gè)問(wèn)題:1)在RTL 仿真極其緩慢的背景下,面對(duì)快速迭代的設(shè)計(jì),如何高效地profiling;2)在快速迭代的設(shè)計(jì)上,如何實(shí)現(xiàn)可復(fù)用的功能預(yù)熱;3)在任務(wù)時(shí)長(zhǎng)分布不均、多任務(wù)間存在性能干擾的情況下,如何調(diào)度計(jì)算資源盡快完成全細(xì)節(jié)仿真.
Fig.3 Optimization overview of HyWarm: Existing fixed warm up duration is divided into three segments圖3 HyWarm 的優(yōu)化概覽:將現(xiàn)存固定預(yù)熱長(zhǎng)度分為3 段
問(wèn)題1:在RTL 仿真極其緩慢的背景下,面對(duì)快速迭代的設(shè)計(jì),如何高效地profiling.現(xiàn)有工作通過(guò)profiling 來(lái)獲取應(yīng)用的實(shí)際預(yù)熱需求(指令數(shù)),這可以縮短不必要的預(yù)熱長(zhǎng)度[14,17,19-20].但每當(dāng)面對(duì)新設(shè)計(jì)(比如緩存容量增加)時(shí),重新profiling 反而增加了全細(xì)節(jié)仿真指令數(shù)[20].面對(duì)該挑戰(zhàn),我們發(fā)現(xiàn)架構(gòu)模擬器不僅運(yùn)行速度比RTL 快,而且可以得到近似的程序預(yù)熱需求(實(shí)驗(yàn)數(shù)據(jù)見(jiàn)2.1 節(jié)和4.2 節(jié)).因此,用模擬器替代RTL 仿真進(jìn)行profiling可以兼顧速度和準(zhǔn)確度.
問(wèn)題2:在快速迭代的設(shè)計(jì)上,如何實(shí)現(xiàn)可復(fù)用的功能預(yù)熱.盡管模擬器上的功能預(yù)熱已經(jīng)得到了充分研究,但是沒(méi)有現(xiàn)存的在RTL 上實(shí)現(xiàn)功能預(yù)熱的方法.其中,最大的難題是我們很難錨定RTL 生成的C++數(shù)據(jù)結(jié)構(gòu)進(jìn)行功能預(yù)熱.因?yàn)閺腞TL 生成的C++數(shù)據(jù)結(jié)構(gòu)可讀性非常差,且變量名和存儲(chǔ)結(jié)構(gòu)會(huì)隨著設(shè)計(jì)的變化而變化.面對(duì)該挑戰(zhàn),我們發(fā)現(xiàn)雖然生成的C++數(shù)據(jù)結(jié)構(gòu)會(huì)改變,但是總線協(xié)議是相對(duì)固定的,例如AMBA[21],TileLink[22].如果錨定通用的緩存協(xié)議實(shí)現(xiàn)緩存功能預(yù)熱,那么只要總線協(xié)議不改變就可以復(fù)用功能預(yù)熱模塊.
問(wèn)題3:在任務(wù)時(shí)長(zhǎng)分布不均,多任務(wù)間存在性能干擾的情況下,如何調(diào)度計(jì)算資源盡快完成全細(xì)節(jié)仿真.圖2 表明一部分負(fù)載的仿真時(shí)間較長(zhǎng),成為了影響仿真時(shí)間的最重要因素,因此任務(wù)調(diào)度需要避免負(fù)載不均衡.此外,在應(yīng)用滿載運(yùn)行多個(gè)多線程任務(wù)時(shí)觀察到了相較于單任務(wù)運(yùn)行時(shí)的45%的性能損失,如表1 所示,其中IPS 是每秒仿真的指令數(shù)量,仿真對(duì)象為香山處理器運(yùn)行dhrystone.這促使我們重新思考多線程和多任務(wù)對(duì)全系統(tǒng)吞吐的影響,并得出了CPU 核分簇方案(見(jiàn)2.2 節(jié)).在此基礎(chǔ)上,以CPU 簇為調(diào)度粒度,對(duì)任務(wù)采用長(zhǎng)作業(yè)優(yōu)先(long job first, LJF)調(diào)度算法,該算法被證明最大完成時(shí)間在最差情況下只有最優(yōu)調(diào)度的4/3[23-24].
Table 1 Emulation Speed of Verilator with Different Parallelism on AMD EPYC 7H12 Server with 64 Cores表1 在AMD EPYC 7H12 64 核服務(wù)器上運(yùn)行不同并行任務(wù)數(shù)的Verilator 的仿真速度
綜上,本文提出了HyWarm 框架,它包括:1)基于架構(gòu)模擬器進(jìn)行預(yù)熱需求分析,可以快速獲得負(fù)載的預(yù)熱需求的工具WarmProfiler;2)通過(guò)錨定總線協(xié)議實(shí)現(xiàn)可復(fù)用的RTL 功能預(yù)熱的工具TLWarmer;3)最大化系統(tǒng)吞吐、縮短最大完成時(shí)間的分簇LJF調(diào)度算法.
我們?cè)谙闵教幚砥鱗4]上實(shí)現(xiàn)了HyWarm 框架.其中,TLWarmer 將8 MB 緩存預(yù)熱時(shí)間從10~100 h 縮短到少于0.5 h.相對(duì)于MINJIE[4]平臺(tái)的檢查點(diǎn)采樣方案,HyWarm 能達(dá)到接近25M 指令全細(xì)節(jié)預(yù)熱的準(zhǔn)確度(HyWarm 的 L1 缺失懲罰準(zhǔn)確率為95.1%,分支的每千條指令分支預(yù)測(cè)錯(cuò)誤數(shù)(MPKI)準(zhǔn)確率為 91.6%;25M 全細(xì)節(jié)預(yù)熱的L1 缺失懲罰準(zhǔn)確率為91.3%,分支MPKI 準(zhǔn)確率為94.1%).在準(zhǔn)確率與基線配置(25M)接近的情況下,相比于25M 預(yù)熱+隨機(jī)調(diào)度的基線,HyWarm 將仿真完成時(shí)間縮短了53%.
本文的貢獻(xiàn)包括3 個(gè)部分:
1)提出了 HyWarm 預(yù)熱框架,通過(guò)架構(gòu)模擬器識(shí)別應(yīng)用的預(yù)熱需求,預(yù)測(cè)應(yīng)用仿真時(shí)長(zhǎng);然后利用功能預(yù)熱和調(diào)度優(yōu)化來(lái)縮短仿真時(shí)長(zhǎng).
2)提出了一種利用總線協(xié)議來(lái)進(jìn)行緩存功能預(yù)熱的思路,并在TileLink 協(xié)議上實(shí)現(xiàn),大幅縮短了功能預(yù)熱的時(shí)間.
3)分析了多核擴(kuò)展和任務(wù)間性能干擾對(duì)Verilator仿真的性能影響,得出了效率最優(yōu)的CPU 簇劃分策略,并在此基礎(chǔ)上應(yīng)用LJF 調(diào)度算法來(lái)減少最大完成時(shí)間.
在芯片設(shè)計(jì)中,硅前性能測(cè)算對(duì)設(shè)計(jì)決策至關(guān)重要.現(xiàn)存的硅前性能測(cè)算手段主要包括3 類:RTL軟件仿真器、基于FPGA 的硬件加速仿真和基于仿真加速器的硬件加速仿真.表2 列出了芯片設(shè)計(jì)過(guò)程中進(jìn)行仿真的4 種常用方法.
Table 2 Comparison of Commonly Used RTL Performance Evaluation Methods表2 常用的RTL 性能評(píng)估方法對(duì)比
此前,基于FPGA 的硬件加速仿真被充分研究,有的工作[25]優(yōu)化了從CPU 模塊到FPGA 資源的映射,使得基于FPGA 的硬件加速仿真達(dá)到更高的運(yùn)行頻率.有的工作[26]利用AWS 的云FPGA 來(lái)提高FPGA硬件加速的易用性.還有工作[27]利用FPGA 進(jìn)行電路的功耗預(yù)測(cè)和建模.然而文獻(xiàn)[25-27]的工作都未能解決FPGA 的資源容量限制CPU 設(shè)計(jì)規(guī)模的問(wèn)題[28-29],例如AWS F1 提供的vu9p FPGA 芯片就因?yàn)锽RAM 和LUT 的開(kāi)銷無(wú)法容納雙核標(biāo)配的香山處理器[4].
在工業(yè)界,商業(yè)公司設(shè)計(jì)復(fù)雜SoC 時(shí)往往會(huì)使用仿真加速器,例如Cadence Palladium[30],Mentor Veloce[31]和Synopsys Zebu[32].仿真加速器擁有比FPGA 更高的擴(kuò)展性,但是一臺(tái)仿真加速器的價(jià)格往往超過(guò)一千萬(wàn)人民幣,這導(dǎo)致一個(gè)商業(yè)公司內(nèi)部往往只有少量的仿真加速器.而且仿真加速器的仿真頻率一般在幾個(gè)MHz[4],比FPGA 慢1%~10%,用一臺(tái)仿真加速器來(lái)進(jìn)行SPECCPU?2006 的測(cè)評(píng)至少需要幾個(gè)月的時(shí)間,在實(shí)際的場(chǎng)景中也是不可接受的.
相比于FPGA 和仿真加速器,RTL 軟件仿真擁有最好的可擴(kuò)展性、易調(diào)試性,它可以同時(shí)支持波形和文字打印,并且電路的規(guī)模只受限于服務(wù)器的內(nèi)存容量.但RTL 軟件仿真器速度非常慢,根據(jù)仿真性能估算,如果用最快的開(kāi)源RTL 仿真平臺(tái)Verilator 來(lái)仿真香山處理器并評(píng)估SPECCPU?2006/2017 的性能,預(yù)估需要超過(guò)7 年的時(shí)間[4,9].
開(kāi)源RTL 仿真器Verilator 和商業(yè)仿真器VCS 是被開(kāi)源處理器社區(qū)廣泛采用的兩大仿真平臺(tái).Verilator 通過(guò)塊重排序、網(wǎng)表級(jí)優(yōu)化獲得了比商業(yè)仿真器更快的仿真速度.Verilator 還能將仿真任務(wù)劃分到多個(gè)CPU 核上并行執(zhí)行來(lái)提升仿真速度.ESSENT使用了重用不變信號(hào)等技術(shù),獲得了相較于Verilator 1.5~11.5 倍的性能提升[33].然而即使獲得了近1 個(gè)數(shù)量級(jí)的提升仍然無(wú)法讓RTL 仿真速度勝任香山處理器的性能評(píng)估(預(yù)計(jì)耗時(shí)數(shù)月到1 年).
針對(duì)RTL 軟件仿真速度慢的問(wèn)題,可以采用體系結(jié)構(gòu)研究中常用的采樣方法來(lái)減少仿真指令數(shù).SimPoint[10]和SMARTS[11]是最廣泛使用的2 種采樣方法.SimPoint 通過(guò)功能模擬器獲得基本塊向量,然后對(duì)基本塊向量進(jìn)行聚類,得到具有代表性的程序片段和相應(yīng)的權(quán)重,并通過(guò)運(yùn)行這些片段來(lái)估算整體性能,如 圖4(a)所示.SMARTS 則在程序中選取大量且均勻的采樣點(diǎn)來(lái)估算整體性能,如 圖4(b)所示.二者都可以大幅減少仿真的指令數(shù)(減少到0.1%以下).此外,在SimPoint 和SMARTS 的基礎(chǔ)上,后續(xù)的工作改進(jìn)了預(yù)熱方法[11,14,16-17,34-36],支持多線程應(yīng)用[37-39], 捕捉微結(jié)構(gòu)相關(guān)特征[40].雖然文獻(xiàn)[10-11]的采樣算法可以減少總仿真指令數(shù)并加速RTL 軟件仿真,但是這些算法無(wú)法直接應(yīng)用于RTL 軟件仿真.GEM5 模擬器與RTL 仿真器最大的不同在于GEM5 為從功能模型中串行化得到體系結(jié)構(gòu)狀態(tài)、從串行化的體系結(jié)構(gòu)狀態(tài)中恢復(fù)狀態(tài)到微架構(gòu)模型做了很多支持,但是RTL 仿真器缺乏類似的串行化和去串行化支持.
Fig.4 Mainstream sampling-based simulation methods圖4 主流的基于采樣的仿真方法
為了解決在RTL 上對(duì)體系結(jié)構(gòu)狀態(tài)去串行化的問(wèn)題,現(xiàn)有研究采用通過(guò)軟件自動(dòng)去串行化的方法來(lái)實(shí)現(xiàn)跨硬件平臺(tái)的體系結(jié)構(gòu)狀態(tài)檢查點(diǎn)[4,13].這些方法的共同點(diǎn)在于,它們都選擇了一個(gè)在指令集定義中較穩(wěn)定的接口,并通過(guò)軟件的方式來(lái)恢復(fù).Dromajo 使用了RISC-V 調(diào)試模塊來(lái)恢復(fù)體系結(jié)構(gòu)狀態(tài)[13,41];而香山處理器采用了RISC-V 特權(quán)指令來(lái)恢復(fù)體系結(jié)構(gòu)狀態(tài)[4].這2 種體系結(jié)構(gòu)檢查點(diǎn)的實(shí)現(xiàn)方法都可以支持SimPoint 等采樣方法,從而讓RTL 軟件仿真的時(shí)間大幅度縮短.例如MinJie 平臺(tái)所使用的檢查點(diǎn)技術(shù)[4]讓香山處理器在理論上需要數(shù)年才能完成,而SPECCPU?2006[42]的仿真在2~14 天就可以完成.
圖2 展示了采用體系結(jié)構(gòu)檢查點(diǎn)和SimPoint 采樣算法后,香山處理器仿真檢查點(diǎn)的時(shí)間(40M 指令).這些負(fù)載的仿真時(shí)間分布非常不均勻,假設(shè)計(jì)算資源充足,那么多數(shù)負(fù)載可以在10 h 內(nèi)完成,而剩下的負(fù)載需要超過(guò)30 h 才能完成,少數(shù)檢查點(diǎn)由于運(yùn)行時(shí)間過(guò)長(zhǎng)已經(jīng)成為整個(gè)流程的關(guān)鍵路徑.
為了進(jìn)一步加速性能測(cè)算,可以降低單個(gè)檢查點(diǎn)的采樣長(zhǎng)度.研究表明,在總采樣指令數(shù)一定的前提下,減少每個(gè)采樣片段執(zhí)行的指令并相應(yīng)地增加采樣片段個(gè)數(shù),不會(huì)損失準(zhǔn)確度[10-11].例如,將N個(gè)20M 指令的采樣片段變?yōu)?N個(gè)5M 指令的片段.雖然這種方法能保證準(zhǔn)確度,但會(huì)增加仿真的總指令數(shù).例如從(20M+20M)×N變?yōu)椋?0M+5M)×4N,總仿真指令數(shù)增加了150%,預(yù)熱指令數(shù)占比上升到80%.因此,為了縮短仿真時(shí)間,需要縮短預(yù)熱時(shí)間.
已有研究表明部分應(yīng)用的預(yù)熱需求超過(guò)200M[14,18],因此200M 指令的預(yù)熱長(zhǎng)度不能進(jìn)一步縮短.雖然預(yù)熱長(zhǎng)度無(wú)法縮短,但是研究者發(fā)明了“功能預(yù)熱”來(lái)減少全細(xì)節(jié)預(yù)熱的長(zhǎng)度.具體而言,功能預(yù)熱通過(guò)功能模擬以更快的速度預(yù)熱一部分微結(jié)構(gòu)模塊,然后再用全細(xì)節(jié)仿真來(lái)預(yù)熱整個(gè)CPU.
功能預(yù)熱是最常用的預(yù)熱加速技術(shù),它與全細(xì)節(jié)預(yù)熱的最大區(qū)別是用功能CPU 來(lái)驅(qū)動(dòng)緩存,以提高預(yù)熱速度.例如,在GEM5 模擬器中,可以用一個(gè)運(yùn)行速度較快的順序CPU 驅(qū)動(dòng)多級(jí)緩存,待緩存充分填充緩存塊之后,再將CPU 換為亂序執(zhí)行架構(gòu).得益于良好的軟件接口,在GEM5 模擬器切換CPU 時(shí)只需要將SoC 的CPU 指針指向亂序CPU 即可.
但在RTL 中,我們難以實(shí)現(xiàn)一個(gè)針對(duì)RTL 生成的C++數(shù)據(jù)結(jié)構(gòu)的功能預(yù)熱模塊.因?yàn)樘幚砥髟O(shè)計(jì)迭代會(huì)帶來(lái)新的RTL,導(dǎo)致RTL 生成的C++代碼的數(shù)據(jù)結(jié)構(gòu)也會(huì)隨之變化,舊的功能預(yù)熱模塊難以復(fù)用到新的設(shè)計(jì)上.此外,功能預(yù)熱模塊還需要精確地復(fù)刻RTL 中的微結(jié)構(gòu)狀態(tài).即使業(yè)界頂尖的公司進(jìn)行該工作也是非常困難的,因?yàn)閷?duì)齊模擬器的工作量巨大[43-44].因此,為了實(shí)現(xiàn)RTL 功能預(yù)熱需要新的解決方案.
雖然某些應(yīng)用的預(yù)熱需求很長(zhǎng),但是文獻(xiàn)[14,18]的結(jié)果表明部分應(yīng)用的預(yù)熱需求很短.因此,可以通過(guò)縮短這部分應(yīng)用的預(yù)熱長(zhǎng)度來(lái)節(jié)省預(yù)熱時(shí)間.為了獲得這部分應(yīng)用的預(yù)熱需求,需要對(duì)多種不同的預(yù)熱長(zhǎng)度進(jìn)行嘗試,并找到性能準(zhǔn)確度損失較小的最短預(yù)熱長(zhǎng)度.在后續(xù)的重復(fù)運(yùn)行中,可以采用較短的預(yù)熱長(zhǎng)度.但是這種profiling 方法并不適用于快速迭代的架構(gòu),也不適合架構(gòu)參數(shù)搜索,因?yàn)殡S著緩存架構(gòu)和規(guī)格的變化,舊的profiling 結(jié)果會(huì)失效,導(dǎo)致profiling 的開(kāi)銷無(wú)法均攤到多次的運(yùn)行中[20].
1.2 節(jié)和1.3 節(jié)總結(jié)了RTL 軟件仿真中現(xiàn)存的采樣技術(shù)尚未解決的3 個(gè)挑戰(zhàn):1)RTL 仿真缺乏功能預(yù)熱的基礎(chǔ)設(shè)施,且難以實(shí)現(xiàn)針對(duì)RTL 生成的C++數(shù)據(jù)結(jié)構(gòu)的功能預(yù)熱模塊;2)面對(duì)架構(gòu)和參數(shù)的變化,難以通過(guò)多次運(yùn)行來(lái)均攤profiling 預(yù)熱需求的開(kāi)銷;3)少數(shù)的檢查點(diǎn)由于運(yùn)行時(shí)間過(guò)長(zhǎng)已經(jīng)成為整個(gè)流程的關(guān)鍵路徑.
關(guān)于RTL 預(yù)熱,我們有3 個(gè)觀察:
1)CPU 的部分模塊使用穩(wěn)定的總線協(xié)議,例如緩存模塊通常基于TileLink 協(xié)議[3,22]或者AMBA 總線協(xié)議[21].雖然緩存內(nèi)部的微結(jié)構(gòu)設(shè)計(jì)會(huì)不斷迭代,但這些總線協(xié)議是穩(wěn)定的.因此,只要設(shè)計(jì)一套基于總線協(xié)議而非針對(duì)微架構(gòu)的功能預(yù)熱方法,就可以在多個(gè)版本的RTL 中重復(fù)使用功能預(yù)熱模塊.
2)同一應(yīng)用對(duì)不同模塊的預(yù)熱需求不同,特別是分支預(yù)測(cè)模塊與緩存模塊的預(yù)熱需求通常存在較大差異.如圖5 所示,sjeng 的分支MPKI 在預(yù)熱長(zhǎng)度為25M 時(shí)飽和,而L2 MPKI 在預(yù)熱長(zhǎng)度為4M 時(shí)飽和.因此,如果實(shí)現(xiàn)了功能預(yù)熱,并提前了解某個(gè)應(yīng)用對(duì)各個(gè)微結(jié)構(gòu)模塊的預(yù)熱需求,可以針對(duì)性地調(diào)節(jié)功能預(yù)熱和全細(xì)節(jié)預(yù)熱的長(zhǎng)度,以盡可能縮短完整預(yù)熱所需時(shí)間.而為了“預(yù)知”負(fù)載的“可功能預(yù)熱段”,需要提前測(cè)試多種可能的預(yù)熱長(zhǎng)度,從中選取既高效又精確的預(yù)熱長(zhǎng)度.
Fig.5 Warm up demand curve of sjeng圖5 sjeng 的預(yù)熱需求曲線
3)不同應(yīng)用的預(yù)熱需求不同.4.2 節(jié)的預(yù)熱需求分析實(shí)驗(yàn)表明,約38%檢查點(diǎn)的預(yù)熱需求大于20M;約62%檢查點(diǎn)的預(yù)熱需求小于20M,其中約57%需求小于5M.如果我們能預(yù)知負(fù)載的預(yù)熱需求,就可以在預(yù)熱需求較小的應(yīng)用上節(jié)約大量時(shí)間,同時(shí)為預(yù)熱需求大的應(yīng)用提供更長(zhǎng)的預(yù)熱以獲得更高的準(zhǔn)確性.
為了通過(guò)profiling 獲得負(fù)載的預(yù)熱需求,需要搜索多種不同的預(yù)熱長(zhǎng)度,這可能導(dǎo)致較大的時(shí)間開(kāi)銷.在搜索過(guò)程中,需要測(cè)量不同預(yù)熱長(zhǎng)度下的緩存MPKI 或者分支MPKI,從而構(gòu)建如圖6 所示的曲線;然后找到讓MPKI 滿足誤差閾值的最小預(yù)熱長(zhǎng)度.在該過(guò)程中,必須測(cè)試多個(gè)預(yù)熱長(zhǎng)度:如果對(duì)9 個(gè)可選的預(yù)熱長(zhǎng)度進(jìn)行二分查找(假設(shè)曲線單調(diào)),那么至少需要仿真4 個(gè)點(diǎn),而仿真指令數(shù)量會(huì)增加約4 倍.增加的仿真工作量如果無(wú)法通過(guò)多次運(yùn)行均攤,那么profiling 后縮短預(yù)熱長(zhǎng)度的收益無(wú)法填補(bǔ)profiling的代價(jià)[20].
Fig.6 Warm up length search process圖6 預(yù)熱長(zhǎng)度搜索過(guò)程
面對(duì)預(yù)熱需求搜索的挑戰(zhàn),我們有2 個(gè)觀察:1)架構(gòu)模擬器的仿真速度是RTL 仿真器的100 倍左右(Verilator 仿真香山約1KCPS (cycle per second);GEM5約100KIPS(kilo instruction per second)),如果可以用架構(gòu)模擬器進(jìn)行profiling,那么整體的仿真時(shí)間就不會(huì)被profiling 拖累.2)相同的微結(jié)構(gòu)算法的不同實(shí)現(xiàn)經(jīng)過(guò)相同長(zhǎng)度的預(yù)熱之后留存的狀態(tài)往往是相似的.這是因?yàn)槭艿搅宋墨I(xiàn)[45]的啟發(fā),文獻(xiàn)[45]設(shè)計(jì)了簡(jiǎn)化的LRU 緩存用來(lái)恢復(fù)完整實(shí)現(xiàn)的LRU 緩存的狀態(tài),并取得了不錯(cuò)的準(zhǔn)確率,并在預(yù)熱需求上也觀察到了類似的現(xiàn)象,如圖7 所示,同為 32KB 的TAGE預(yù)測(cè)器,雖然由于循環(huán)預(yù)測(cè)器[46]和Statistical Corrector[47]的區(qū)別導(dǎo)致香山處理器與GEM5 的MPKI 存在差異,但是二者的預(yù)熱需求都在50M 條指令附近飽和(更多數(shù)據(jù)見(jiàn)4.2 節(jié)和4.3 節(jié)).綜合這2 個(gè)觀察,為了高效地搜索預(yù)熱需求,可以用微結(jié)構(gòu)算法、規(guī)格相似的架構(gòu)模擬器來(lái)近似估計(jì)RTL 的預(yù)熱需求.
Fig.7 Warm up demand of branch predictors in GEM5 simulator and Xiangshan processor圖7 GEM5 模擬器與香山處理器的分支預(yù)測(cè)器預(yù)熱需求
盡管我們努力縮短了負(fù)載的預(yù)熱時(shí)間,但是未能改變整體的仿真時(shí)間分布特征.圖2 中少量負(fù)載的仿真時(shí)長(zhǎng)顯著多于其它負(fù)載的現(xiàn)象仍然存在.這些檢查點(diǎn)在不恰當(dāng)?shù)卣{(diào)度下有可能大幅度增加總仿真時(shí)間,例如將運(yùn)行時(shí)間較長(zhǎng)的多個(gè)任務(wù)調(diào)度到同一個(gè)核.因此,合理地調(diào)度任務(wù)使負(fù)載均衡分配非常重要.
然而,在實(shí)際系統(tǒng)中,對(duì)Verilator 仿真任務(wù)的調(diào)度比傳統(tǒng)的作業(yè)調(diào)度更復(fù)雜:1)很難預(yù)知任務(wù)時(shí)長(zhǎng);2)Verilator 提供了多線程加速功能,如何在多線程非線性擴(kuò)展的情況下找到較好的調(diào)度策略是個(gè)問(wèn)題;3)多個(gè)仿真任務(wù)之間存在性能干擾.尤其是2)和3),使得本就是NP-hard 的任務(wù)調(diào)度問(wèn)題變得更加復(fù)雜.
為了預(yù)知任務(wù)時(shí)長(zhǎng),我們利用profiling 階段在架構(gòu)模擬器中得到的IPC 來(lái)估算仿真任務(wù)的周期數(shù)作為仿真時(shí)間的近似(Verilator 的總仿真時(shí)間與周期數(shù)正相關(guān)).文獻(xiàn)[43]表明,模擬器估算的每秒提交指令數(shù)(IPC)與RTL 的真實(shí)IPC 可能存在一定差距,但誤差一般在可接受范圍內(nèi),并且能較好地反映程序之間每秒提交指令數(shù)(IPC)的相對(duì)差距[43].這種排序的預(yù)測(cè)質(zhì)量可以用歸一化折現(xiàn)累積增益(normalized discounted cumulative gain,NDCG[48])描述.本文用GEM5 模擬器的模擬周期數(shù)排序來(lái)預(yù)測(cè)香山處理器的真實(shí)RTL 仿真時(shí)間排序效果較好,預(yù)測(cè)結(jié)果的NDCG 為0.88(1.0 為完美預(yù)測(cè)).
針對(duì)多線程調(diào)度問(wèn)題,發(fā)現(xiàn)在任務(wù)時(shí)長(zhǎng)分布不均時(shí),為長(zhǎng)任務(wù)開(kāi)啟多線程可以縮短仿真時(shí)間,如圖8 所示,調(diào)度2 比調(diào)度1 的完成時(shí)間更短.如表3所示,各種多線程選項(xiàng)中,系統(tǒng)整體吞吐最高的方案是4 線程.
Table 3 Comparison of Multi-threading Scaling Efficiency of Verilator Emulation When Server Load is Low表3 服務(wù)器低負(fù)載時(shí)Verilator 仿真的多線程擴(kuò)展效率對(duì)比
Fig.8 Impact of enabling multi-threading in Verilator on scheduling policy圖8 開(kāi)啟Verilator 多線程對(duì)調(diào)度策略的影響
然而,表3 實(shí)驗(yàn)結(jié)果未能考慮任務(wù)間的性能干擾.當(dāng)服務(wù)器的全部64 個(gè)核都被仿真任務(wù)占用時(shí),觀察到了相反的性能數(shù)據(jù):8 線程和16 線程下的每核IPS 高于4 線程,這可能與Verilator 巨大的訪存足跡有關(guān)[49],而這類訪存足跡巨大的應(yīng)用會(huì)在末級(jí)緩存或內(nèi)存帶寬對(duì)鄰居造成干擾[50-55].對(duì)比運(yùn)行單個(gè)4 線程任務(wù)和滿載運(yùn)行16 個(gè)4 線程任務(wù)下的性能計(jì)數(shù)器,發(fā)現(xiàn)滿載時(shí)的宿主機(jī)進(jìn)程IPC 比單任務(wù)時(shí)下降了約66%.
基于表3 和表4 的實(shí)驗(yàn),將每個(gè)64 核服務(wù)器劃分為N核的簇(N=8),總共有64/N= 8 個(gè)CPU 簇,并以CPU 簇為最小粒度進(jìn)行調(diào)度.雖然,將CPU 核分簇調(diào)度不一定能得到全局最優(yōu)調(diào)度,但是在考慮多核和系統(tǒng)干擾時(shí)最優(yōu)調(diào)度難以獲得,分簇調(diào)度至少是系統(tǒng)效率較高的一種方案.
Table 4 Comparison of Multi-threading Scaling Efficiency of Verilator Emulation When Server is Fully Loaded表4 服務(wù)器滿載時(shí)Verilator 仿真的多線程擴(kuò)展效率對(duì)比
在利用模擬器IPC 估算仿真時(shí)間和將服務(wù)器劃分為線程簇的基礎(chǔ)上,任務(wù)調(diào)度問(wèn)題可規(guī)約為傳統(tǒng)的作業(yè)調(diào)度問(wèn)題.雖然要保證圖9(c)的最優(yōu)調(diào)度非常困難(NP-hard)[56-59],但是我們希望避免出現(xiàn)圖9(a)那樣糟糕的調(diào)度.因此選擇了LJF.如圖9(b)所示,已有工作證明LJF 的最大完成時(shí)間在最差情況下是最優(yōu)調(diào)度的4/3[23-24,59].
Fig.9 Comparison of maximum completion time under different scheduling policies.圖9 不同的調(diào)度策略下最大完成時(shí)間對(duì)比
基于觀察和設(shè)計(jì)決策,本文提出了HyWarm 框架.HyWarm 分為3 部分:1)預(yù)熱需求搜索模塊Warm-Profiler,它會(huì)為每個(gè)檢查點(diǎn)列出3 段預(yù)熱需求區(qū)間((圖3).2)功能預(yù)熱加速模塊TLWarmer,它基于通用總線協(xié)議進(jìn)行緩存功能預(yù)熱.3)并行調(diào)度模塊,該部分利用WarmProfiler 得到的IPC 數(shù)據(jù)估算任務(wù)完成時(shí)間,以CPU 線程簇為粒度進(jìn)行LJF 調(diào)度.HyWarm 的工作流程如圖10 所示.WarmProfiler 首先會(huì)對(duì)不同的預(yù)熱長(zhǎng)度進(jìn)行嘗試(profiling),以獲得檢查點(diǎn)的全細(xì)節(jié)預(yù)熱長(zhǎng)度和功能預(yù)熱長(zhǎng)度;然后由TLWarmer 進(jìn)行功能預(yù)熱;在功能預(yù)熱之后,會(huì)根據(jù)模擬器的IPC 預(yù)測(cè)每個(gè)負(fù)載的仿真時(shí)間T,并按照LJF 調(diào)度依次運(yùn)行任務(wù).
Fig.10 Workflow of HyWarm圖10 HyWarm 工作流程
WarmProfiler 要搜索不同的預(yù)熱長(zhǎng)度以得到如圖6 所示的MPKI 曲線.本文選擇用9(1+N)個(gè)樣本點(diǎn)來(lái)繪制MPKI 曲線,樣本點(diǎn)的數(shù)量可以結(jié)合場(chǎng)景進(jìn)行調(diào)整.
關(guān)于樣本點(diǎn)的預(yù)熱長(zhǎng)度選取,在較長(zhǎng)的區(qū)間選擇幾何級(jí)數(shù)遞減的預(yù)熱長(zhǎng)度(100M,50M,25M,10M),在較短的區(qū)間采用等差數(shù)列遞減的預(yù)熱長(zhǎng)度(5M,4M,…,1M).我們沒(méi)有選擇樣本的預(yù)熱區(qū)間均勻長(zhǎng)度分布(100M,90M,…,10M),這是因?yàn)槲覀儼l(fā)現(xiàn)預(yù)熱需求較小的應(yīng)用占多數(shù),如果采用均勻分布會(huì)導(dǎo)致大量的應(yīng)用落到0~10M 的區(qū)間里并會(huì)選擇10M 的預(yù)熱長(zhǎng)度,即使它們的需求只有1M.
在搜索過(guò)程中,WarmProfiler 首先用最長(zhǎng)預(yù)熱長(zhǎng)度進(jìn)行仿真(比如100M 指令)以獲取基準(zhǔn)MPKI,然后嘗試尋找能達(dá)到MPKI 誤差閾值的最小預(yù)熱長(zhǎng)度.對(duì)余下的8(N)個(gè)點(diǎn),采用二分查找,最多需要運(yùn)行3lbN 種配置就能找到滿足要求的預(yù)熱長(zhǎng)度.
圖6 展示了一個(gè)樣本點(diǎn)數(shù)為5 的搜索過(guò)程,假設(shè)基準(zhǔn)點(diǎn)預(yù)熱200M,余下4 個(gè)點(diǎn)預(yù)熱分別為100M,50M,25M,12.5M.假設(shè)MPKI閾值系數(shù)為103%.首先測(cè)得200M 預(yù)熱下的MPKI=1.0;然后嘗試50M 預(yù)熱,得到的MPKI=1.04,其值大于MPKI閾值1.03,因此需要嘗試更長(zhǎng)的預(yù)熱;其次得到100M 預(yù)熱下的MPKI=1.01;最終從滿足要求(MPKI<1.03)的點(diǎn)中選擇預(yù)熱長(zhǎng)度最短的點(diǎn)(100M).該二分查找算法只在MPKI 與預(yù)熱長(zhǎng)度的函數(shù)關(guān)系單調(diào)遞減時(shí)保證選到滿足要求的最短預(yù)熱長(zhǎng)度.當(dāng)函數(shù)不是單調(diào)遞減時(shí),可能會(huì)無(wú)法選到最短預(yù)熱長(zhǎng)度,但是不會(huì)損失性能準(zhǔn)確度.在實(shí)踐中發(fā)現(xiàn),大部分應(yīng)用的MPKI 都是關(guān)于預(yù)熱長(zhǎng)度的單調(diào)函數(shù).這與之前的工作中預(yù)熱越長(zhǎng)MPKI 越低的觀察相符[14,17].
通常情況下,緩存MPKI 曲線與分支預(yù)測(cè)MPKI相互獨(dú)立,因此需要進(jìn)行2 次WarmProfiler 的搜索過(guò)程,分別找到緩存MPKI 飽和點(diǎn)和分支預(yù)測(cè)MPKI 飽和點(diǎn).假設(shè)緩存MPKI 的飽和預(yù)熱長(zhǎng)度為CW,分支預(yù)測(cè)MPKI 的飽和預(yù)熱長(zhǎng)度為BW.其中緩存預(yù)熱可以由功能預(yù)熱完成,而分支預(yù)測(cè)器需要全細(xì)節(jié)預(yù)熱.據(jù)此,可以計(jì)算出全細(xì)節(jié)預(yù)熱的長(zhǎng)度為BW,功能預(yù)熱的長(zhǎng)度為FW=max(0,CW-BW).在實(shí)踐中,因?yàn)楣δ茴A(yù)熱的速度往往比全細(xì)節(jié)預(yù)熱快1~2 個(gè)數(shù)量級(jí),因此也可以選擇固定的較長(zhǎng)的CW(比如100M,200M 等).
TLWarmer 的核心思想是利用像TileLink 這樣的總線協(xié)議給二級(jí)、三級(jí)緩存注入預(yù)熱后的緩存內(nèi)容.注入時(shí),用協(xié)議定義的接口向緩存發(fā)送訪存請(qǐng)求,并從相應(yīng)的緩存塊取出緩存.值得討論的是應(yīng)該發(fā)送完整的訪存請(qǐng)求還是經(jīng)過(guò)過(guò)濾的訪存請(qǐng)求.
為了完成緩存注入,有2 種技術(shù)路線:第1 種路線是發(fā)送完整的訪存請(qǐng)求,即按程序順序依次發(fā)送所有的訪存指令到緩存中,并由RTL 的緩存替換算法決定留下哪些緩存塊.第2 種路線是用模擬器的替換算法作為過(guò)濾器,只將最終留存于緩存中的塊按照LRU 順序注入RTL 緩存中.因?yàn)榫彺鎵K的數(shù)量一般遠(yuǎn)少于訪存請(qǐng)求的數(shù)量,可以縮短功能預(yù)熱的時(shí)間,所以我們選擇了第2 種路線.為了方便起見(jiàn),本文把第2 種路線命名為Filter 模式.
圖11 展示了Filter 模式下的典型工作流程.首先用功能模擬器生成訪存trace(一般只需20 s 左右即可采集200M 指令的trace),然后在緩存模擬器中重放這些trace,從而使緩存模擬器按某種替換算法留下緩存塊.在緩存模擬器中留存的緩存塊會(huì)通過(guò)TileLink 協(xié)議注入到緩存子系統(tǒng)中,緩存子系統(tǒng)如圖12 所示.注入過(guò)程需要RTL 緩存子系統(tǒng)接收并處理128k 個(gè)訪存請(qǐng)求(8MB/64B),該過(guò)程消耗的時(shí)間一般是幾十分鐘.
Fig.11 Workflow of Filter mode圖11 Filter 模式的工作流程
Fig.12 Cache subsystem that receives TileLink requests圖12 接收TileLink 請(qǐng)求的緩存子系統(tǒng)
在完成緩存子系統(tǒng)預(yù)熱之后,下一個(gè)挑戰(zhàn)是現(xiàn)代處理器的緩存并不是一塊簡(jiǎn)單的SRAM,而是需要分bank 和分塊(block)[4,60],導(dǎo)致一塊緩存經(jīng)常包含幾十個(gè)SRAM 實(shí)例.為此,我們利用Chisel/Firrtl 實(shí)現(xiàn)了自動(dòng)化的SRAM 轉(zhuǎn)儲(chǔ)和恢復(fù):首先在Chisel 中選擇需要功能預(yù)熱的緩存模塊,并為這些模塊包含的SRAM對(duì)象打上標(biāo)記;然后在Firrtl 中對(duì)帶標(biāo)記的SRAM 對(duì)象自動(dòng)生成轉(zhuǎn)儲(chǔ)和恢復(fù)的代碼;最后當(dāng)緩存塊注入完成后,緩存子系統(tǒng)的SRAM 中的數(shù)據(jù)會(huì)被轉(zhuǎn)儲(chǔ)到很多個(gè)文件中,然后完整的SoC 啟動(dòng)時(shí)會(huì)將這些文件加載到對(duì)應(yīng)的SRAM 中.
本文將64 核處理器核劃分為8 個(gè)8 核的CPU 簇,然后在此基礎(chǔ)上對(duì)所有任務(wù)進(jìn)行LJF 調(diào)度:每完成一個(gè)任務(wù),挑選剩下的任務(wù)中時(shí)長(zhǎng)最長(zhǎng)的任務(wù)運(yùn)行.為了實(shí)現(xiàn)LJF 調(diào)度,需要知道任務(wù)時(shí)長(zhǎng)排序,本文用任務(wù)的預(yù)估仿真周期數(shù)排序來(lái)替代任務(wù)時(shí)長(zhǎng)排序.任務(wù)的預(yù)估仿真周期數(shù)是根據(jù)WarmProfiler 的架構(gòu)模擬器的IPC 估算的,即預(yù)估周期數(shù) 等于負(fù)載指令數(shù)和IPC 相除.
本節(jié)介紹HyWarm 帶來(lái)的性能評(píng)估速度的收益.首先展示W(wǎng)armProfiler 對(duì)SPECCPU?的預(yù)熱需求的分析,以及功能預(yù)熱能減少的仿真指令數(shù);然后展示檢查點(diǎn)的準(zhǔn)確率和仿真時(shí)間對(duì)比,以證明功能預(yù)熱能兼顧準(zhǔn)確度和速度;最后展示負(fù)載的運(yùn)行時(shí)間分布不均的問(wèn)題,以及如何通過(guò)分簇調(diào)度來(lái)緩解少數(shù)負(fù)載仿真時(shí)間過(guò)長(zhǎng)的問(wèn)題.
1)實(shí)驗(yàn)配置.本文選取的實(shí)驗(yàn)負(fù)載是SPECCPU?2006 中用SimPoint 選取的檢查點(diǎn)[10].由于實(shí)驗(yàn)需要測(cè)試大量的預(yù)熱長(zhǎng)度配置,為了縮短測(cè)試時(shí)間,本文為每一個(gè)子項(xiàng)的每一個(gè)輸入數(shù)據(jù)選取權(quán)重最大的Sim-Point 檢查點(diǎn)來(lái)進(jìn)行實(shí)驗(yàn).本文實(shí)驗(yàn)所采用的香山處理器架構(gòu)配置如表5 所示.重放訪存trace 所使用的緩存模擬器的規(guī)格與香山處理器的緩存規(guī)格一致[4].
Table 5 Microarchitectural Configuration表5 微結(jié)構(gòu)配置
2)測(cè)量指標(biāo).本文研究預(yù)熱長(zhǎng)度時(shí)所使用的指標(biāo)主要包括每條指令周期數(shù)(CPI)、一級(jí)緩存缺失懲罰(L1MP,一級(jí)緩存缺失時(shí)等待響應(yīng)的周期數(shù))、分支跳轉(zhuǎn)MPKI.其中,L1MP 用于討論緩存預(yù)熱效果,BMPKI 用于討論分支預(yù)測(cè)器預(yù)熱效果,CPI 用于討論整體預(yù)熱效果.因?yàn)樵诂F(xiàn)有的三級(jí)緩存實(shí)現(xiàn)中較難區(qū)分來(lái)自二級(jí)緩存的demand 請(qǐng)求和預(yù)取請(qǐng)求,所以三級(jí)緩存MPKI 未被納入對(duì)比指標(biāo).雖然沒(méi)有包含三級(jí)緩存MPKI 的數(shù)據(jù),但是L1MP 能體現(xiàn)三級(jí)緩存中demand miss 帶來(lái)的性能損失.
圖13 展示了WarmProfiler 在492 個(gè)SPECCPU?檢查點(diǎn)上搜索預(yù)熱需求的結(jié)果.本文首先統(tǒng)計(jì)了每個(gè)檢查點(diǎn)的總預(yù)熱需求,即取分支預(yù)測(cè)器預(yù)熱需求和緩存預(yù)熱需求的較大值.如果沒(méi)有WarmProfiler,對(duì)所有的檢查點(diǎn)都需要保守地運(yùn)行100M 指令的預(yù)熱.相反地,有了WarmProfiler 的指導(dǎo),只有19 個(gè)檢查點(diǎn)需要100M 預(yù)熱和只有47 個(gè)檢查點(diǎn)需要50M 預(yù)熱.相對(duì)于100M 預(yù)熱的baseline,WarmProfiler 將總的預(yù)熱指令數(shù)減少了85.7%.
Fig.13 Distribution of warm up demand (the number of instructions) or checkpoints.圖13 檢查點(diǎn)的預(yù)熱需求(指令數(shù))分布
此外,因?yàn)門(mén)LWarmer 預(yù)熱緩存不依賴于全細(xì)節(jié)預(yù)熱,只考慮分支預(yù)測(cè)器預(yù)熱,所以全細(xì)節(jié)預(yù)熱的需求可以被進(jìn)一步壓縮:只有2 個(gè)檢查點(diǎn)需要100M 的全細(xì)節(jié)預(yù)熱和只有9 個(gè)檢查點(diǎn)需要50M 的全細(xì)節(jié)預(yù)熱.如果以100M 全細(xì)節(jié)預(yù)熱為基線,總的全細(xì)節(jié)預(yù)熱指令數(shù)減少 了95.6%.在WarmProfiler 中,本文借助了GEM5 這樣的架構(gòu)模擬器來(lái)搜索合適的預(yù)熱需求.為了驗(yàn)證GEM5 所獲得的預(yù)熱需求是否與RTL的實(shí)際預(yù)熱需求一致,本文對(duì)比了每個(gè)子項(xiàng)權(quán)重最大的檢查點(diǎn)在GEM5 和RTL 上的預(yù)熱需求曲線,并發(fā)現(xiàn)當(dāng)GEM5 的參數(shù)與RTL 一致時(shí),GEM5 與RTL的預(yù)熱需求的趨勢(shì)也較為接近.如圖14 所示,多數(shù)子項(xiàng)的模擬器和RTL 的分支預(yù)熱需求一致.而像gobmk.trevoc這樣的子項(xiàng)在GEM5 上展示出了比RTL 更長(zhǎng)或更短的預(yù)熱需求.如果預(yù)熱需求預(yù)測(cè)偏長(zhǎng)會(huì)導(dǎo)致執(zhí)行仿真時(shí)間增長(zhǎng);而預(yù)熱需求預(yù)測(cè)偏短會(huì)導(dǎo)致分支MPKI 偏高.根據(jù)本文的實(shí)驗(yàn)結(jié)果,預(yù)測(cè)偏短導(dǎo)致分支MPKI 偏高超0.1 的負(fù)載占比為7.5%(4/53),詳細(xì)數(shù)據(jù)在4.3 節(jié)給出.
Fig.14 Warm up demand curve of GEM5 simulator and Xiangshan processor圖14 GEM5 模擬器與香山處理器的預(yù)熱需求曲線
除此之外,我們還發(fā)現(xiàn)了部分應(yīng)用對(duì)預(yù)熱長(zhǎng)度并不敏感.以緩存為例,通過(guò)計(jì)算了各個(gè)子項(xiàng)的一級(jí)緩存缺失懲罰(L1MP)與預(yù)熱長(zhǎng)度之間的相關(guān)性(Pearson’s correlation),在53 個(gè)負(fù)載中,34 個(gè)負(fù)載的L1MP 與預(yù)熱長(zhǎng)度的相關(guān)性小于-0.5(我們預(yù)期L1MP與預(yù)熱長(zhǎng)度負(fù)相關(guān)),但是余下19 個(gè)負(fù)載沒(méi)有顯著的負(fù)相關(guān).例如GemsFDTD,lbm,libquantum等負(fù)載的L1MP,L2 MPKI 均與預(yù)熱長(zhǎng)度沒(méi)有明顯的相關(guān)性,我們將這類負(fù)載稱為預(yù)熱不敏感應(yīng)用.在接下來(lái)討論預(yù)熱效果時(shí),本文僅討論緩存或分支預(yù)熱敏感型負(fù)載.
本節(jié)主要展示了功能預(yù)熱和混合預(yù)熱能在節(jié)約仿真時(shí)間的同時(shí)兼顧性能準(zhǔn)確率.我們主要對(duì)比不同方案的仿真完成時(shí)間和性能準(zhǔn)確率.對(duì)比了當(dāng)性能測(cè)量長(zhǎng)度為5M 條指令時(shí)的多種預(yù)熱方案見(jiàn)表6,其中配置X+Y表示長(zhǎng)度為X的功能預(yù)熱之后進(jìn)行長(zhǎng)度為Y的全細(xì)節(jié)預(yù)熱,Ada 表示根據(jù)WarmProfiler 的結(jié)果選取的預(yù)熱方案,F(xiàn)ixedFW(95+5)則是在沒(méi)有WarmProfiler 的指導(dǎo)下進(jìn)行固定長(zhǎng)度的功能預(yù)熱和全細(xì)節(jié)預(yù)熱.
Table 6 Warm up Configurations表6 預(yù)熱配置
圖15 展示了不同預(yù)熱方案相對(duì)于100M 全細(xì)節(jié)預(yù)熱的L1MP 增幅.實(shí)驗(yàn)結(jié)果表明FixedFW (95+5)的混合預(yù)熱方案顯著優(yōu)于0+5 的全細(xì)節(jié)預(yù)熱方案,這體現(xiàn)了功能預(yù)熱的有效性.Ada 和FixedFW 部分負(fù)載的L1MP 比100M 預(yù)熱的基線更低(出現(xiàn)了負(fù)值),這可能與替換算法、預(yù)取算法有關(guān),因?yàn)門(mén)LWarmer 只能恢復(fù)緩存的SRAM 中的內(nèi)容,不能恢復(fù)預(yù)取器和影響塊替換的metadata 的狀態(tài).對(duì)一部分負(fù)載,這會(huì)讓有用的緩存塊更容易留下,而對(duì)另一部分負(fù)載會(huì)讓有用的緩存塊更容易被替換.這也解釋了為什么FixedFW(95+5)的方案無(wú)法達(dá)到100M 的全細(xì)節(jié)預(yù)熱基線的L1MP.
Fig.15 Impact of different warm up schemes on L1MP圖15 不同預(yù)熱方案對(duì)L1MP 的影響
從仿真總時(shí)間來(lái)看,功能預(yù)熱的時(shí)間取決于需要恢復(fù)的緩存塊的個(gè)數(shù),一般僅需要5~30 min.得益于此,混合功能預(yù)熱方案FixedFW(38.5 h)只需要比0+5 方案(35.8 h)略多的總仿真時(shí)間,就能獲得與0+25 相當(dāng)?shù)木彺骖A(yù)熱效果,見(jiàn)表7.
Table 7 Comparison of Total Simulation Time for Different Functional Warm up Schemes表7 不同功能預(yù)熱方案的總仿真時(shí)長(zhǎng)對(duì)比 h
從4.2 節(jié)的性能評(píng)估結(jié)果可以看出,負(fù)載的預(yù)熱需求往往是隨著負(fù)載特征變化的,盲目地選取FixedFW (95+5)的方案實(shí)際上無(wú)法適應(yīng)這種變化.而在WarmProfiler 的支持下,可以選擇出對(duì)性能評(píng)估準(zhǔn)確度犧牲較小,同時(shí)又節(jié)約時(shí)間的全細(xì)節(jié)預(yù)熱長(zhǎng)度.在圖15、圖16 和圖17 中由WarmProfiler 指導(dǎo)的混合預(yù)熱方案被標(biāo)注為Ada (adaptive),數(shù)據(jù)點(diǎn)按FixedFW 方案的相對(duì)增幅排序.實(shí)驗(yàn)結(jié)果表明,自適應(yīng)混合預(yù)熱達(dá)到了與0+25 接近的準(zhǔn)確率見(jiàn)表8;而所需的總串行仿真時(shí)間為54.40 h,僅略大于0+10 方案,見(jiàn)表7.
Table 8 Accuracy Comparison of Different Schemes表8 不同方案準(zhǔn)確率對(duì)比%
Fig.16 Impact of different warm up schemes on branch MPKI圖16 不同預(yù)熱方案對(duì)分支MPKI 的影響
Fig.17 Impact of different warm up schemes on CPI圖17 不同預(yù)熱方案對(duì)CPI 的影響
gamess_cytosine 是一個(gè)體現(xiàn)自適應(yīng)預(yù)熱優(yōu)勢(shì)的例子,在使用FixedFW 混合預(yù)熱方案時(shí),gamess_cytosine的L1MP,分支MPKI 和CPI 增幅都較大.而Warm-Profiler 的全細(xì)節(jié)預(yù)熱需求很大,即使0+50 的全細(xì)節(jié)預(yù)熱也無(wú)法使它的分支MPKI 達(dá)到接近0+100 的情況.因此,為了保證準(zhǔn)確性,WarmProfiler 直接為gamess_cytosine 選擇了0+100 的預(yù)熱方案.在gamess_triazolium上,也看到了類似的現(xiàn)象,WarmProfiler 選擇了75+25的混合預(yù)熱方案.
本文將基于模擬器的預(yù)熱需求預(yù)測(cè)和完美預(yù)測(cè)作了對(duì)比,其中完美預(yù)測(cè)直接利用RTL 進(jìn)行預(yù)熱需求搜索,得到分支預(yù)測(cè)器預(yù)熱飽和點(diǎn).表9 列出了所有GEM5 預(yù)測(cè)預(yù)熱需求偏低造成MPKI 偏高的負(fù)載點(diǎn)(因?yàn)楦偷腗PKI 更接近完整的100M 預(yù)熱,所以我們認(rèn)為MPKI 更低是更準(zhǔn)確的表現(xiàn)),其中僅4個(gè)負(fù)載點(diǎn)遭遇了超過(guò)0.1 的分支MPKI 誤差.而根據(jù)計(jì)算,0.1 的分支MPKI 誤差導(dǎo)致的CPI 誤差一般不超過(guò)0.3%.在預(yù)熱時(shí)間方面,本文的實(shí)驗(yàn)結(jié)果表明,模擬器預(yù)測(cè)的預(yù)熱飽和點(diǎn)誤差造成了8.85%的額外仿真時(shí)間.作為對(duì)比,直接用RTL 進(jìn)行預(yù)熱需求搜索會(huì)增加數(shù)倍的時(shí)間,因此用模擬器預(yù)測(cè)預(yù)熱需求更加高效.
Table 9 Branch MPKI Prediction Error Caused by WarmProfiler (increase)表9 WarmProfiler 的分支MPKI 預(yù)測(cè)誤差(增高)
雖然本文的方案大幅縮短了預(yù)熱所需指令數(shù),但是并不能改變總仿真時(shí)間在每個(gè)負(fù)載上的分布.少數(shù)負(fù)載仍然因?yàn)轭A(yù)熱指令較多、IPC 較低導(dǎo)致仿真周期數(shù)顯著長(zhǎng)于其他負(fù)載.如圖18 所示,檢查點(diǎn)的仿真周期數(shù)非常不均衡,如果簡(jiǎn)單地讓53 個(gè)負(fù)載并行地開(kāi)始仿真,那么仿真的后半段會(huì)只剩下幾個(gè)最慢的負(fù)載.這個(gè)問(wèn)題并不僅存在于自適應(yīng)預(yù)熱方案,負(fù)載時(shí)長(zhǎng)不均衡在普通預(yù)熱方案下也存在(見(jiàn)圖5).
Fig.18 Distribution of total detailed simulation cycle counts for 53 workloads using adaptive warm up圖18 使用自適應(yīng)預(yù)熱時(shí)53 個(gè)負(fù)載的全細(xì)節(jié)仿真周期數(shù)分布
2.2 節(jié)中的例子定性說(shuō)明了CPU 多核并行仿真給調(diào)度帶來(lái)的好處,本文的實(shí)驗(yàn)結(jié)果印證了分簇的收益.首先定義了調(diào)度均衡度用于描述負(fù)載均衡的程度:調(diào)度均衡度=平均完成時(shí)間/最長(zhǎng)完成時(shí)間.其次對(duì)比了64 核下3 種配置的調(diào)度均衡度.如表10 所示,在同樣的負(fù)載集下,CPU 簇?cái)?shù)量越少,調(diào)度均衡度越高,無(wú)論是隨機(jī)調(diào)度還是LJF 調(diào)度.這說(shuō)明CPU簇越少,調(diào)度的“難度”越低,越容易達(dá)到均衡的調(diào)度.而從另一個(gè)角度看,LJF 總是能獲得比隨機(jī)調(diào)度更高的均衡度.在端到端性能對(duì)比中,見(jiàn)表11,同樣能看到LJF 的優(yōu)勢(shì):在多種配置下,LJF 比隨機(jī)調(diào)度節(jié)省了11%~20%的時(shí)間.
Table 10 Impact of Cluster Count on Scheduling Balance表10 簇的數(shù)量對(duì)調(diào)度均衡度的影響
為了探究通過(guò)架構(gòu)模擬器的IPC 預(yù)測(cè)仿真時(shí)間帶來(lái)的影響,本文對(duì)比了通過(guò)模擬器預(yù)測(cè)和先知預(yù)測(cè)的調(diào)度結(jié)果(先知預(yù)測(cè),即用RTL 的真實(shí)IPC 進(jìn)行LJF 調(diào)度).表12 的結(jié)果表明模擬器預(yù)測(cè)對(duì)調(diào)度結(jié)果的影響很小,這是因?yàn)镚EM5 預(yù)測(cè)香山處理器仿真時(shí)間的NDCG 較高(見(jiàn)2.2 節(jié)),非常接近真實(shí)仿真時(shí)間的排序.
Table 12 Maximum Completion Time of LJF Scheduling Guided by Simulator IPC and Real IPC of RTL表12 采用模擬器IPC 和RTL 的真實(shí)IPC 指導(dǎo)LJF調(diào)度的最大完成時(shí)間h
本節(jié)討論3 個(gè)設(shè)計(jì)決策的局限性.
1)在用訪存指令實(shí)現(xiàn)功能預(yù)熱方面.在此前的體系結(jié)構(gòu)相關(guān)工作中,有工作[45]嘗試用訪存時(shí)間戳的方式維護(hù)一個(gè)軟件LRU 緩存,用于功能預(yù)熱.實(shí)際實(shí)現(xiàn)時(shí),除了像本文一樣通過(guò)緩存協(xié)議注入外,還可以選擇從訪存時(shí)間戳生成一系列訪存指令,將需要預(yù)熱的緩存塊加載到緩存.在實(shí)際操作中,后者具有更好的可遷移性,但是其存在2 方面的問(wèn)題:一是預(yù)熱指令本身會(huì)在緩存中留下足跡,影響預(yù)熱結(jié)果;二是預(yù)熱時(shí)的訪存并發(fā)度依賴于處理器的流水線設(shè)計(jì)、指令窗口大小、MSHR 數(shù)量配置,在比較保守的配置下訪存并發(fā)度較低、預(yù)熱速度較慢.
2)在功能預(yù)熱方面.本文沒(méi)有解決分支預(yù)測(cè)組件的功能預(yù)熱問(wèn)題,因?yàn)榉种ьA(yù)測(cè)組件普遍采用私有接口,并且接口隨架構(gòu)發(fā)生變化.
3)在任務(wù)調(diào)度方面.本文未展開(kāi)更細(xì)粒度的分簇方式的探索,以及未找到理論最優(yōu)調(diào)度策略.
在技術(shù)方面,本文提出了較為通用的RTL 緩存功能預(yù)熱解決方案和預(yù)熱需求搜索方案.這些方案具有普適性,可以將類似的思路應(yīng)用于AMBA 協(xié)議的緩存和用于其他指令集/微架構(gòu)處理器.在負(fù)載特征刻畫(huà)方面,本文指出了當(dāng)前CPU 仿真的負(fù)載運(yùn)行時(shí)長(zhǎng)分布嚴(yán)重不均的問(wèn)題,這是因?yàn)樨?fù)載IPC 分布不均、預(yù)熱需求分布不均.時(shí)長(zhǎng)分布嚴(yán)重不均導(dǎo)致了要最小化最大完成時(shí)間,現(xiàn)階段需要加速的就是仿真指令數(shù)最多的應(yīng)用.因此,未來(lái)的工作可以關(guān)注如何繼續(xù)減少全細(xì)節(jié)仿真的指令數(shù),以及提高仿真器仿真效率.
作者貢獻(xiàn)聲明:周耀陽(yáng)完成部分實(shí)驗(yàn)開(kāi)發(fā)任務(wù)、整理和分析數(shù)據(jù),并撰寫(xiě)論文;韓博陽(yáng)、藺嘉煒、王凱帆、張林雋完成部分實(shí)驗(yàn)開(kāi)發(fā)任務(wù);余子濠、唐丹、王卅、孫凝暉、包云崗提供實(shí)驗(yàn)開(kāi)發(fā)思路, 給予工作支持和指導(dǎo)意見(jiàn).