張乾龍 侯 銳 楊思博 趙博彥 張立新
1(中國科學院計算技術(shù)研究所 北京 100190)2(中國科學院大學 北京 100049)3(中國科學院信息工程研究所 北京 100093)4(北京大學軟件與微電子學院 北京 100871)(zhangqianlong@ict.ac.cn)
模擬器是體系結(jié)構(gòu)量化分析的重要手段,對架構(gòu)設(shè)計、芯片開發(fā)有重要的指導作用.基于模擬器輔助進行集成電路設(shè)計可以追溯到1980年代[1],自此模擬器便一直是處理器設(shè)計過程中不可或缺的工具.在芯片開發(fā)過程中,體系結(jié)構(gòu)模擬器可以縮短處理器的設(shè)計時間,降低開發(fā)成本,其具體作用如圖1所示:
由圖1可知:
1)在芯片開發(fā)早期,基于模擬器可以進行微結(jié)構(gòu)探索和粗粒度微結(jié)構(gòu)定義,此時模擬器的開發(fā)抽象層次較高.
2 )隨著處理器設(shè)計的不斷推進和模擬器的不斷完善,基于模擬器可以持續(xù)對芯片微結(jié)構(gòu)進行評估、修改和取舍.
3)當模擬器趨于成熟,可以對微結(jié)構(gòu)、多核互聯(lián)系統(tǒng)、一致性協(xié)議等進行詳細性能分析,基于分析結(jié)果對微結(jié)構(gòu)進行微調(diào).
4 )在對處理器邏輯設(shè)計進行驗證的階段,模擬器可以作為參考模型輔助進行驗證,可以快速定位邏輯設(shè)計錯誤.
5)在未流片之前基于模擬器就可以開展系統(tǒng)軟件開發(fā)和適配工作,這樣可以在芯片流片結(jié)束后以最快速度啟動系統(tǒng)軟件.
6)流片結(jié)束后,基于模擬器可以輔助進行芯片硅后驗證環(huán)境的搭建以及測試用例編寫工作.為了保證模擬器可以順利輔助進行處理器設(shè)計,在整個芯片開發(fā)過程中,需要持續(xù)對模擬器進行校準,通過持續(xù)對比模擬器和寄存器傳輸層(register-transfer level,RTL)之間的差別,可以互相校準并發(fā)現(xiàn)模擬器或者RTL的設(shè)計錯誤.
處理器設(shè)計的很多創(chuàng)新思想來源于體系結(jié)構(gòu)學術(shù)研究,而學術(shù)研究使用的模擬器大多是開源模擬器,因此開源模擬器對于處理器設(shè)計有重大的意義.開源模擬器主要用于對處理器進行抽象建模并驗證創(chuàng)新思想,因此開源模擬器對于學術(shù)研究有2種很大的價值:1)不同的開源模擬器具有不同特點,因此研究人員可以根據(jù)所研究的內(nèi)容選擇合適的開源模擬器平臺進行實驗,這給學術(shù)研究提供了很高的靈活性,有助于快速實現(xiàn)原型系統(tǒng);2)開源模擬器的社區(qū)一般比較活躍,在原型系統(tǒng)實現(xiàn)過程中,如果遇到問題可以很快找到解決方案,從而快速構(gòu)建實驗用的原型系統(tǒng).
但是從輔助進行處理器設(shè)計的角度看,開源模擬器有一定的局限性.如果處理器廠商基于開源的模擬器輔助進行處理器設(shè)計,需要首先解決2個問題:
1)各處理器廠商的微結(jié)構(gòu)一般與開源模擬器的微結(jié)構(gòu)差別很大,因此修改模擬器的代價較大.例如gem5模擬器中亂序執(zhí)行流水線的設(shè)計主要參考的是Alpha 21264[2],基于此進行微結(jié)構(gòu)修改的工程量比較大.此外,由于模擬器開發(fā)是一項較大的軟件工程,而軟件工程的框架一旦確定,修改起來也會比較棘手.
2)開源模擬器一般不會與具體某款處理器進行校準工作,因此一般無法直接基于某款開源模擬器進行處理器驗證.文獻[3]指出:gem5等開源模擬器有很多未知錯誤,例如流水線中不合理的寫回機制、生成微指令過程錯誤等.另外由于gem5對于訪存子系統(tǒng)模擬精度不夠,大小為512×512的矩陣運算在gem5模擬器上運算誤差可以達到23.38%,并隨著訪存通信量越大誤差越大[4].此外文獻[5]通過對比真實的ARM平臺,指出gem5全系統(tǒng)模擬誤差也非??捎^.因此基于該模擬器二次開發(fā)用于輔助處理器設(shè)計的模擬器需要首先修復上述開源模擬器誤差和錯誤.
但是,基于開源模擬器二次開發(fā)用于輔助進行處理器設(shè)計的模擬器也有好處.開源模擬器中提供的工具可以直接使用,降低工具及模擬器相關(guān)庫開發(fā)成本,例如SimpleScalar工具集提供了功耗模擬器WATTCH[6],用于選擇模擬樣本的SimPoint[7]等.
模擬器是體系結(jié)構(gòu)量化分析的重要手段,從輔助進行處理器設(shè)計的角度看,計算機體系結(jié)構(gòu)模擬器可以分為3類,如圖2所示.
Fig.2 Classification of simulators used in CPU design圖2 輔助處理器設(shè)計的模擬器分類
由圖2可知:1)微結(jié)構(gòu)探索和性能優(yōu)化,為了精準模擬處理器微結(jié)構(gòu)并提高模擬器運行速度,同時為了方便開發(fā)和維護,一般會繼續(xù)細分為單核性能模擬器和多核互聯(lián)性能模擬器;2)輔助進行系統(tǒng)軟件開發(fā);3)輔助進行處理器驗證.現(xiàn)代處理器設(shè)計廠商普遍自研適配于自家處理器架構(gòu)的模擬器.本節(jié)根據(jù)處理器廠商公開發(fā)表的通過模擬器輔助進行處理器設(shè)計的經(jīng)驗進行分析并總結(jié)規(guī)律.
龍芯中科技術(shù)有限公司在使用模擬器輔助處理器設(shè)計的文獻中提到[8-10],龍芯2號處理器研發(fā)過程中,最早開發(fā)的模擬器ICT-Godson由于對硬件模擬過于詳細,導致其速度和靈活性不足[10].因此,龍芯基于Simple-Scalar開源模擬器[11]框架設(shè)計實現(xiàn)了Sim-Godson處理器核模擬器[8].相比于ICT-Godson模擬器,Sim-Godson具有運行速度快、靈活性高、支持大程序評估等優(yōu)點[10].Sim-Godson可以支持功能模擬和時序模擬,由二進制可執(zhí)行程序作為輸入,主要用于處理器核的微結(jié)構(gòu)性能探索.Sim-Godson雖然借用了SimpleScalar的基礎(chǔ)模塊,但龍芯中科技術(shù)有限公司對其進行了大量修改定制工作,使其達到高精準模擬龍芯2號處理器核微結(jié)構(gòu)的目的.基于SimpleScalar中自帶的指令集仿真器和I/O仿真器進行執(zhí)行加速,其速度可以達到0.5MIPS(million instructions per second).經(jīng)過詳細校準,Sim-Godson模擬器與ICT-Godson的誤差平均不到5%[8].類似地,基于Simple-Scalar進行二次開發(fā)的模擬器還有Sim-alpha[12].
基于Sim-Godson模擬器可以對單核微結(jié)構(gòu)進行性能評估和分析,但是由于SimpleScalar的結(jié)構(gòu)本身不支持對多核互聯(lián)系統(tǒng)進行模擬,因此龍芯中科技術(shù)有限公司基于SimOS[13]全系統(tǒng)開源模擬器開發(fā)了SimOS-Goodson模擬器[9].借用SimOS模擬器的全系統(tǒng)組件,龍芯中科技術(shù)有限公司把處理器核模擬器嵌入其中,并解決了因為功能模擬和時序模擬并行執(zhí)行導致的存儲一致性問題,同時添加了全系統(tǒng)相關(guān)功能和調(diào)試功能.定制修改后的SimOS-Goodson配置靈活、執(zhí)行迅速、模擬準確,同時支持用戶態(tài)和全系統(tǒng)模擬,模擬速度可達0.3MIPS,模擬誤差在15%以內(nèi).類似地,DEC和IBM也曾基于SimOS開發(fā)全系統(tǒng)模擬器SimOS-Alpha[14]和SimOS-PPC[15].
IBM于2012年某研討會中做了題為“IBM使用模擬器的經(jīng)驗”的報告[16],對于IBM如何在處理器設(shè)計過程中使用模擬器進行了介紹.
在處理器早期設(shè)計研究期間,IBM使用Mambo[17]模擬器的時鐘精確模式進行微結(jié)構(gòu)探索和粗粒度微結(jié)構(gòu)定義.Mambo模擬器對微結(jié)構(gòu)主要模塊和結(jié)構(gòu)進行了模擬,該階段Mambo由蹤跡(trace)驅(qū)動,主要運行和研究用戶態(tài)應用,對處理器的產(chǎn)品競爭力進行橫向比較研究[16].
在微結(jié)構(gòu)設(shè)計實現(xiàn)期間,IBM使用基于公司內(nèi)部專用“T”語言編寫的時鐘精準模擬器M1進行詳細模擬處理器微結(jié)構(gòu)[16],如圖3所示.M1是以Mambo模擬器或者硬件上抓取的蹤跡作為輸入,并且可以收集非常詳細的微結(jié)構(gòu)數(shù)據(jù)進行性能評估.為了加速M1模擬器的執(zhí)行速度,需要對所抓取的蹤跡進行取樣,同時為了方便調(diào)試,M1支持微結(jié)構(gòu)性能數(shù)據(jù)可視化功能.
Fig.3 IBM CPU simulator framework圖3 IBM模擬器框架
在處理器驗證階段,IBM使用Mambo[17]作為處理器驗證參考模型輔助進行驗證,此階段Mambo可以為處理器功能正確性提供參考結(jié)果.Mambo模擬了所有處理器的功能特征,把某些性能相關(guān)的微結(jié)構(gòu)維護操作(例如cache維護類指令)翻譯成空(nop)操作,對于計算類指令產(chǎn)生準確的結(jié)果,并精準追蹤處理器寄存器的狀態(tài)變化,同時支持指令撤銷操作,為處理器驗證提供參考.IBM基于Mambo模擬器曾發(fā)現(xiàn)PowerPC CPU的一個控制寄存器存在競爭條件,使得該設(shè)計錯誤在流片之前就被發(fā)現(xiàn)并修改[17].在該階段,IBM還使用自研的由多個FPGA(field programmable gate array)組成的VHDL(very - high - speed integrated circuit hardware description language)仿真加速器Twinstar[18]進行處理器綜合驗證.Twinstar是時鐘精準的仿真加速器,其推進方式是事件驅(qū)動模式,可以對整個處理器芯片進行仿真,以二進制程序作為輸入,還支持詳細的指令蹤跡和處理器狀態(tài)的實時追蹤.該平臺運行速度可以達到4 MHz并可以運行未經(jīng)修改的系統(tǒng)軟件.類似Twinstar的驗證平臺還有帕拉丁[19]等.
在系統(tǒng)軟件開發(fā)方面,IBM基于Mambo(加速模式)[17],Simics[20],BGLsim[21]等多種平臺,在流片之前就開始進行固件、操作系統(tǒng)、虛擬機管理器等軟件的早期開發(fā).IBM基于Mambo模擬器曾開發(fā)了K42操作系統(tǒng),在芯片可用之后1周內(nèi)就啟動了操作系統(tǒng)[17].IBM基于BGLsim-multi[21]平臺和基于OMNeT++[22]開發(fā)的MARS(message passing interface application replay simulation)模擬平臺還可以對機群網(wǎng)絡(luò)相關(guān)的功能進行模擬,模擬器由可執(zhí)行程序或者蹤跡驅(qū)動,其中MARS平臺還可以對MPI(message passing interface)類應用進行調(diào)優(yōu).
AMD于2007年ISPASS討論會上做了題目為“AMD性能建模和分析:游歷指南”的主旨發(fā)言,介紹了AMD如何使用模擬器輔助進行處理器設(shè)計和驗證[23].此外,在2018年AMD做過題為“現(xiàn)代服務(wù)器CPU性能分析”的報告[24],其中也提到了模擬器在AMD服務(wù)器處理器設(shè)計中的輔助作用.
在處理器研發(fā)早期,AMD通過模擬器對體系結(jié)構(gòu)進行粗粒度定義[23],還使用功能模擬器SimNow[25]輔助進行處理器設(shè)計,例如產(chǎn)生程序執(zhí)行蹤跡、為CPU性能模擬器提供對比結(jié)果等.
在微結(jié)構(gòu)設(shè)計實現(xiàn)期間,AMD開發(fā)了CPU核模擬器和多核互聯(lián)模擬器(由于AMD沒有公開其命名,本文分別稱之為AMD-Core,AMD-NB模擬器)用于對處理器性能進行評估.AMD-Core模擬器框架如圖4所示.
首先從真實硬件或者SimNow模擬器上直接抓取程序執(zhí)行蹤跡,然后對蹤跡進行分析獲取初步微結(jié)構(gòu)信息,例如cache缺失率等.同時把蹤跡作為輸入文件灌入時鐘精準的AMD-Core模擬器進行詳細分析,此時從真實硬件上獲取的程序執(zhí)行結(jié)果可以作為AMD-Core模擬器的參考,分析后可以產(chǎn)生詳細微結(jié)構(gòu)數(shù)據(jù).
AMD-NB模擬器可以模擬多核互聯(lián)系統(tǒng),如圖5所示,由從真實硬件抓取的事務(wù)(transaction)蹤跡驅(qū)動,因此可稱其為事務(wù)精準模擬器.為加快執(zhí)行速度,對互聯(lián)模擬器中CPU進行抽象處理.基于該模擬器可以對于多核設(shè)計進行取舍,例如可以用于決定互聯(lián)系統(tǒng)、內(nèi)存系統(tǒng)的設(shè)計.此外,AMD還開發(fā)了以指令執(zhí)行蹤跡作為輸入的TagSim cache模擬器,可以對cache微結(jié)構(gòu)(如替換算法、相連度等)進行分析.為提高準確性,上述模擬器都需要同RTL進行校準.
Fig.4 AMD CPU core simulator framework圖4 AMD處理器核模擬器框架
Fig.5 AMD multi-core interconnect simulator framework圖5 AMD多核互聯(lián)模擬器框架
AMD的互聯(lián)系統(tǒng)模擬器中還包含高級系統(tǒng)隊列模型,該模型可以對資源利用率、cache一致性協(xié)議等進行建模,并可以基于預定義的參數(shù)定量產(chǎn)生流量和cache缺失等信息,例如預先設(shè)定L3 cache缺失率10%,該模型可以基于該參數(shù)產(chǎn)生10%的L3缺失率,為L3下游子系統(tǒng)產(chǎn)生輸入請求.其輸入是從TagSim cache模擬器中獲取的可執(zhí)行負載的參數(shù)、cache參數(shù)等.該模型經(jīng)過與真實硬件系統(tǒng)進行校準后,可以用于預測包括吞吐率和帶寬利用率在內(nèi)的AMD服務(wù)器性能路線圖(roadmap).
在處理器驗證期間,AMD使用SimNow功能模擬器為AMD-Core和AMD-NB提供執(zhí)行參考結(jié)果,此時的SimNow角色和IBM的Mambo相同.此階段性能模擬器和RTL進行互相校準,可以通過模擬器發(fā)現(xiàn)并修改RTL的邏輯錯誤,反之也可以通過RTL對AMD性能模擬器進行校準.AMD-Core和AMD-NB模擬器的開發(fā)目標是跟RTL一樣時鐘精準,并且保證執(zhí)行正確性以方便進行不同層次的性能分析.AMD模擬器相較于RTL,在未校準之前每1 000條指令的絕對誤差是22%,經(jīng)過校準后可以達到2%~3%.
在系統(tǒng)軟件開發(fā)方面,AMD基于SimNow平臺可以在流片前就開始BIOS、硬件驅(qū)動代碼、操作系統(tǒng)、軟件編譯器的開發(fā).
美國高通(Qualcomm)公司基于ARMv8架構(gòu)研發(fā)的多核服務(wù)器芯片Centriq 2400已經(jīng)發(fā)布[26-27],文獻[26]對互聯(lián)系統(tǒng)硬件架構(gòu)進行了描述.此外文獻[28-31]作者均來自美國高通公司,該文獻中實驗評估部分對高通使用的多核互聯(lián)模擬器框架進行了描述[28],從文獻[26,28-31]可以得到高通公司所使用的互聯(lián)系統(tǒng)模擬器架構(gòu)如圖6所示.高通的互聯(lián)系統(tǒng)模擬器前半部是運行在開源QEMU[32]虛擬機上的操作系統(tǒng)及真實應用程序,在運行時動態(tài)產(chǎn)生指令執(zhí)行蹤跡.模擬器后半部運行真正的互聯(lián)系統(tǒng)模擬器,模擬多級cache、內(nèi)存控制器、互聯(lián)總線等模塊.為了加速互聯(lián)模擬器的仿真速度,該后端模擬器的推進方式不是時鐘精準而是時鐘近似的.模擬器在運行時,前端QEMU運行速度比后端模擬器運行稍快,動態(tài)產(chǎn)生程序執(zhí)行蹤跡暫存到緩沖區(qū)中,后端模擬器讀取該緩沖區(qū)數(shù)據(jù)進行模擬.緩沖區(qū)中會暫存一部分訪存請求,在不違背訪存之間依賴關(guān)系情況下,可以亂序發(fā)射以此對CPU亂序執(zhí)行進行模擬.該模擬器是已跟RTL進行校準的企業(yè)級模擬器,支持ARMv7/v8指令集,并由高通CPU研究部門和開發(fā)部門共用[31].
Fig.6 Qualcomm multi-core interconnect simulator framework圖6 高通多核互聯(lián)模擬器框架
上述模擬方法中,QEMU作為生產(chǎn)者動態(tài)產(chǎn)生指令蹤跡,互聯(lián)模擬器作為消費者消耗指令蹤跡進行互聯(lián)系統(tǒng)模擬,這種方法的優(yōu)點在于可以不需要對蹤跡文件進行存儲,從而節(jié)省大量存儲空間,并且還可以一定程度上模擬CPU亂序執(zhí)行.但其缺點也比較明顯,因為該模擬器由蹤跡驅(qū)動,會導致其無法精確模擬處理器中如分支預測、推測執(zhí)行等細節(jié).
第2節(jié)分別介紹了各處理器廠商如何使用模擬器輔助進行處理器開發(fā),具體地,模擬器信息如表1所示,對于未公開的數(shù)據(jù)用“-”標示.
上述不同的模擬器有不同的作用并且運行速度不同,文獻[23]對模擬器的運行速度及其作用進行了總結(jié),如圖7所示.
1)1~10 Hz.RTL仿真運行速度.對性能模擬器和RTL進行互相校準時需要運行RTL仿真,通過校準可以找到RTL中的邏輯錯誤和性能模擬器的模擬錯誤.
2)1~10 kHz.時鐘精準的單核性能模擬器的運行速度.Intel[33]和AMD[23]的時鐘精確模擬器運行速度都是這個級別,基于性能模擬器可以進行處理器微結(jié)構(gòu)分析和探索.
3)10~100 KIPS.蹤跡分析模擬器和處理器抽象模型的運行速度.此時基于模擬器可以初步對蹤跡進行分析,獲取微結(jié)構(gòu)信息,還可以對處理器進行抽象,基于抽象模型對未來性能進行估算.
4)100~500 KIPS.這是大多經(jīng)過優(yōu)化加速(例如通過翻譯執(zhí)行)后時鐘精確模擬器的執(zhí)行速度,例如SimpleScalar的sim-outorder模式和PTLSim速度分別是740KIPS和270KIPS[34].
5)1~100 MIPS.指令集功能模擬器的運行速度.基于功能模擬器可以對指令集進行模擬和研究,作為對比模型進行處理器驗證等工作.
文獻[16]中曾提到,模擬器的開發(fā)是一個大型軟件工程,開發(fā)周期長,需要持續(xù)與RTL進行校準,本節(jié)結(jié)合表1及文獻[8-10,16,23-24]總結(jié)了處理器廠商使用模擬器輔助進行處理器開發(fā)的經(jīng)驗有4方面:
Table1 Simulator Summary表1 模擬器總結(jié)
Note:“-” means unpublished information.
Fig.7 Simulator speed and role圖7 模擬器速度及作用
1)處理器廠商一般有多個功能不同的模擬器用于輔助進行處理器開發(fā).其中性能模擬器一般要同時支持蹤跡和執(zhí)行驅(qū)動2種模式,以方便在這2種模式之間切換,以此加快模擬速度.性能模擬器一般要求時鐘精準,且與RTL校準后誤差盡量小[23],其運行速度一般要比RTL仿真速度快1 000倍以上才有實際使用價值[23].性能模擬器還要支持多種調(diào)試手段,例如GDB、快速前進(fast forward)、檢查點等,還要支持數(shù)據(jù)可視化功能,方便與RTL進行校準.為了加快模擬器仿真速度,要善于使用類似于SimPoint[7]的取樣方法對負載進行處理.對于多核互聯(lián)模擬器考慮到仿真速度,可以使用時鐘近似模式和抽象的處理器核,但要可以精確反映性能變化趨勢.
2)一般都有硬件支持從硬件直接抓取真實程序執(zhí)行蹤跡或者事務(wù)蹤跡[23-24],例如AMD可以直接關(guān)閉L2抓取bus上的信息,IBM也可以獲取真實處理器上的執(zhí)行蹤跡.此外模擬器要可以和多種常用軟件工具協(xié)同工作,以方便使用,例如蹤跡獲取工具、代碼自動注釋工具、文檔產(chǎn)生工具等.
3)模擬器開發(fā)投入很大,要持續(xù)與RTL進行校準[23].模擬器的開發(fā)首先是一項軟件工程,因此好的軟件架構(gòu)模擬器成功的首要條件,相比而言計算機體系結(jié)構(gòu)的知識也非常重要但是次要的[16].AMD模擬器的微結(jié)構(gòu)代碼約有10萬行,其他結(jié)構(gòu)包含共享庫約有40萬行代碼[16],因此模塊化的設(shè)計、良好的代碼接口、使用源代碼管理工具等必不可少.在資源不足的情況下,基于開源模擬器開發(fā)模擬器也是不錯的選擇.
4)模擬器校準時,需要通過微程序進行充分驗證[8],此時可以跟驗證團隊緊密合作,共享驗證微程序.性能模擬器編寫語言一般選擇兼顧開發(fā)和執(zhí)行效率的C++,其次是C語言.為了加速模擬器仿真速度,模擬部件盡量并行執(zhí)行,且要盡可能支持可移植性.
用于進行微結(jié)構(gòu)探索的性能模擬器的準確度會直接影響微結(jié)構(gòu)設(shè)計和改進的決策,因此需要對其進行校準.校準方法可以分為2種:1)在進行處理器設(shè)計時,與RTL進行校準;2)開源模擬器為了提高研究可信度,在目標硬件微結(jié)構(gòu)數(shù)據(jù)未知的情況下,與已有的硬件平臺進行校準,本節(jié)對上述校準方法進行總結(jié).
龍芯中科技術(shù)有限公司對Sim-Godson模擬器和ICT-Godson模擬器進行校準,后者與RTL幾乎一樣準確,其校準方法學與模擬器直接同RTL校準類似,具有一定參考價值,本節(jié)以此為例闡述模擬器與RTL的校準方法[8].
如圖8所示,在處理器開發(fā)的邏輯設(shè)計階段開始模擬器設(shè)計和校準工作,在其他階段如果需要修改邏輯設(shè)計,則同時對模擬器進行修正.龍芯中科技術(shù)有限公司使用2種類型的負載[8]對模擬器進行校準,即微程序[35]和完整應用程序(主要是SPEC CPU2000).
Fig.8 Simulator calibration process圖8 模擬器校準流程
在校準初期,針對特定處理器模塊編寫特定微程序進行各模塊校準[8].例如通過if-else循環(huán)測試分支預測器,以時鐘周期為單位對比模擬器和RTL運行結(jié)果,發(fā)現(xiàn)不同后定位原因并修正模擬器.重復上述步驟直到微程序驗證結(jié)果的誤差可控后,繼續(xù)使用完整負載進行校準,此時如果結(jié)果顯示誤差原因指向某個模塊,則增加對該模塊進行校準的微程序并重復上述校準步驟.若一時無法定位誤差原因,則重復使用微程序?qū)φ`差進行分析.
龍芯中科技術(shù)有限公司在模擬器校準過程中還提出:1)分析程序運行結(jié)果并尋找誤差原因是模擬器校準最重要的工作;2)很多由SPEC CPU2000發(fā)現(xiàn)的模擬器誤差,都可以由一些簡單微程序發(fā)現(xiàn),而分析SPEC CPU2000的誤差要比分析微基準程序困難得多;3)僅僅比較程序運行時間或IPC(instr-uctions per cycle)等宏觀參數(shù)得出的結(jié)論有可能不正確,要綜合考慮分支預測正確率等相關(guān)部件.例如在Sim-Godson校準過程中,浮點部件還沒有校準之前,SPEC CPU2000中多個程序IPC誤差已經(jīng)小于10%,只有通過查看浮點部件延遲和發(fā)射策略等參數(shù),才會發(fā)現(xiàn)浮點部件誤差較大.
在真實硬件微結(jié)構(gòu)數(shù)據(jù)未知的情況下進行模擬器校準,需要首先通過程序測試獲取處理器微結(jié)構(gòu)詳細信息.文獻[36]認為模擬異構(gòu)系統(tǒng)的模擬器如果不準確,會直接導致異構(gòu)系統(tǒng)性能和功耗的嚴重誤判,因此對模擬器MARSSx86[37]與Intel Core i7-920 CPU進行了校準,其校準分為2步:1)通過簡單的微程序(general matrix multiplication,GEMM)[38]校準處理器核流水線;2)基于校準后的流水線繼續(xù)進行訪存系統(tǒng)校準.
本文以校準計算類指令的執(zhí)行周期為例介紹其校準方法.模擬器與真實處理器校準過程中,不同類型指令執(zhí)行延遲是最重要的校準參數(shù),但是由于Intel未公布該微結(jié)構(gòu)參數(shù),因此文獻[36]通過設(shè)計微程序?qū)χ噶顖?zhí)行延遲進行測算.具體地:
1)查詢Intel編程手冊獲取i7-920處理器每個時鐘周期可以執(zhí)行4個雙精度浮點運算(double precision FLOPs/cycle,F(xiàn)PC),每個雙精度浮點運算的寄存器寬度是64 b.指令mulpd和addpd使用的寄存器是128 b寬,上述每條指令每個周期需要2個雙精度運算.
2)設(shè)計微程序,使得每個mulpd和addpd的指令組合恰好在i7-920處理器上一個周期執(zhí)行完成.
3)如圖9所示,定義寄存器復用距離(register reuse distance,RRD),即相同指令的目的寄存器號相同情況下2條指令之間的延遲周期數(shù),例如圖9中的指令addpd復用距離是3周期.
Fig.9 Microbenchmark for testing instruction latencies圖9 測試指令延遲的微程序
4)如果addpd指令和mulpd指令的執(zhí)行延遲分別小于3和6周期,則該微程序的執(zhí)行峰值速度應該能達到4FPC,反之指令addpd和mulpd必須要等待指令之間寄存器相關(guān)導致的依賴解決后才能繼續(xù)執(zhí)行,因此會導致浮點計算部件無法達到峰值性能.經(jīng)過測試,圖9中的微程序可以達到3.94 FPC,可以斷定addpd和指令mulpd的指令執(zhí)行周期不大于3和6周期.
5)通過反復調(diào)整addpd和mulpd的復用距離,可以得到指令addpd和mulpd執(zhí)行周期分別為3和5.通過上述程序獲取的數(shù)據(jù)調(diào)整模擬器中指令執(zhí)行延遲.
類似地,對其他流水線微結(jié)構(gòu)信息例如發(fā)射寬度、緩存系統(tǒng)架構(gòu)等,都需要通過微程序測試獲取相關(guān)數(shù)據(jù)后進行校準[36],基于此再進行訪存子系統(tǒng)的校準,本文不再詳述.
隨著處理器核性能越來越高,核數(shù)越來越多,模擬器的規(guī)模也越來越大,模擬速度及模擬器可擴展性越來越成為模擬器發(fā)展的制約因素,因此模擬器需要進行優(yōu)化.本文把模擬器的優(yōu)化分為縱向優(yōu)化(scale up)和橫向優(yōu)化(scale out).縱向優(yōu)化是指通過技術(shù)手段,對串行執(zhí)行或者小規(guī)模模擬器進行加速;橫向優(yōu)化是指對于模擬多核或者多處理器的模擬器,在付出較小代價的同時,獲取模擬器多核擴展性的大幅提升.本節(jié)對新興的優(yōu)化方法進行著重介紹,對常規(guī)的優(yōu)化方法進行簡單總結(jié).
4.1.1 基于FPGA加速的模擬器
FPGA加速模擬技術(shù)[34](FPGA-accelerated simulation technologies,FAST)可以通過FPGA對時鐘精準模擬器進行加速.基于該技術(shù)實現(xiàn)的模擬器可以分為2部分,模擬器前端運行一個功能模擬器,可以運行完整的全系統(tǒng).模擬器后端通過FPGA硬件實現(xiàn)處理器微結(jié)構(gòu),因此可以對分支預測、流水線、緩存等詳細微結(jié)構(gòu)進行時鐘精準模擬.模擬器運行時,前端功能模擬部分把指令執(zhí)行結(jié)果等信息通過緩沖區(qū)輸入給運行在FPGA上的模擬器后端,后端基于緩沖區(qū)中的信息校正微結(jié)構(gòu)推測執(zhí)行(例如分支預測等)過程中的執(zhí)行結(jié)果.FPGA加速模擬技術(shù)同時具有軟件的靈活性,并兼顧了運行速度,其運行速度一般要比基于軟件的時鐘精準模擬器快1個數(shù)量級[34].類似模擬器還有RAMP[39],STIMUL[40]等.
4.1.2 二進制翻譯
模擬器二進制翻譯技術(shù)是把模擬器所模擬的目標架構(gòu)的指令,翻譯成模擬器所運行的宿主機架構(gòu)的指令然后進行執(zhí)行.具體地,當模擬器執(zhí)行目標指令時,模擬器把目標指令替換為宿主機上事先定義好的函數(shù)或者指令集,使得所模擬的目標架構(gòu)指令執(zhí)行速度接近于宿主機執(zhí)行速度.
二進制翻譯雖然加速了模擬器執(zhí)行速度,但其缺點是目標架構(gòu)的指令被宿主機指令替換,因此執(zhí)行蹤跡無法獲取,同時導致模擬器與宿主機架構(gòu)綁定,可移植性變差.基于二進制翻譯進行加速的模擬器有SimOS[13],QEMU[32]等.
4.1.3 直接執(zhí)行(基于KVM虛擬化和取樣技術(shù))
Fig.10 Comparison of different simulation sampling strategies圖10 關(guān)于多種模擬取樣策略之間的對比
直接執(zhí)行是指模擬器的目標架構(gòu)和模擬器的宿主架構(gòu)相同的情況下,模擬器在運行時直接在宿主機上執(zhí)行目標架構(gòu)指令的加速方法,直接執(zhí)行可以認為是二進制翻譯中的特例.文獻[41]把直接執(zhí)行和取樣方法結(jié)合起來對模擬器進行加速,基于KVM虛擬化在多個程序取樣之間進行快速推進,其模擬速度可以達到宿主機速度的63%,約2.0GIPS(giga instructions per second).通過IPC參數(shù)對模擬器誤差進行評估,平均誤差約2.2%.基于KVM的模擬器加速方法是基于SMARTS[42]取樣方法基礎(chǔ)上發(fā)展而來,如圖10(a)所示.SMARTS取樣方法為了平衡模擬精度和模擬器仿真速度,把運行時程序分為3個模式:1)功能預熱模式.為了對需要長時間訓練的微結(jié)構(gòu)狀態(tài)進行保存,模擬了緩存和分支預測器,除此之外該模式把每條指令當作靜態(tài)流水線原子指令進行模擬,并且沒有時序信息.2)詳細預熱模式.使用亂序執(zhí)行處理器對整個系統(tǒng)進行詳細模擬,并對CPU內(nèi)部的某些微結(jié)構(gòu)(例如讀寫緩存、重排序緩存等)進行預熱.3)詳細模擬模式.詳細模擬處理器所有微架構(gòu),并對需要的微結(jié)構(gòu)數(shù)據(jù)進行測量.上述方法需要功能預熱階段執(zhí)行大量程序指令,導致花費大量時間,為了對取樣進行加速,文獻[41]提出了FSA(full speed ahead)取樣方法.如圖10(b)所示,基于SMARTS取樣基礎(chǔ)上添加了一個新的模式:虛擬化快速推進模式.上述新增模式可以使用基于KVM的虛擬化技術(shù)把約95%指令直接運行在宿主機上,可以大大加快原來功能預熱模式的執(zhí)行速度,但為了保證對緩存和分支預測器的預熱,保留了SMARTS中功能預熱的方式.
FSA模式雖然加快了功能預熱模式下指令執(zhí)行速度,但是還有大約75%~95%的時間用于詳細預熱和詳細模擬階段.為了對上述階段進行并行化加速,文獻[41]繼續(xù)提出了pFSA(parallel full speed ahead),如圖10(c)所示,為了使得每一個取樣點獨立并行執(zhí)行,需要復制取樣點之前模擬器狀態(tài).在完成一個取樣點詳細模擬之前就使得模擬器運行到下一個取樣點繼續(xù)并行執(zhí)行.具體地,模擬器完全以虛擬化快速推進模式運行在處理器核1上,其運行速度可以接近宿主機.當需要對模擬器進行取樣分析時,復制模擬器狀態(tài)到處理器核2上,開始以SMARTS方式進行取樣處理,以此類推.如果復制模擬器狀態(tài)的開銷足夠低,則模擬器可以接近宿主機的速度運行在宿主機器上.
上述方法被集成到了gem5[2]模擬器中,類似的模擬器還有基于Xen半虛擬化環(huán)境的PTLsim[43],因此運行PTLsim模擬器的操作系統(tǒng)要進行定制化修改,導致其可移植性相對不如KVM好(KVM目前是Linux標準組件),并缺乏對一些重要的底層硬件組件(例如中斷時鐘、IO設(shè)備等)的模擬.文獻[41]的方法雖然可以使得模擬器運行速度接近宿主機,但其缺點是:1)目標指令集要和宿主機相同;2)需要KVM支持;3)對于特權(quán)指令仍需進行模擬.
4.2.1 區(qū)間模擬
區(qū)間模擬技術(shù)[44]是一種新型多核模擬器加速方法,通過提高模擬器的抽象層級并且對處理器核使用數(shù)學分析模型進行抽象,而省略了通過流水線對指令執(zhí)行時間進行詳細追蹤的步驟,因此可以一定程度上通過數(shù)學模型替換處理器核的時鐘精準模擬方式,大幅提高模擬速度并降低模擬器開發(fā)難度.其核心思想如圖11所示,指令流水線的正常執(zhí)行流會被分支預測錯誤和TLB(translation lookaside buffer)、cache缺失等事件打斷并分成不同的區(qū)間長度,上述缺失事件及頻率由模擬器決定,而區(qū)間的長度由數(shù)學分析模型計算.因此綜合使用模擬各個部件的模擬器并結(jié)合數(shù)學分析模型,就可以對在多核處理器上同時執(zhí)行的多線程程序性能進行評估,Sniper[45]和COTSon[46]就是以這種模式實現(xiàn)的模擬器.文獻[44]對Sniper模擬器使用SPEC CPU2000和多線程PARSEC進行測試,與M5[47]全系統(tǒng)時鐘精確模擬器進行精度和仿真速度的對比,運行SPEC CPU2006單線程的誤差是5.9%,運行PARSEC多線程測試的誤差是4.6%,但其速度要比時鐘精確方式快一個數(shù)量級.文獻[44]的區(qū)間模擬器分析模型的代碼量只有1 000行C代碼,而M5[47]中亂序執(zhí)行代碼量接近2.8萬行.開發(fā)區(qū)間模擬器目的不是替代時鐘精確模擬器,而是在犧牲小部分精確性的同時,大幅提高模擬器開發(fā)和仿真速度,因此可以用于快速探索多核處理器架構(gòu)的設(shè)計和對粗粒度微架構(gòu)和系統(tǒng)級架構(gòu)進行快速取舍,而時鐘精確模擬可以用于對某些微架構(gòu)進行詳細探索.
Fig.11 Analysis performance on an interval basis determined by disruptive miss events圖11 基于缺失導致的區(qū)間進行性能分析
4.2.2 SST模擬框架
SST(structural simulation toolkit)[48-49]是為了對大規(guī)模高性能計算系統(tǒng)進行模擬而誕生,可以模擬多達512個處理器節(jié)點,其目標是成為設(shè)計和評估未來高性能計算系統(tǒng)的標準框架.基于SST模擬器可以把多個現(xiàn)有的模擬器按需集成起來,組成一個模塊化并行模擬系統(tǒng).SST已經(jīng)內(nèi)建多種處理器、內(nèi)存系統(tǒng)、網(wǎng)絡(luò)系統(tǒng)等模型,并提供簡易用戶接口,方便快速擴展新的模型.為了提高靈活度,SST提供一系列組件可以在精度和模擬時間之間權(quán)衡.SST的軟件架構(gòu)由模擬器核心部分和可動態(tài)插拔的組件組成,基于MPI和離散事件模擬技術(shù)構(gòu)建,如圖12所示,其中模擬器核心部分提供模擬服務(wù),包括模擬器配置和啟動、功耗面積評估、檢查點的支持、模擬器數(shù)據(jù)收集等.SST模擬核心還提供通用接口用于連接供應商提供的組件或者開源的模擬器組件.目前基于SST開發(fā)的模擬器有MacSim[50],ExaSAT[51]等,自從發(fā)布以來SST被引用了208次.
Fig.12 SST structure圖12 SST框架
4.2.3 并行模擬加速
為了對大規(guī)模系統(tǒng)進行模擬,需要可以并行運行的模擬環(huán)境,這催生了并行離散事件仿真(parallel discrete event simulation,PDES)技術(shù)[52-53].PDES可以把離散事件分解到多處理器上并行執(zhí)行,可以大幅提高模擬速度,因此被廣泛應用到工程、計算機科學、經(jīng)濟、軍事[54]等領(lǐng)域.
并行模擬器雖然能加快基于離散事件仿真的模擬器運行速度,但是需要維護各個處理單元之間的同步關(guān)系,隨著處理單元的規(guī)模越來越大,其同步開銷占整個模擬器運行時間比例也越來越大,因此其可擴展性在規(guī)模巨大時成為急需解決的問題.IBM使用的BGLSim[21]模擬器就是基于PDES技術(shù)構(gòu)建的.
隨著各種體系結(jié)構(gòu)和處理器設(shè)計方法學的發(fā)展,體系結(jié)構(gòu)模擬器也相應地出現(xiàn)了一些新的形態(tài),本節(jié)對近期出現(xiàn)的新型模擬器進行總結(jié)介紹.
新型的專用加速器、GPU已成為計算機體系結(jié)構(gòu)研究和處理器設(shè)計的重點.相應地,研究人員開發(fā)了多款開源的模擬器對新型計算機體系結(jié)構(gòu)進行模擬.為方便研究人員選擇合適的模擬器平臺和工具進行實驗,本文總結(jié)專用加速器和GPU模擬器及相關(guān)工具如表2所示,其中被引用次數(shù)高且持續(xù)維護的模擬器相對更適合進行異構(gòu)原型系統(tǒng)的構(gòu)建和異構(gòu)體系結(jié)構(gòu)的研究.
Table 2 Comparison of Heterogeneous Simulators表2 異構(gòu)模擬器對比
Note:√ means support operating system;× means don’t support operating system.
加州大學伯克利分校設(shè)計的開放指令集RISC-V已成為處理器設(shè)計和研究領(lǐng)域的熱門,為了實現(xiàn)處理器的敏捷開發(fā),伯克利分校還開發(fā)了高度參數(shù)化的硬件構(gòu)建語言Chisel[55].使用Chisel語言設(shè)計處理器,可以直接使用面向?qū)ο蟮脑O(shè)計方法學描述處理器功能,這與傳統(tǒng)意義上開發(fā)周期精確模擬器的方式很像,但特別之處在于:通過編寫一次硬件代碼可以生成包含C++時鐘精準模擬器、FPGA Verilog和ASIC Verilog這3個目標[55].具體地在生成模擬器方面,基于最新Chisel3編寫的硬件代碼可以產(chǎn)生Firrtl中間描述語言(inter-mediate representation,IR),從Firrtl可以直接翻譯或者轉(zhuǎn)換成Verilog,進而通過Verilator工具可以生成時鐘精準的C++模擬器和測試框架.但是,通過這種方式生成的模擬器代碼可讀性和可修改性都比較差.
Chisel語言使邏輯設(shè)計和模擬器開發(fā)得到了統(tǒng)一,使得處理器設(shè)計效率提高一個數(shù)量級[56],因此可以大幅加速硬件設(shè)計,這是新的硬件敏捷開發(fā)方法學,同時也是未來處理器設(shè)計和模擬器發(fā)展的一個重要方向.
一些體系結(jié)構(gòu)文獻在進行實驗評估時,使用的是自研模擬器,表3對體系結(jié)構(gòu)會議ISCA(Inter-national Symposium on Computer Architecture),MICRO(International Symposium on Microarchi-tecture),ASPLOS(International Conference on Architectural Support for Programming Languages and Operating Systems),HPCA(International Symposium on High Performance Computer Archi-tecture)中近幾年出現(xiàn)的In-house模擬器進行了總結(jié)介紹,以方便科研人員在開發(fā)自研模擬器時進行參考.從表3可以看出,有多個自研模擬器是基于trace(一般可基于Intel Pin工具獲取)作為模擬器的輸入,此類模擬器適合于對訪存系統(tǒng)進行建模和分析,其優(yōu)點是運行速度快、構(gòu)建模擬器相對容易.但是由于Pin工具運行于用戶態(tài),因此其缺點是只能對用戶態(tài)應用程序進行性能分析,無法對操作系統(tǒng)參與的行為(例如調(diào)度、內(nèi)存管理等)進行分析.
Table 3 Introduction of Some In-house Simulators of Architecture Conference表3 部分體系結(jié)構(gòu)會議中使用的In-house模擬器介紹
Note:“-” means unpublished information
本文主要圍繞處理器性能模擬器進行介紹,但是處理器的設(shè)計是一個不斷取舍的過程,其他諸如功耗、面積等方面也是處理器設(shè)計過程中必須考慮的因素,這方面也有對應的專用模擬器模擬和分析.本文所述專用模擬器是從體系結(jié)構(gòu)層面,針對處理器某個部件或者某些方面進行編寫的模擬器,例如cache模擬器、功耗模擬器、面積模擬器等.這類模擬器一般用于在處理器設(shè)計之初對其功耗和面積進行初步評估和取舍或者用于對科研論文中提出的創(chuàng)新思想所帶來的開銷進行評估.本節(jié)對主流會議中所使用的開源專用模擬器進行總結(jié)介紹.
2.3節(jié)所述的TagSim[23]和文獻[71]中所用的模擬器就是專用的cache模擬器,此類模擬器一般只對數(shù)據(jù)cache進行模擬,主要關(guān)注訪存指令,因此普遍基于二進制插樁工具(Intel Pin工具和DynamoRIO[72]等)編寫.
CACTI[73],Wattch[74],SimplePower[75],Power-Timer[76]可以對處理器能耗進行評估,文獻[76]從微結(jié)構(gòu)級對功耗模擬器進行了詳細總結(jié),本文不再贅述.Orion[77]模擬器可以針對片上網(wǎng)絡(luò)(network on chip,NoC)的功耗、面積進行評估.CACTI模擬器除了可以評估處理其功耗外,還可以以時序為限制的情況下對處理器面積進行詳細評估,基于此還衍生出了用于評估3D封裝DRAM的模擬器CACTI-3DD[78]、用于評估片外IO的模擬器CACTI-IO[79]和面向SRAM的支持降低漏電功耗技術(shù)的模擬器CACTI-P[80]等.McPAT[81]集成了CACTI-P[80]模擬器,是首款集成了對功耗、面積和時序進行模擬的多核和眾核模擬器,目前已經(jīng)被集成到gem5[2],Sniper[45]等多款性能模擬器中.McPAT[81]和CACTI[73]普遍被用于主流會議中進行處理器功耗、面積的評估.
體系結(jié)構(gòu)模擬器對于處理器設(shè)計非常重要,微結(jié)構(gòu)的開發(fā)、處理器的迭代和性能提升離不開模擬器的輔助.基于模擬器進行處理器設(shè)計,未來還有很多挑戰(zhàn).本文從處理器設(shè)計的角度出發(fā),首先介紹了開源模擬器在處理器設(shè)計中的地位;其次,對處理器廠商使用模擬器輔助進行處理器設(shè)計的經(jīng)驗進行了介紹和總結(jié),并對性能模擬器的校準方法進行了介紹;最后對模擬器優(yōu)化方法和新型模擬器進行了介紹.
隨著計算機體系結(jié)構(gòu)的發(fā)展,異構(gòu)處理器、眾核處理器、虛擬化技術(shù)成為高性能計算未來發(fā)展的重要方向.首先,隨著處理器核數(shù)越來越多,未來多核互聯(lián)模擬器會變得越來越復雜.此外,隨著虛擬化的發(fā)展,系統(tǒng)整體性能評估需要在模擬器上運行虛擬化環(huán)境、完整的操作系統(tǒng)及負載.在處理器功耗越來越重要的情況下,通過模擬器對功耗進行評估也勢在必行,目前這方面還有很大提升空間.上述挑戰(zhàn)都是未來體系結(jié)構(gòu)模擬器研發(fā)要面臨的問題.