劉 仲,李 程,田 希,劉 勝,鄧讓鈺,錢程東
(1.國防科技大學(xué)計算機(jī)學(xué)院,湖南 長沙 410073;2.先進(jìn)微處理器芯片與系統(tǒng)重點實驗室,湖南 長沙 410073;3.天津先進(jìn)CPU企業(yè)重點實驗室,天津 300000)
隨著人們對計算能力需求的不斷增長,處理器體系結(jié)構(gòu)變得越來越復(fù)雜。例如,AMD在2021年11月9日正式發(fā)布的Instinct MI200 GPU加速卡[1],單芯片64位浮點峰值性能高達(dá)144 TFlops,總共有580億個晶體管,包含多達(dá)220個計算單元以及880個矩陣內(nèi)核。設(shè)計和制造這樣一個復(fù)雜的處理器所需要的時間成本和資金成本是極其高昂的。通常,生產(chǎn)一款新的處理器需要經(jīng)過體系結(jié)構(gòu)設(shè)計、設(shè)計評估與驗證、邏輯設(shè)計與驗證、電路設(shè)計與驗證、布局設(shè)計和生產(chǎn)制造等多個階段。而且,這里的每一個階段都需要多次迭代以保證質(zhì)量。從時間成本上看,該過程通常會持續(xù)2~5年甚至更長時間;從資金成本上看,現(xiàn)有新工藝的芯片開發(fā)成本都是數(shù)億元級別以上。因此,為了降低處理器的設(shè)計風(fēng)險,迫切需要研究高質(zhì)量的模擬器,通過軟件模擬技術(shù)降低設(shè)計成本和縮短設(shè)計周期。
深度神經(jīng)網(wǎng)絡(luò)技術(shù)在圖像識別與分類、目標(biāo)檢測、視頻分析、語音識別、自然語言處理等方面取得了令人矚目的成就。通用CPU具有很高的靈活性和較好的并行計算能力,但是深度神經(jīng)網(wǎng)絡(luò)算法并不能取得很高的計算效率。GPU因為其特有的多核結(jié)構(gòu)和出眾的并行計算能力而被廣泛應(yīng)用于深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和推理,但其功耗較大。超長指令字VLIW(Very Long Instruction Word)架構(gòu)體系結(jié)構(gòu)因性能高、功耗低等優(yōu)點一直在DSP領(lǐng)域被廣泛使用。Intel在VISION 2022大會公布了基于VLIW SIMD架構(gòu)的新款A(yù)I專用芯片Habana Gaudi 2和Greco[2],使得VLIW SIMD架構(gòu)成為了深度學(xué)習(xí)加速器的重要研究方向之一。
在新的體系結(jié)構(gòu)研究與設(shè)計中,模擬器是不可缺少的工具。因此,處理器體系結(jié)構(gòu)軟件模擬技術(shù)一直是學(xué)術(shù)界和工業(yè)界非常重要的研究內(nèi)容[3,4]。
gem5[5]是一個全系統(tǒng)模擬器,能夠在其支持的特定硬件上啟動Linux、Solaris和Android操作系統(tǒng)。SimpleScalar是學(xué)術(shù)界廣泛使用的體系結(jié)構(gòu)模擬器,可根據(jù)模擬需求配置成不同體系結(jié)構(gòu)的模擬器,如僅模擬ISA的sim-safe、對執(zhí)行性能進(jìn)行優(yōu)化的sim-fast[6]、支持推測和亂序執(zhí)行的超標(biāo)量處理器性能模型的sim-outorder、支持向前或向后執(zhí)行程序的Simics[7]、支持Alpha處理器的功能模擬器SimCore[8]、支持多線程微架構(gòu)模擬的MSim(Multithreaded architectural Simulation)[9]和支持功耗模擬的SimWattch[10]。QEMU(Quick EMUlator)[11]是一個通用模擬器和虛擬機(jī),其采用二進(jìn)制指令翻譯技術(shù),通過提取guest代碼,將其翻譯成TCG中間代碼,最后再將中間代碼翻譯成host指定架構(gòu)的代碼,如x86或ARM體系結(jié)構(gòu)。文獻(xiàn)[12]提供了千核系統(tǒng)的快速準(zhǔn)確的微體系結(jié)構(gòu)模擬。德州儀器TI(Texas Instruments)[13]公司提供了CCS(Code Composer Studio)集成開發(fā)環(huán)境,集編輯、編譯、鏈接、軟件仿真、硬件調(diào)試及實時跟蹤等功能于一體,極大地方便了用戶對DSP芯片的開發(fā)與設(shè)計。CCS開發(fā)環(huán)境自帶了TI公司各種處理器的軟件模擬器,在CCS配置中選擇對應(yīng)型號的Simulator CPU之后,就可以加載程序代碼,模擬程序在該型號CPU上的運(yùn)行情況。其缺陷是模擬不夠完善,僅僅是對DSP芯片內(nèi)部運(yùn)行狀況的模擬,無法模擬DSP與外設(shè)之間的操作。
盡管與模擬器相關(guān)的研究文獻(xiàn)很多,開源社區(qū)也有許多知名的模擬器項目,但迄今為止,沒有看到與VLIW SIMD多核向量處理器相關(guān)的模擬器和文獻(xiàn)。為了對VLIW SIMD多核向量加速器體系結(jié)構(gòu)進(jìn)行深入研究和對設(shè)計空間進(jìn)行探索,本文設(shè)計了一個快速、可擴(kuò)展和精確的多核向量體系結(jié)構(gòu)模擬器MVSim(Multi-core Vector Simulator)。MVSim根據(jù)處理器的指令集體系結(jié)構(gòu),用軟件模擬的方式實現(xiàn)了處理器的邏輯功能實現(xiàn),能夠節(jié)拍精準(zhǔn)地模擬硬件處理器對程序指令的運(yùn)行處理過程,提供程序指令執(zhí)行、寄存器讀寫、存儲器訪問、DMA(Direct Memory Access)傳輸?shù)葓?zhí)行過程的完整記錄。實際使用情況證明,該模擬器軟件對處理器的設(shè)計具有非常重要的作用:(1)由于處理器的設(shè)計工程量巨大,且芯片的投片成本極高,任何不恰當(dāng)?shù)脑O(shè)計都將帶來巨大損失。模擬器可以預(yù)先模擬程序執(zhí)行流程,反饋設(shè)計是否滿足需求,從而改進(jìn)處理器設(shè)計。(2)模擬器有助于芯片設(shè)計過程中的芯片測試與驗證,通過對照檢查RTL測試結(jié)果與模擬器執(zhí)行結(jié)果能及時發(fā)現(xiàn)設(shè)計錯誤。(3)模擬器能夠模擬運(yùn)行程序在處理器上的執(zhí)行過程,支持完整的程序執(zhí)行日志;能對程序指令執(zhí)行、寄存器讀寫、存儲器訪問、DMA數(shù)據(jù)傳輸?shù)葓?zhí)行過程進(jìn)行完整的記錄;能夠快速定位程序錯誤原因,有助于應(yīng)用程序的開發(fā)、調(diào)試和性能分析。(4)模擬器可以提供給潛在用戶進(jìn)行早期應(yīng)用開發(fā),有助于加速芯片的應(yīng)用推廣和用戶應(yīng)用的快速開發(fā)與部署。
多核模擬器的總體框架如圖1所示,其核心主要包括以下3個部分:
Figure 1 Framework of multi-core simulator圖1 多核模擬器的總體框架
(1)硬件抽象模型?;诂F(xiàn)有的多款VLIW架構(gòu)多核處理器,深入研究其指令集體系結(jié)構(gòu),抽象、分析與歸納其底層硬件描述。構(gòu)建了可擴(kuò)展的、通用的指令取指、指令譯碼、指令執(zhí)行、訪存、Cache管理、硬件資源沖突檢測機(jī)制、DMA數(shù)據(jù)傳輸和多核通信模型。
(2)性能評價模型?;诂F(xiàn)有的多款VLIW架構(gòu)多核處理器,構(gòu)建了通用的程序執(zhí)行性能模型、Stall和Busy統(tǒng)計模型、訪存性能模型和DMA數(shù)據(jù)傳輸性能模型。
(3)多核模擬器內(nèi)核?;诂F(xiàn)有的多款VLIW架構(gòu)多核處理器,通過深入研究其體系結(jié)構(gòu),構(gòu)建了通用的程序加載、執(zhí)行、調(diào)試和性能統(tǒng)計模型。
如圖2所示,MVSim的目標(biāo)多核向量處理器包含多個VLIW SIMD向量處理器核心VPC(Vector Processor Core),VPC通過CrossNet數(shù)據(jù)網(wǎng)絡(luò)共享高速全局共享存儲器和大容量片外HBM/DDR存儲系統(tǒng)。單個VPC包括取指單元、指令派發(fā)單元、標(biāo)量處理單元SPU(Scalar Processing Unit)、向量處理單元VPU(Vector Processing Unit)、陣列存儲單元AM(Array Memory)和DMA等。
Figure 2 Multi-core processor model of VLIW SIMD architecture圖2 VLIW SIMD架構(gòu)的多核處理器模型
取指單元根據(jù)指令流控完成指令的獲取操作。該單元包含L1P 程序Cache,當(dāng)L1P不命中時,自動向外部發(fā)出取指失效請求,每次請求粒度為一個取指包。取指部件將獲取到的指令包發(fā)送給指令派發(fā)單元。
指令派發(fā)單元接收到指令包后,將執(zhí)行指令從指令包中提取出來,發(fā)送到SPU、VPU和AM中并發(fā)執(zhí)行。當(dāng)前的VPC采用11發(fā)射的VLIW結(jié)構(gòu)(標(biāo)量5流出,向量6流出),單條指令采用可變長編碼(目前支持16/32位、40/80位)。
SPU包括指令流控、SPE(Scalar Processing Element)和標(biāo)量存儲SM(Scalar Memory)。指令流控包括分支、中斷/異常控制等,用于控制程序流。SPE接收指令派發(fā)單元派發(fā)的標(biāo)量運(yùn)算類指令,譯碼后送到SPE內(nèi)對應(yīng)的功能運(yùn)算單元執(zhí)行。SPE內(nèi)部集成了3個運(yùn)算單元,包括2個SMAC(Scalar Multiply ACcumulate)和1個SIEU(Scalar Integer Element Unit)。2個SMAC運(yùn)算單元同構(gòu),支持標(biāo)量半精度、單精度和雙精度浮點乘加操作;SIEU支持標(biāo)量定點運(yùn)算。每個標(biāo)量運(yùn)算單元,對應(yīng)VLIW執(zhí)行包中的一條標(biāo)量指令。SPE內(nèi)包含64個32/64位的通用寄存器。
SM實現(xiàn)標(biāo)量數(shù)據(jù)的訪存和控制,支持一條標(biāo)量訪存指令或地址加減法指令,可實現(xiàn)標(biāo)量訪存指令對核內(nèi)外可見的數(shù)據(jù)空間和配置空間的訪問。SM存儲容量可配置,支持配置為Cache或SRAM的2種訪問模式。配置為SRAM模式時,通過DMA實現(xiàn)SM與核外的數(shù)據(jù)搬移。
VPU由16(可配置)個同構(gòu)的VPE(Vector Processing Element)構(gòu)成。VPE內(nèi)部集成了4個VMAC(Vector Multiply ACcumulate)運(yùn)算單元,VMAC支持半精度、單精度和雙精度浮點的向量乘加操作。VPE內(nèi)包含64個32/64位的局部通用寄存器。
DMA單元接收SPU配置的傳輸參數(shù),啟動對特定存儲資源的訪問。這種數(shù)據(jù)傳輸通過DMA通用通道實現(xiàn),包含讀操作和寫操作。DMA訪問的存儲資源包括:片上AM存儲器、片上SM存儲器、片外HBM(High Bandwidth Memory)/DDR(Double Data Rate)存儲空間,全局共享存儲配置而成的SRAM(Static Random Access Memory)空間。DMA支持點對點、組播和廣播3種傳輸模式。
3.3.1 取指包和執(zhí)行包格式
VPC采用VLIW體系結(jié)構(gòu),可變長的指令編碼使得編譯器能夠根據(jù)計算需求選擇不同長度的指令,便于程序代碼和性能優(yōu)化。MVSim支持2種可變長的指令編碼:32位處理器采用16/32位指令編碼;64位處理器采用40/80位指令編碼。根據(jù)目標(biāo)應(yīng)用的需求,可以很容易地擴(kuò)展到其他格式的指令編碼。這里以64位處理器為例進(jìn)行介紹。
取指包和執(zhí)行包的格式如圖3所示。所有指令均為40/80位指令,指令長度通過指令編碼的第2~3位值進(jìn)行區(qū)分。處理器每次從外存中取出512位的取指包,取指包內(nèi)包含1個以上的執(zhí)行包,2個執(zhí)行包之間無填充,執(zhí)行包邊界由指令的并行位決定。指令中的并行位P(第0位)的含義是:P=0表示本條指令與下一條指令不在同一個執(zhí)行包中;P=1表示本條指令與下一條指令在同一個執(zhí)行包中。一個執(zhí)行包按40 位對齊,包括標(biāo)量指令與向量指令。
Figure 3 Formats of instruction fetch packet and execution packet圖3 取指包和執(zhí)行包的格式
一個執(zhí)行包內(nèi)80位指令集中在前面,40位指令集中在后面。一個執(zhí)行包至多包含4條80位指令,且一個執(zhí)行包大小不超過480 bit。處理器包含5個標(biāo)量部件和6個向量部件。因此,一個執(zhí)行包可包含1~11條指令,其長度為5~60個字節(jié)。執(zhí)行包的構(gòu)成為x*80+y*40格式,其中x和y均大于0且滿足:
(1)x≤4;
(2)y≤11;
(3)x+y≤11;
(4)x*80+y*40≤480。
圖3b描述了多個執(zhí)行包在存儲器中的位置,其中,80_low表示80位指令的低40位,80_high表示80位指令的高40位,40表示40位指令。
3.3.2 取指和指令解碼
VPC的指令根據(jù)操作數(shù)的個數(shù)和種類分別劃分為長立即數(shù)MOV指令(40位、80位)、長立即數(shù)分支指令、長立即數(shù)Load/Store 指令、單操作數(shù)指令、雙操作數(shù)指令和三操作數(shù)指令。以三操作數(shù)指令為例說明如何根據(jù)指令格式進(jìn)行指令解碼。三操作數(shù)指令編碼格式如圖4所示。
Figure 4 Encoding format of three-operand instructions圖4 三操作數(shù)指令編碼
VPC的指令支持條件操作,Reg字段用以標(biāo)識條件寄存器編號。Z字段用于條件判斷,若Z=0,則條件寄存器為非0時執(zhí)行當(dāng)前指令;若Z=1,則條件寄存器為0時執(zhí)行當(dāng)前指令。V字段用以標(biāo)識標(biāo)量或向量指令,若V=0則當(dāng)前指令為標(biāo)量指令,若V=1則當(dāng)前指令為向量指令。P字段標(biāo)識當(dāng)前指令是否與下一條指令并行執(zhí)行,若P=0,則當(dāng)前指令不與下一條指令并行執(zhí)行,若P=1,則當(dāng)前指令與下一條指令并行執(zhí)行。Dst、Src1、Src2、Src3字段分別標(biāo)識當(dāng)前指令的目的、源操作數(shù)1、源操作數(shù)2、源操作數(shù)3的寄存器編號。OP字段用以標(biāo)識執(zhí)行指令的操作碼。Type字段用以標(biāo)識當(dāng)前指令所屬功能單元和指令分類。
VPC的取指過程如下所示:
pos=0;
do{
readBufferFrom(&next_inst,currentPC+pos.InstLen);
type=parser(next_inst);
switch(type){
caseLONGIMMMOV40:
decodeLongImmMov40(next_inst);
break;
caseLONGIMMMOV80:
decodeLongImmMov80(next_inst);
break;
caseLONGIMMBRANCH:
decodeLongImmBranch(next_inst);
break;
caseLONGIMMLOATSTORE:
decodeLongImmLoatStore(next_inst);
break;
caseONEOPERATION:
decodeOneOperation(next_inst);
break;
caseTWOOperation:
decodeTwooperation(next_inst);
break;
caseTHREEOperation:
decodeThreeoperation(next_inst);
break;
)while(next_inst[0]&1)
模擬器循環(huán)讀取取指包,直到讀取的指令的P字段值為0為止。對讀取到的每一條指令,解析指令的Type字段,根據(jù)解析到的字段值將指令派發(fā)到不同指令類型的解碼函數(shù)。解碼函數(shù)根據(jù)指令編碼格式執(zhí)行詳細(xì)的指令解碼。
多核處理器的多級存儲體系結(jié)構(gòu)模型如圖5所示,共包含4個層級。
Figure 5 Multi-level storage architecture model圖5 多級存儲體系結(jié)構(gòu)模型
第0級:VPC的標(biāo)量寄存器文件和向量寄存器文件;
第1級:VPC的L1P、標(biāo)量存儲器(可配置為L1D Cache或SRAM模式)和陣列存儲器;
第2級:全局共享存儲器(可配置為全局共享Cache或SRAM模式);
第3級:片外的大容量HBM/DDR、EMIF的數(shù)據(jù)空間。
其中第1級的標(biāo)量存儲可配置為L1D Cache或SRAM模式,第2級的全局共享存儲可配置為全局共享Cache或SRAM模式。
L1P缺省配置為2路組相聯(lián)Cache,Cache容量(capacity)為64 KB,Cache行大小(line size)為64 B,CPU(access time)訪問時間為1個時鐘周期,Cache行分配策略為讀分配。Cache替換策略為最近最少使用的Cache行被替換,且標(biāo)記新載入的Cache行最近被使用。
數(shù)據(jù)Cache支持2級Cache(第1級的標(biāo)量存儲可配置為L1D Cache,第2級的全局共享存儲可配置為全局共享L2D Cache)。數(shù)據(jù)Cache訪存分為命中和缺失。若是讀缺失,則向下一級Cache或存儲發(fā)送缺失請求,并返回缺失數(shù)據(jù),Cache行依據(jù)LRU替換策略。若是寫缺失,則采取寫回寫分配策略,先從下一級Cache或存儲讀取缺失數(shù)據(jù),并依據(jù)LRU替換策略替換舊的Cache行,再執(zhí)行寫操作。若是讀命中,命中的Cache行數(shù)據(jù)返回給CPU,同時更新LRU位。若是寫命中,采用寫回策略將數(shù)據(jù)寫入Cache。當(dāng)Cache行被改寫時,該行的對應(yīng)的Dirty位被置1,記為臟行。當(dāng)臟行因為其他的缺失被替換時,需要將臟行寫回至數(shù)據(jù)空間。
為方便使用和靈活擴(kuò)展,Cache模塊的各種參數(shù)均設(shè)計為可配置,包括Cache容量(capacity)、Cache行大小(line size)、Cache組大小(ways)、CPU access time、Single read miss stall、Write miss等。
MVSim支持以下3種DMA數(shù)據(jù)傳輸模式:
(1)點對點傳輸模式。點對點傳輸是指VPC核通過DMA發(fā)起的片上存儲器(SM和AM)和片外存儲器(GSM和HBM/DDR)之間的數(shù)據(jù)交換。每次DMA啟動可完成一個一維或二維數(shù)據(jù)塊的傳輸。
(2)分段傳輸模式。分段傳輸是指DMA從片外存儲器(GSM和HBM/DDR)中讀取連續(xù)數(shù)據(jù)段,并根據(jù)數(shù)據(jù)分段模式向多個VPC核發(fā)送數(shù)據(jù)段,不同VPC可接收不同的數(shù)據(jù)段。數(shù)據(jù)分段模式是程序員可配置的,其決定每個數(shù)據(jù)段的目標(biāo)核,如第1段數(shù)據(jù)發(fā)給哪些核,第2段數(shù)據(jù)發(fā)給哪些核等。數(shù)據(jù)分段模式由分段傳輸控制寄存器控制,包含4個字段:循環(huán)分段模式、循環(huán)次數(shù)、循環(huán)步長和分段粒度。循環(huán)分段模式是指數(shù)據(jù)返回給多個VPC內(nèi)核的形式;循環(huán)次數(shù)是指移位的次數(shù);循環(huán)步長是指下一段數(shù)據(jù)傳輸時循環(huán)分段模式右移的長度;分段粒度是指每一段數(shù)據(jù)的長度。
(3)廣播傳輸模式。廣播傳輸指的是DMA將從HBM/DDR讀取的一個數(shù)據(jù)塊發(fā)送至所有目標(biāo)核。
上述模式中,點對點傳輸由每個核獨立控制,數(shù)據(jù)傳輸過程中不需要與其他核進(jìn)行同步。而分段傳輸和廣播傳輸都是由一個主機(jī)核進(jìn)行配置和啟動,從機(jī)核進(jìn)行計數(shù),多核之間需要通過柵欄機(jī)制完成同步。
多核柵欄同步的模擬過程如圖6所示。由于目標(biāo)多核處理器的核間共享了GSM和HBM/DDR存儲空間,需要設(shè)計硬件柵欄機(jī)制實現(xiàn)多核同步。硬件柵欄同步功能是通過Load指令訪問存儲器完成。所有的柵欄同步單元全局統(tǒng)一編址,通過訪問Memory Map Register的地址進(jìn)行柵欄同步操作。柵欄同步單元用于多核間的相互等待,當(dāng)多個核需要在某個點進(jìn)行同步的時候需要用到柵欄同步操作。所有的柵欄實例對程序員透明,程序員僅需明確參與同一柵欄同步的處理器核和核數(shù)量,以及賦予同一柵欄同步的編號。
Figure 6 Simulation process of multi-core fence synchronization圖6 多核柵欄同步的模擬過程
Address[31:20](=12’h301)表明這是訪問柵欄同步單元的操作。Address[19]設(shè)置為0表示是柵欄同步請求,設(shè)置為1表示對柵欄同步單元寄存器進(jìn)行配置。Address[7:4]為此次柵欄同步編號,所有參與同一柵欄同步的處理器核通過該編號確認(rèn)是不是同一次柵欄同步。Address[11:8]表示參與此次柵欄同步的處理器核總數(shù)。
MVSim采用多線程模擬多核向量處理器,用一個主線程模擬多核向量處理器,讀取配置文件,根據(jù)核數(shù)創(chuàng)建相應(yīng)數(shù)量的線程,每一個VPC核用一個線程模擬。因此,MVSim是用主機(jī)上的一個多線程程序來模擬目標(biāo)處理器上的一個多核程序運(yùn)行。這種方法一方面盡可能真實地模擬了多核程序的并發(fā)執(zhí)行,同時也盡可能多地利用了主機(jī)的多核處理器資源,大幅度提高了模擬器的運(yùn)行速度。每個線程記錄了對應(yīng)VPC核的所有運(yùn)行狀態(tài),包括詳細(xì)的程序指令執(zhí)行、寄存器讀寫、存儲器訪問、DMA數(shù)據(jù)傳輸、Cache訪問、性能統(tǒng)計等。主線程一直運(yùn)行,直到所有線程結(jié)束。最后,輸出每個線程的運(yùn)行日志,取所有核的運(yùn)行時間最大值作為多核程序的運(yùn)行時間。
如圖7所示,影響程序執(zhí)行時間的因素包括:程序指令執(zhí)行時間、內(nèi)存訪問時間、訪存沖突引起的流水線停頓時間和DMA數(shù)據(jù)傳輸時間。程序指令執(zhí)行時間是指指令數(shù)據(jù)就緒情況下的指令執(zhí)行時間。內(nèi)存訪問時間Tmem是指程序指令執(zhí)行過程中因取指或取數(shù)發(fā)生的存儲訪問時間,其計算如式(1)所示:
Figure 7 Factors affecting program execution time圖7 影響程序執(zhí)行時間的因素
Tmem=countHit*timeHit+
countMiss*penaltyMiss
(1)
其中,countHit、timeHit分別為Cache命中時的次數(shù)和訪存時間,countMiss、penaltyMiss分別為Cache不命中時的次數(shù)和訪存時間。countHit和countMiss由模擬器根據(jù)程序運(yùn)行情況統(tǒng)計得到,而timeHit和penaltyMiss是可配置的,根據(jù)模擬的目標(biāo)處理器情況在模擬器配置文件中進(jìn)行修改。
訪存沖突引起的流水線停頓時間主要包括以下3類:
(1)SBR Busy時間:分支目標(biāo)所在的執(zhí)行包跨了取指包邊界會引起流水線停頓,該停頓時間記為TSBR;
(2)SM Busy時間:標(biāo)量Load/Store指令與DMA訪問標(biāo)量存儲器的同一個存儲體(Bank)時,會導(dǎo)致訪問沖突,該沖突引起的流水線停頓時間記為TSM。
(3)AM Busy時間:2條向量Load/Store指令同時訪問一個Bank,或者向量Load/Store指令與DMA訪問陣列存儲器的同一個Bank時,會導(dǎo)致沖突,該沖突引起的流水線停頓時間記為TAM。
DMA數(shù)據(jù)傳輸時間TDMA是根據(jù)傳輸數(shù)據(jù)量Total_Byte與平均數(shù)據(jù)傳輸帶寬Bm得到的,具體計算如式(2)所示:
TDMA=Total_Byte*Bm
(2)
其中,Total_Byte由模擬器根據(jù)程序運(yùn)行情況統(tǒng)計得到;平均數(shù)據(jù)傳輸帶寬Bm是可配置的,根據(jù)模擬的目標(biāo)處理器情況在模擬器配置文件中進(jìn)行修改。平均數(shù)據(jù)傳輸帶寬按照源地址與目的地址的不同分為6類(GSM to SM,GSM to AM,DDR to SM,DDR to DDR,DDR to GSM),可以預(yù)先分別進(jìn)行測試與統(tǒng)計,取其平均值作為模擬器的配置參數(shù)。
由于DMA傳輸是后臺操作,與程序指令執(zhí)行時間重疊。每次DMA事務(wù)結(jié)束時,根據(jù)DMA數(shù)據(jù)傳輸時間對程序指令執(zhí)行時間進(jìn)行修訂。設(shè)DMA啟動與結(jié)束時刻的當(dāng)前程序指令執(zhí)行時間分別為Time0和Time1,當(dāng)次計算得到的DMA數(shù)據(jù)傳輸時間為TDMA。若TDMA>(Time1-Time0),則修訂后的當(dāng)前程序指令執(zhí)行時間為Time1=Time0+TDMA,否則保持不變。
第i個核上程序執(zhí)行時間為Ti如式(3)所示:
Ti=TSBR+TSM+IAM+Tx
(3)
其中,Tx表示修訂后的當(dāng)前程序指令執(zhí)行時間。
最后取所有核上程序執(zhí)行時間最大值作為程序的執(zhí)行時間,如式(4)所示:
T=max(Ti)
(4)
本文測試集包括7個關(guān)鍵算法(單核和多核、單精度和半精度)的28個程序,用于測試和評估MVSim的準(zhǔn)確性和性能。表1描述了這些算法及其輸入?yún)?shù)。后續(xù)測試程序名稱以首字母區(qū)分精度(如單精度gemm用sgemm表示,半精度gemm用hgemm表示);以后綴數(shù)字區(qū)分單核和四核測試程序(如單精度單核gemm用sgemm_1表示,如單精度四核gemm用sgemm_4表示)。
Table 1 Test program set
L1P和L1D:分別在寄存器傳輸級(RTL)實現(xiàn)和MVSim中模擬7個單精度程序,并統(tǒng)計程序執(zhí)行期間L1P未命中的次數(shù)。表2列出了測試程序的L1P未命中次數(shù)、代碼大小和指令獲取數(shù)據(jù)包。獲取數(shù)據(jù)包的指令數(shù)是根據(jù)代碼大小Dcode計算得到的。假設(shè)指令獲取包的大小為64 B,那么指令獲取包數(shù)量NFP=Dcode/64。從表2中可以看出,RTL和MVSim獲得的L1P未命中的數(shù)量相同,這與計算的提取分組的數(shù)量完全相同。
Table 2 Performance of various test programs
(1)計算結(jié)果:RTL和MVSim分別模擬了7個單精度程序和7個半精度程序,計算結(jié)果完全一致。
(2)程序計算性能:有2種情況:①數(shù)據(jù)存儲在片上存儲器中,并分別在RTL和MVSim中模擬了7個單精度程序和7個半精度程序,程序計算性能完全相同。②數(shù)據(jù)在片外存儲器中。由于MVSim對DMA、DDR和多核圍欄的模擬是一種功能模擬,因此程序的計算性能取決于統(tǒng)計獲得的參數(shù)數(shù)據(jù),存在一定的性能誤差。圖8顯示了gemm和fft程序(單核和四核,單精度和半精度)的性能誤差,它們的平均性能誤差約為2.9%。
Figure 8 Performance error of gemm and fft in RTL and MVSim圖8 RTL和MVSim中g(shù)emm和fft的性能誤差
(1)模擬器性能。如圖9所示,分別在MVSim、CCS和RTL模擬器中測試了7個程序在不同條件下(單核和四核、單精度和半精度)的模擬執(zhí)行時間。圖9a顯示,在模擬單精度單核程序時,MVSim分別比RTL和CCS的快63倍和4倍。圖9b顯示,在模擬單精度四核并行程序時,MVSim的分別比RTL和CCS的快315倍和4.5倍。圖9c顯示,在模擬半精度單核程序時,MVSim的分別比RTL和CCS的快66倍和4.7倍。圖9d顯示,在模擬半精度四核并行程序時,MVSim的分別比RTL和CCS的快465倍和7倍。
(2)模擬器的可擴(kuò)展性。在3臺不同配置的主機(jī)上測試了不同核數(shù)模擬器的執(zhí)行性能,結(jié)果如圖10所示。從圖10可以看出,MVSim具有良好的可擴(kuò)展性。
Figure 10 Execution performance of simulators with different kernel numbers圖10 不同核數(shù)模擬器的執(zhí)行性能
本文設(shè)計了一種適用于多核向量體系結(jié)構(gòu)的快速、可擴(kuò)展、性能精確的軟件模擬器MVSim。它模擬了處理器的邏輯功能,可以準(zhǔn)確地模擬硬件處理器程序指令的運(yùn)行過程。實際使用結(jié)果表明,該模擬器在處理器的設(shè)計中能夠發(fā)揮非常重要的作用:(1) 模擬器可以提前模擬程序執(zhí)行過程,并反饋設(shè)計是否符合要求,從而改進(jìn)處理器設(shè)計;(2) 該模擬器有助于芯片設(shè)計過程中的芯片測試和驗證,通過比較RTL測試結(jié)果與模擬器執(zhí)行結(jié)果,可以及時發(fā)現(xiàn)設(shè)計錯誤;(3) 模擬器可以模擬運(yùn)行程序在處理器上的執(zhí)行過程,記錄完整的程序執(zhí)行日志,有助于應(yīng)用程序的開發(fā)、調(diào)試和性能分析;(4) 模擬器可以提供給潛在用戶進(jìn)行早期應(yīng)用開發(fā),有助于加快芯片的應(yīng)用推廣和用戶應(yīng)用的快速開發(fā)與部署。