朱大林,郭德源,何 虎
(清華大學 微電子學研究所,北京100084)
計算機模擬器是指用軟件技術(shù)和一定的硬件技術(shù),模擬真實的計算機運行過程的系統(tǒng)平臺[1]。根據(jù)模擬器實現(xiàn)的功能及面向的使用對象不同,可以將其分為兩類:功能模擬器和性能模擬器[2]。功能模擬器主要是實現(xiàn)處理器的結(jié)構(gòu),不包括處理器的微體系結(jié)構(gòu),具有仿真速度快,但是仿真精度有所損失?,F(xiàn)代處理器體系結(jié)構(gòu)的確定通常是一個團隊進行性能分析、不斷改進的結(jié)果[3]。目前常見的用于研究的多種體系結(jié)構(gòu)模擬器有SimpleScalar,SimOS,GEM5,Liberty,QEMU,Simics等[4],但是針對 VLIW 體系結(jié)構(gòu)的模擬器還比較少,特別是不同VLIW DSP體系結(jié)構(gòu)的差異很大,很難有一種通用的模擬器。
本文基于gem5[5]模擬器,通過修改原有的執(zhí)行流程,提出了一種面向VLIW架構(gòu)DSP的模擬器的快速實現(xiàn)方法,解決了指令在模擬器上的順序執(zhí)行模型和VLIW DSP上并行執(zhí)行的問題,實現(xiàn)了16/32位混合指令的執(zhí)行,并定義了完整的指令集,快速實現(xiàn)了一款VLIW DSP的指令級精度的模擬器,滿足了VLIW DSP的指令級精度仿真要求。
VLIW DSP是具有多個功能單元,將多條可以并行執(zhí)行的指令組合成為一條超長指令,以實現(xiàn)多條指令并行執(zhí)行。VLIW可以提供較高的指令并行度,同時,由于要求所執(zhí)行的指令已經(jīng)由編譯器或者編程人員確保為可以并行執(zhí)行的指令,不需要硬件判斷是否可以并行執(zhí)行,所以,硬件結(jié)構(gòu)比較簡單。VLIW DSP指令系統(tǒng)具有以下特點:
超長指令字,一般為128-1024bit,而且指令之間沒有依賴性,并且指令操作不會沖突,因此可以并行執(zhí)行。
一條指令可以包含多個可以并行執(zhí)行的機器指令,從而提供了更高的指令級并行度[6]。
通常只有一個控制器,每個周期發(fā)射一條超長指令,由多條普通指令組成。
Lily處理器是清華大學微電子所基于自行提出的Gingko處理器結(jié)構(gòu)開發(fā)的一款數(shù)字信號處理器。如圖所示,Lily作為一款高性能數(shù)字信號處理器,和模擬器相關(guān)的主要特點如下:
為了減少程序使用的存儲空間,從而減少功耗,采用了16/32位變長指令集[7]。
采用超長指令字結(jié)構(gòu),處理器包含6個獨立的功能單元,每個時鐘周期最多可以并行執(zhí)行6條指令。
處理器包含3種不同功能單元類型,其中A:算術(shù)邏輯運算功能單元,執(zhí)行加減法算術(shù)操作,移位指令和邏輯操作;M:乘法功能單元,執(zhí)行乘法,乘累加,乘累減,點積等操作;D:數(shù)據(jù)傳輸功能單元,執(zhí)行存儲器訪問指令以及比較指令。
·片內(nèi)集成了一個全局寄存器堆和兩個本地寄存器堆,全局寄存器堆包含8個32位通用寄存器;本地寄存器堆包含24個32位通用寄存器。其中全局寄存器堆X、Y簇功能單元都可訪問,局部寄存器堆分別只有對應的X、Y簇功能單元可以訪問。
圖1 Lily處理器總體架構(gòu)
為了達到以最小代價實現(xiàn)Lily DSP的指令級精度的模擬器的要求,移植基于gem5的AtomicSimple模型進行,其中Atomic是指訪存模式,在這種模式下,所有的訪存都是在請求發(fā)出后立即返回,也就是說沒有模擬訪存的時間、隊列特性[5];Simple模型是指處理器順序執(zhí)行,無流水線的指令級精度處理器模擬器[5]。
Gem5的AtomicSimpleCPU是一個順序執(zhí)行的過程,具有一般指令級精度模擬器的解釋執(zhí)行方式,具體執(zhí)行過程如圖2所示。
在每一個仿真周期里,首先訪問指令頁表緩沖(TLB)[8],進行虛實地址轉(zhuǎn)換,然后訪問指令緩存取指,然后是解碼以及執(zhí)行,在做一些必要的處理,比如統(tǒng)計指令所在功能單元情況后,PC前進一條指令,然后重復這個過程直到程序結(jié)束。
圖2 Gem5AtomicSimpleCPU模型
VLIW DSP是一個并行的執(zhí)行過程,在lily處理器中,有6個功能部件可以并行執(zhí)行,如何在順序模型的基礎(chǔ)上,實現(xiàn)并行執(zhí)行的模型,就成為移植VLIW DSP模擬器的難點。在VLIW DSP中,由于多條指令可能同時訪存,所以經(jīng)常采用寄存器分簇的方式,Lily處理器有兩個簇,本文將分簇的寄存器堆統(tǒng)一管理。由于模擬器上是順序執(zhí)行指令的,一條指令可能會改寫某個寄存器,而下一條指令可能也需要訪問同一個寄存器,所以會造成寄存器訪問沖突。而實際的VLIW DSP是并行的,在指令周期結(jié)束后才會寫回寄存器,在對寄存器多讀一寫的情況時,在順序執(zhí)行模型下會發(fā)生沖突,而硬件并行執(zhí)行時由于寫寄存器是在周期結(jié)束時才發(fā)生,而這時需要讀寄存器的操作已經(jīng)完成,所以并不存在沖突。所以,在模擬器上需要先備份寄存器堆,一個并行包執(zhí)行結(jié)束后,執(zhí)行結(jié)果再統(tǒng)一寫回寄存器。
由于Lily處理器采用了16/32位混合指令以縮小程序長度,而在Gem5的模型上是32位指令的,必須實現(xiàn)一種機制保證能執(zhí)行16/32位混合指令。
另外,Lily處理器的寄存器是分簇的,包括X、Y簇以及一個全局寄存器堆,而gem5上的寄存器是線性地址,所以需要有一個實現(xiàn)分簇的寄存器堆的轉(zhuǎn)換的機制。
16/32位混合指令機制:由于Gem5的AtomicSimple模型取指的時候,總是從4字節(jié)對齊的地方取32位指令,PC的后兩位相當于被忽略,所以在Gem5的取指流程中,加入了一個判決機制來保證取指的正確性,其流程如下:
BEGIN
(1)從當前PC取32位指令存入inst1。
(2)從PC+4的地方取32位指令存入inst2。
(3)如果PC & 3不為0,也就是PC不是4字節(jié)對齊的時候,將inst1的后16位和inst2的前16位組合成為一條32位指令送給真正的inst。
(4)如果inst是16位指令,則PC=PC+2,否則PC=PC+4。
END
寄存器堆備份/恢復機制:每條并行執(zhí)行的指令,都應該讀取同樣內(nèi)容的寄存器堆,即一條指令不應該影響同一并行組的其它指令訪問寄存器,也就是說必須等同一并行組所有指令執(zhí)行完畢才能寫回寄存器堆。這個功能通過在每個新的并行指令組開始時備份寄存器堆、并行組內(nèi)每條指令執(zhí)行完后恢復寄存器堆來實現(xiàn)。
指令結(jié)果延時寫回機制:由于是在指令順序執(zhí)行的基礎(chǔ)上實現(xiàn)并行執(zhí)行的模擬,這需要保存任何一條指令的結(jié)果(對寄存器堆的修改),到并行指令組執(zhí)行結(jié)束時再寫回。另外,如果一條指令的周期數(shù)大于1,則需要等待相應個并行指令組周期之后才能寫回結(jié)果。
通過在每條指令執(zhí)行之后,保存每條指令的結(jié)構(gòu),記錄寄存器堆的變化、延時周期數(shù)等信息,并在適當時間寫回,這個功能得以實現(xiàn)。
延時跳轉(zhuǎn)機制的實現(xiàn):當遇到跳轉(zhuǎn)指令時,保存其目標地址。如果是延遲跳轉(zhuǎn)指令,在5個并行指令組周期之后延遲更新PC。如果是非延遲跳轉(zhuǎn)指令,而且發(fā)生跳轉(zhuǎn)的條件滿足時,在下個并行指令組周期更新PC,并將統(tǒng)計周期數(shù)加5。
分簇寄存器的線性化機制:Lily處理器每個分簇可以訪問24個本地寄存器和8個全局寄存器共32個寄存器,在指令編碼中可以用5bit來表示,而且5bit最多也只能表示32個寄存器。為了解決Lily處理器硬件上的寄存器分簇方式和模擬器上的寄存器線性地址之間的矛盾,只能在解碼的時候根據(jù)分簇的信息將寄存器地址線性化。線性化流程如下:
BEGIN
(1)在取指時判斷分簇信息。
(2)在解碼時,如果是X簇并且不是全局寄存器,則保持原寄存器地址不變;如果是Y簇或者訪問的是全局寄存器,則寄存器地址加24。這樣,寄存器編制方式由X0,X1…X23,Y0,Y1…Y23,G0,G1…G7變?yōu)镽0,R1…R55共56個寄存器。
(3)在模擬器上運行完后,顯示輸出信息時,將線性寄存器地址按相反的過程映射到分簇的寄存器地址。
END
統(tǒng)計信息:提供了對程序執(zhí)行的總周期數(shù)和總指令數(shù)進行統(tǒng)計,并計算每周期指令數(shù)(IPC);
對A/M/D單元指令數(shù)量的統(tǒng)計,并計算百分比;
可以方便添加其它統(tǒng)計信息。
運行時錯誤檢查:Lily處理器對指令的執(zhí)行有多條限制,如:不能在同一時刻寫入同一寄存器,寄存器讀寫沖突;BD延遲槽不能再出現(xiàn)跳轉(zhuǎn)指令,且延時結(jié)束時不應該有未執(zhí)行完的指令;等等。在VLIWSimpleCPU模型中,加入了這些檢查。
如圖3所示,首先建立了VLIWSimpleCPU模型,在原來的順序執(zhí)行流程中,通過加入兩個新的流程實現(xiàn)模擬并行的效果。
圖3 VLIWSimpleCPU流程模型
因為Lily處理器根據(jù)獲取的超長指令字包中各指令對應的功能單元的編號大小判斷當前指令是否能夠與下一指令并行執(zhí)行[9],所以在取指之后,解碼之前加入一個流程:首先,檢查指令機器碼中的功能單元是否升序,也就是說,Lily處理器的功能單元是按照XA、XM、XD、YA、YM、YD順序來排列的,如果取得的指令的功能單元是升序,說明這是同一個指令組,否則是一個新的指令組。如果不是一個新的指令組,那么,對應著VLIW DSP上還在同一周期,因為所有的控制流程都發(fā)生在一個并行指令組執(zhí)行完成時,所以這條指令進入順序執(zhí)行流程。
如果是新的指令組,那么對應著VLIW DSP也前進一個周期,此時,由于延遲跳轉(zhuǎn)或者跳轉(zhuǎn)倒計時減一個周期,需要根據(jù)倒計時的值判斷是否需要更新PC值。如果需要更新PC值,分為跳轉(zhuǎn)、不跳(條件跳轉(zhuǎn)的條件不成立的情形)、BD(延遲跳轉(zhuǎn))3種情形,更新PC,到下一個tick,執(zhí)行另一個新的并行組。如果不需要更新PC值,表示這個新的并行組將會被執(zhí)行,周期數(shù)加1,倒計時延遲寫回的結(jié)果,寫回需要寫回的結(jié)果后備份整個寄存器堆。
在后續(xù)處理之后,PC前進一條指令之前,加入一個流程:統(tǒng)計指令執(zhí)行的信息,比如功能單元的使用情況;備份當前指令的結(jié)果,并設定延遲寫回的周期數(shù)以模擬多周期指令和并行執(zhí)行的情況,由于在同一個并行組執(zhí)行的指令需要使用整個并行組執(zhí)行前的寄存器堆狀態(tài),所以恢復整個寄存器堆以便下一條指令使用,如果是跳轉(zhuǎn)指令,設定延時更新PC,然后進行運行時錯誤檢查。
Gem5[5]模擬器是由美國密歇根大學開發(fā)的一款開源處理器模擬器,是可配置、集成多種指令集(ISA)和多種處理器模型的體系結(jié)構(gòu)模擬器。Gem5具有很強的靈活性,提供了多種處理器模型,多種系統(tǒng)模型以及多種存儲模型,采用面向?qū)ο蟮脑O計。Gem5提供了定制硬件的功能,gem5提供了ISA DSL(domain-specific languages)[5],可以用來指定ISA。Gem5的配置主要是由python語言來完成的,而主要結(jié)構(gòu)是用C++來完成的。首先,配置gem5聲明新的VliwSimpleCPU模型;然后改寫處理器模型及寄存器定義;添加16/32位混合指令取指機制,最后添加處理器的ISA定義。
修改編譯選項,添加超長指令字的處理器選項;修改配置腳本文件,添加VLIW DSP的處理器模型;修改配置文件,添加目標指令信息以及自定義統(tǒng)計標志;
從相似體系結(jié)構(gòu)移植目標處理器的體系結(jié)構(gòu)。
其中配置文件的部分代碼如下:
TARGET_ISA=‘lily’
CPU_MODELS=‘InOrderCPU,VliwSimpleCPU’
修改AtomicSimpleCPU模型,實現(xiàn)前面提出的Vliw SimpleCPU模型模擬VLIW DSP執(zhí)行的情況;
定義寄存器堆。
樣品及耗材:藍莓(藍雨),余姚市舜南休閑農(nóng)莊藍莓種植基地產(chǎn);葡萄酒果酒專用酵母,安琪酵母股份有限公司;二氧化硫(食品級),天津化工廠;白砂糖(一級),廣東江門甘蔗化工廠。
部分代碼用偽C++代碼描述如下:
VliwSimpleCPU::tick(){
fetch inst;
//檢查是否升序判斷是否新的并行指令組
checkInstOrder();//功能單元是否升序
if(isNewParallelGroup()){
countDownPCCycle();
if(nowUpdateTargetPC()){
}
BackupRegFiles();
}
//如果不是新的并行指令組則正常執(zhí)行
RestorRegFiles();
…
updatePC();
}
首先,定義寄存器類型,TLB,中斷等所有處理器相關(guān)的特性,然后,是具體指令集的實現(xiàn),包括指令編碼方式的定義,指令模板的定義,條件寄存器選擇位的實現(xiàn),以及全部指令具體功能的定義等。
Gem5提供了很方便的ISA DSL,定義自定義指令集。首先定義位域含義,然后,再定義指令執(zhí)行的動作。如以下表示指令的23-20位可以用RS表示,然后在執(zhí)行的時候經(jīng)過層層解碼,最后解出來是一個減法指令,在后面寫出具體的動作,這里Rs.sl表示Rs是一個寄存器,由上面的位域定義規(guī)定在指令里的位,sl表示屬性。這樣就規(guī)定好了一條指令。
def bitfield RS<23:20>
decode OPCODE1{
0x2:IntOp::sub_16_xa(Rd_16.sl=Rd_16.sl– Rs_16.sl);
…
在完成了Lily處理器的處理器模型后,需要添加指令集,這里采用了每添加一類指令后,分別對每一類指令的每一條指令分別測試,驗證單條指令執(zhí)行的正確性。測試項目如表1所示,測試結(jié)果表明,gem5正確模擬執(zhí)行了指令集里的所有指令。
表1 模擬器單條指令測試
在單獨測試完每一條指令的正確性后,還需要測試模擬器運行Lily處理器的典型應用程序的正確性以及周期數(shù)。如圖4所示,測試結(jié)果表明,模擬器上的周期數(shù)和硬件上執(zhí)行的周期數(shù)是一致的,達到了指令級精度的要求。
圖4 模擬器測試周期數(shù)(向量長度為32)
Gem5是m5和gems最好的部分的綜合[5],gem5采用了面向?qū)ο蟮木幊棠P停ㄟ^良好的層次結(jié)構(gòu),使得用戶可以方便的添加新的處理器模型[10],在gem5模擬器的基礎(chǔ)上,通過移植,快速實現(xiàn)了一款VLIW DSP的指令級精度的模擬器。相較于其它實現(xiàn)方法,本文提出的實現(xiàn)方法利用了開源軟件,在原有的模型上加入了VLIW DSP的處理流程模型,具有原理簡單,降低了實現(xiàn)復雜度,實現(xiàn)迅速的優(yōu)點,滿足了VLIW DSP的指令級精度仿真的需求。
在需要模擬處理器的更多細節(jié),以及需要進行性能仿真時,gem5提供了其它的具有更多細節(jié)的處理器模型??梢曰谟懈嗉毠?jié)的模型進行移植。
[1]YANG Wei,CHEN Mingyu,XU Jianwei.Fast implementation of cycle-level processor simulator[J].Computer Engineering and Applications,2010,46(6):63-66(in Chinese).[楊偉,陳明宇,許建衛(wèi).一種時鐘級處理器模擬器的快速開發(fā)方法[J].計算機工程與應用,2010,46(6):63-66.]
[2]YANG Yibin.Design and implementation of multi-target instruction set simulator[D].Zhengzhou:The PLA Information Engineering University,2009(in Chinese).[楊義彬.多目標指令集模擬器的設計與實現(xiàn)[D].鄭州:解放軍信息工程大學,2009.]
[3]ZHANG Fuxin,ZHANG Longbing,HU Weiwu.Simgodson:a godson processor simulator based on SimpleScalar[J].Chinese Journal of Computers,2007,30(1):68-73(in Chinese).[張福新,章隆兵,胡偉武.基于SimpleScalar的龍芯CPU模擬器Sim-Godson[J].計算機學報,2007,30(1):68-73.]
[4]XU Jianwei,CHEN Mingyu,YANG Wei,et al.Technology and trends of computer architecture simulators[J].Journal of System Simulators,2009,21(20):6325-6331(in Chinese).[許建衛(wèi),陳明宇,楊偉,等.計算機體系結(jié)構(gòu)模擬器技術(shù)和發(fā)展[J].系統(tǒng)仿真學報,2009,21(20):6325-6331.]
[5]Brad Beckmann.The gem5simulator[EB/OL].[2011-06-05].http://www.gem5.org/dist/tutorials/isca_pres_2011.pdf.
[6]YAN Yingjian,YE Jiansen,LIU Junwei,et al.VLIW processor ISA modeling and aided software optimization technology[J].Computer Engineering and Design,2009,30(11):2727-2729(in Chinese).[嚴迎建,葉建森,劉軍偉,等.VLIW處理器ISA建模與輔助軟件優(yōu)化技術(shù)[J].計算機工程與設計,2009,30(11):2727-2729.]
[7]Yuan Liu,Hu He,Teng Xu.Architecture design of variable lengths instructions expansion for VLIW[C]//Changsha,Hunan:IEEE 8th International Conference on ASIC,2009.
[8]David A Patterson,John L Hennessy.Computer organization and design[M].3rd ed.San Francisco:Morgan Kaufmann Publishers,2005:521-527.
[9]Huawei Technologies Co,Tsinghua University.A Parallel Execution Method and Equipment for VLIW[P].China:200810101451.9,2009(in Chinese).[華為技術(shù)有限公司,清華大學.一種超長指令字指令并行執(zhí)行方法及裝置[P].中國:200810101451.9,2009]
[10]ZHAO Jingyan.Implementation of ARCA3Full system based on M5[D].Harbin:Harbin Institute of Technology,2010(in Chinese).[趙景琰.基于M5的方舟3全系統(tǒng)實現(xiàn)[D].哈爾濱:哈爾濱工業(yè)大學,2010.]