本發(fā)明屬于計算機技術(shù)領(lǐng)域,具體涉及一種并行多核處理器的全系統(tǒng)模擬器。
背景技術(shù):
隨著多核技術(shù)的不斷發(fā)展,微處理器結(jié)構(gòu)變得越來越復(fù)雜,開發(fā)成本越來越高,開發(fā)周期也越來越長。如何驗證設(shè)計的有效性,對提高設(shè)計的效率和成功率起著至關(guān)重要的作用,模擬便是為了達(dá)到這一目的而廣泛使用的技術(shù)。模擬器在處理器設(shè)計或體系結(jié)構(gòu)研究中的作用也變得不可或缺。一方面,硬件設(shè)計者可以對模擬器進(jìn)行擴展,從而對未來的處理器進(jìn)行設(shè)計和驗證。同時,設(shè)計者也可以使用模擬器來測試處理器各個功能部件在不同配置下運行各種測試程序的結(jié)果,并基于對結(jié)果的分析確定每個功能部件對處理器整體性能的影響程度,從而深入理解處理器的行為,進(jìn)而改進(jìn)處理器的設(shè)計,提高性能。另一方面,軟件開發(fā)者也可以在硬件投產(chǎn)前,基于模擬器平臺為對應(yīng)硬件平臺開發(fā)各種軟件產(chǎn)品,加速軟硬件產(chǎn)品的市場化進(jìn)程。
軟件模擬技術(shù)通過軟件程序來模擬處理器系統(tǒng)部分或全部的功能,并給出各種所需模擬結(jié)果。具體說來,軟件模擬技術(shù)不但可以準(zhǔn)確地模擬硬件的各種功能和行為,還可以靈活的修改被模擬目標(biāo)架構(gòu)的結(jié)構(gòu)、組件以及行為。同時,由于軟件易于擴展,也可以有效克服硬件驗證靈活性差、應(yīng)用面窄、開發(fā)周期長等缺點。由于這些特征,軟件模擬技術(shù)作為一種至關(guān)重要的手段,已廣泛應(yīng)用于處理器設(shè)計和體系結(jié)構(gòu)研究的方方面面。
目前,主流體系結(jié)構(gòu)模擬器主要包括功能模擬模型和時序模擬模型兩部分。功能模擬模型一般只完成處理器硬件的各種功能模擬,而不模擬處理器各個組成部分的微體系結(jié)構(gòu)特征。因此,功能模擬模型只能用來測試程序在一個平臺上執(zhí)行結(jié)果的正確性,而不能給出性能和時序行為數(shù)據(jù),因此無法進(jìn)行深入分析,也沒辦法進(jìn)行不同處理器設(shè)計的比較。時序模擬模型則能根據(jù)實際需要,模擬處理器整體或者部分功能單元在每個時鐘周期內(nèi)的微體系結(jié)構(gòu)的各種行為和反應(yīng),包括流水線、功能單元和存儲結(jié)構(gòu)等。時序模擬模型不僅可以確認(rèn)結(jié)果的正確性,還可以獲得程序執(zhí)行過程中處理器的各種性能指標(biāo),因此在相關(guān)研究和設(shè)計中有著更廣泛的應(yīng)用。
由于模擬器的重要性和多核結(jié)構(gòu)的普及,各種功能更全的功能模擬模型不斷涌現(xiàn),如Simics,QEMU,COREMU;而各種更加精確和快速的新型時序模擬模型也不斷涌現(xiàn),如GEMS,MPTLSim,RAMP GOLD。目前主流多核模擬器通常采用緊耦合設(shè)計,即功能模擬和時序模擬需要在每個時鐘周期都進(jìn)行交互。一方面,這樣的設(shè)計增加了模擬器擴展的難度:給模擬器增添新的功能或者時序模擬模型通常需要幾個人年的時間,如研究人員花費了數(shù)年的時間整合M5和GEMS模擬器(gem5),而擴展PTLSim使之支持QEMU也用去了數(shù)年的時間(MARSS)。另一方面,緊耦合設(shè)計中過多的交互也引入了許多額外的開銷,不僅降低了多核模擬器的性能,也阻礙了模擬器功能模擬和時序模擬有效并行的可能。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于提供一種執(zhí)行力度強、模擬性能好,并具有擴展功能的并行多核處理器的全系統(tǒng)模擬器。
本發(fā)明提供的并行多核處理器的全系統(tǒng)模擬器,是一種軟件實現(xiàn)的模擬系統(tǒng)。具體而言,本發(fā)明在邏輯上把功能模擬模型和時序模擬模型分開,采用完全松耦合的設(shè)計架構(gòu):功能模擬模型只負(fù)責(zé)功能模擬部分,時序模擬模型只負(fù)責(zé)模擬器的時序部分。模擬指令時,模擬器采用功能優(yōu)先的結(jié)構(gòu),功能模擬模型先于時序模擬模型執(zhí)行,為時序模擬模型提供相關(guān)的信息;模擬器的功能模擬和時序模擬模塊通過體系結(jié)構(gòu)無關(guān)的通用接口進(jìn)行交互。為了保證模擬器的精確性,本發(fā)明設(shè)計了差異檢測和調(diào)節(jié)模塊,負(fù)責(zé)檢測功能模擬和時序模擬模塊之間行為的差異。當(dāng)檢測到差異時,該模塊再根據(jù)引起差異的具體原因進(jìn)行調(diào)節(jié)。
本發(fā)明提供的并行多核處理器的全系統(tǒng)模擬器,其框架結(jié)構(gòu)可分為4個主要部分:功能模擬模塊、時序模擬模塊、通用接口、差異檢測和調(diào)節(jié)模塊。其中:
(1)功能模擬模塊,實現(xiàn)特定的功能模擬模型,主要負(fù)責(zé)執(zhí)行指令和收集應(yīng)用程序和操作系統(tǒng)的執(zhí)行信息,并將指令分解成時序模擬所需的體系結(jié)構(gòu)無關(guān)的指令流和數(shù)據(jù)流信息,寫入到功能模擬模塊和時序模擬模塊中間的通用接口,從而傳送給時序模擬模塊;
(2)時序模擬模塊,實現(xiàn)特定的時序模擬模型,負(fù)責(zé)從通用接口中取得指令的接口信息,對指令進(jìn)行時序模擬,并更新體系結(jié)構(gòu)的狀態(tài)信息;
(3)通用接口,該模塊里面包含一個指令緩沖區(qū)和一個內(nèi)存訪問表(Memory Access Table, MAT)結(jié)構(gòu)。指令緩沖區(qū)主要負(fù)責(zé)存放功能模擬模型傳遞的指令流信息,MAT則主要負(fù)責(zé)存儲內(nèi)存訪問的數(shù)據(jù)流信息;
(4)差異檢測和調(diào)節(jié)模塊,主要負(fù)責(zé)比較功能模擬和時序模擬行為的不一致,并根據(jù)不一致的原因分別調(diào)用相應(yīng)的處理模塊進(jìn)行調(diào)節(jié)。
模擬器在運行時,一些因素會導(dǎo)致功能模擬和時序模擬的行為不一致,從而影響模擬的精確性。這些因素主要包括分支預(yù)測錯誤、中斷和異常的處理、共享數(shù)據(jù)訪問的順序以及共享頁表訪問的順序等,以下簡稱精確性影響因素。為了提高模擬的精確性,本發(fā)明進(jìn)一步設(shè)計了錯誤路徑處理模塊塊、異常和中斷處理模塊、共享內(nèi)存訪問的檢測和修正模和共享頁表訪問的檢測和修正模塊,修正精確性影響因素發(fā)生時引入的錯誤。
本發(fā)明設(shè)計的錯誤路徑處理模塊,更好地模擬現(xiàn)代處理器的分支預(yù)測功能。該模塊在時序模擬模型出現(xiàn)分支預(yù)測錯誤時,為功能模擬模塊創(chuàng)建出一個與當(dāng)前時序模擬模塊系統(tǒng)狀態(tài)完全一致的輕量級錯誤路徑系統(tǒng),在這個系統(tǒng)內(nèi)繼續(xù)執(zhí)行經(jīng)過分支預(yù)測的指令路徑,當(dāng)被預(yù)測錯誤的指令完成后,不執(zhí)行提交而直接退出錯誤路徑模擬,從而避免更改實際流水線的狀態(tài)。這種調(diào)用輕量級錯誤路徑的方式可以避免不必要的回滾和復(fù)雜狀態(tài)的記錄。
本發(fā)明設(shè)計的異常和中斷處理模塊,處理異?;蛑袛喟l(fā)生時功能模擬和時序模擬模塊執(zhí)行路徑的不一致。本模塊的處理方法與錯誤路徑處理模塊的處理方法相似。當(dāng)中斷或異常發(fā)生時,該模塊為功能模擬模塊創(chuàng)建出一個與當(dāng)前時序模擬模塊系統(tǒng)狀態(tài)完全一致的輕量級錯誤路徑系統(tǒng),在這個系統(tǒng)內(nèi)繼續(xù)執(zhí)行中斷或異常發(fā)生后的指令路徑,當(dāng)錯誤路徑的指令完成后,不執(zhí)行提交而直接退出錯誤路徑模擬,從而避免更改實際流水線的狀態(tài)。
本發(fā)明設(shè)計的共享內(nèi)存訪問的檢測和修正模塊,檢測和修正提前執(zhí)行的功能模擬模型與時序模擬模型的內(nèi)存訪問順序不一致,以修正共享內(nèi)存訪問順序不一致所帶來的時序不精確性,避免導(dǎo)致模擬結(jié)果的不精確。共享內(nèi)存訪問的檢測和修正模塊通過兩步操作來避免功能模擬模型和時序模擬模型之間對于共享內(nèi)存的訪問順序不一致:首先在功能模擬模型執(zhí)行時記錄下各個處理器核訪問內(nèi)存的順序;然后在時序模擬模型中內(nèi)存指令提交時,檢查時序模擬模型與功能模擬模型對共享內(nèi)存的訪問順序是否一致,從而確定兩者的執(zhí)行行為是否有沖突,如果發(fā)生沖突,需要根據(jù)時序模擬模型的系統(tǒng)狀態(tài)回滾功能模擬模型。
本發(fā)明設(shè)計的共享頁表訪問的檢測和修正模塊,簡化了共享頁表訪問順序沖突的處理。功能模擬模塊在遇到MMU (Memory Management Unit,內(nèi)存管理單元) miss時,不再繼續(xù)執(zhí)行指令,直到時序模擬模塊提交這條指令時(即跳轉(zhuǎn)到正確的MMU miss處理路徑時)再繼續(xù)執(zhí)行。這種策略使得功能模擬模塊和時序模擬模塊在共享頁表的訪問順序上保持了一致。采用這種方法,時序模擬模塊處理MMU miss之前都是從錯誤路徑取指令,并不會導(dǎo)致流水線被停住的問題。
當(dāng)需要對一條指令進(jìn)行模擬時,系統(tǒng)的典型模擬流程如下:首先,功能模擬模塊執(zhí)行被模擬的指令。接著,功能模擬模塊將把指令本身的信息以及進(jìn)行時序模擬所需要的執(zhí)行信息通過通用接口傳遞給時序模擬模塊。然后,時序模擬模塊要對這條指令模擬時,從通用接口中讀出這條指令的相關(guān)信息,對它進(jìn)行時序模擬。在時序模擬時,差異檢測和調(diào)節(jié)模塊將會檢測影響模擬精確性的事件,并根據(jù)被檢測到的精確性影響因素對應(yīng)地調(diào)用錯誤路徑處理模塊、共享內(nèi)存訪問的檢測和修正模塊、異常和中斷處理模塊和共享頁表訪問的檢測和修正模塊對功能模擬模型進(jìn)行修正,保證功能模擬模型模擬的路徑與時序模擬模型模擬的路徑一致,從而保證模擬的精確性。最后,在這條指令在時序模擬模塊中完成提交時,更新時序模擬模型的體系結(jié)構(gòu)狀態(tài)。
為了保證可擴展性,使得模擬器能夠方便地擴展新的功能模擬模型,甚至更換指令集架構(gòu)(ISA),通用接口的設(shè)計不依賴于功能模擬模型和特定指令集等體系結(jié)構(gòu)相關(guān)信息。此外,由于時序模擬模型主要模擬流水線依賴及存儲結(jié)構(gòu),通用接口包含這兩方面用于時序模擬的相關(guān)信息。通用接口的主要功能是在功能模擬和時序模擬模塊之間傳輸指令流和數(shù)據(jù)流信息。
所述指令流信息會被記錄在指令緩沖區(qū)當(dāng)中,大小可通過配置文件設(shè)定。緩沖區(qū)的每一項保存了指令進(jìn)行時序模擬所需的信息,由功能模擬模型模擬完一條指令后填寫。每一項可以看做是對應(yīng)指令的蹤跡(trace),主要包括三方面的信息:流水線相關(guān)信息(功能單元需求和源/目的寄存器等),存儲訪問信息以及修改的體系結(jié)構(gòu)狀態(tài)信息。
所述數(shù)據(jù)流信息存儲在一個兩維的表MAT中。MAT的第一個維度是一個以物理地址為鍵值的散列,其中的每個節(jié)點我們稱之為內(nèi)存地址節(jié)點;每一個內(nèi)存地址節(jié)點擁有一個保存功能模擬模型對內(nèi)存的訪問順序隊列,用來記錄對于該內(nèi)存地址被各個核的訪問順序。隊列的每個節(jié)點記錄了某一次訪問的具體信息,包括這次訪問來自哪個核,是讀操作還是寫操作,以及對內(nèi)存的改變等信息。
本發(fā)明的技術(shù)方案具有如下優(yōu)點:功能模擬和時序模擬模型之間松耦合的結(jié)構(gòu),減少兩者之間的交互,增加了系統(tǒng)并行執(zhí)行的力度,提高了模擬的性能;還使得模擬器容易根據(jù)需求擴展。功能模擬和時序模擬模型之間的差異檢測和調(diào)節(jié),保證了模擬器的精確性。
附圖說明
圖1、松散耦合結(jié)構(gòu)的模擬器架構(gòu)。
圖2、錯誤預(yù)測路徑處理流程。
圖3、內(nèi)存訪問信息記錄流程。
圖4、內(nèi)存訪問順序檢查流程。
圖5、共享頁表訪問順序算法。
圖6、通用接口設(shè)計。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚,以下結(jié)合附圖及實施例,詳細(xì)說明本發(fā)明的優(yōu)選實施。在此之前需要說明的是,本說明書及權(quán)利要求書中所使用的術(shù)語或詞語不能限定解釋為通常的含義或辭典中的含義,而應(yīng)當(dāng)立足于為了以最佳方式說明其發(fā)明人可以對術(shù)語的概念進(jìn)行適當(dāng)定義的原則解釋為符合本發(fā)明技術(shù)思想的含義和概念。隨之,本說明書所記載的實施例和附圖中表示的結(jié)構(gòu)只是本發(fā)明最佳實施例之一,并不能完全代表本發(fā)明的技術(shù)思想,因此應(yīng)該理解到對于本發(fā)明而言可能會存在能夠進(jìn)行替換的各種等同物和變形例。
本發(fā)明在模擬器的兩大核心功能——功能模擬和時序模擬之間,采用松耦合的結(jié)構(gòu),參見圖1;兩者之間采用一個通用接口通訊,參見圖6?;诒景l(fā)明,模擬器可以靈活地修改功能模擬和時序模擬模型,也可以進(jìn)一步改進(jìn)系統(tǒng)的性能。
實現(xiàn)一:模擬模型的擴展
相比于其他模擬器的架構(gòu),基于本發(fā)明可以更方便進(jìn)行不同功能模擬模型和時序模擬模型的擴展。下文參照圖1,介紹如何基于本發(fā)明進(jìn)行功能模擬擴展和時序模擬擴展。基于本發(fā)明對模擬器進(jìn)行擴展可以參照該具體實施例。
首先,功能模型的擴展示例。QEMU是一個強大的功能模擬器,可以支持不同指令集的功能模擬。在模擬時,QEMU把指令轉(zhuǎn)換為類似RISC的簡單的TCG(Tiny Code Generator, 簡單代碼生成器)指令。集成時,只要在TCG指令與本發(fā)明的通用接口(參考圖6)建立映射,就可以避免復(fù)雜令的譯碼工作。在對接時,還需要對一些復(fù)雜指令集進(jìn)行必要的優(yōu)化。如X86指令轉(zhuǎn)換為TCG指令過于瑣碎,一條X86指令往往需要被生成5-6條,甚至更多的TCG指令。這與真實的X86體系結(jié)構(gòu)并不相符,借用PTLSim模擬器的譯碼器功能,由PTLSim模擬器包含的譯碼器生成的微指令代替了TCG指令。新的功能模擬模型可以模擬出更真實的X86體系結(jié)構(gòu)。針對復(fù)雜指令集特點,擴展模型需對時序模擬模型進(jìn)行一些調(diào)整。比如X86指令往往被拆分成多條微指令,而為了保證X86指令的原子性,這些微指令要么完全被提交,要么完全不對系統(tǒng)狀態(tài)產(chǎn)生影響,需要時序模擬模型提供額外的支持。在實現(xiàn)時,我們根據(jù)微指令的PC值,識別出同屬于一條X86指令的微指令群,當(dāng)且僅當(dāng)這個微指令群中所有的微指令都可以提交時,才提交所有這些微指令;如果其中一條微指令被清空,所有這些微指令都將被清空。
其次,時序模型的擴展示例。當(dāng)前基于FPGA的時序模擬是模擬的主流。原有方法需要定制復(fù)雜的功能和時序模擬接口,從而導(dǎo)致工程量巨大。基于本方法,可以對FPGA的時序模擬模型定制與本發(fā)明體系結(jié)構(gòu)無關(guān)的信息傳遞功能,完成該功能后,F(xiàn)PGA時序模擬器可以方便與不同功能模擬器進(jìn)行對接,如Pin和QEMU。
對于功能或時序模擬,這個擴展工作總共包含了大約180行代碼。對于功能模擬部分,所有的工作由一個熟悉QEMU但是初次接觸GEMS的學(xué)生完成,總共花費了兩個月的時間。與之前幾個花費數(shù)個人年的擴展工作相比,比如gem5和MARSS,本發(fā)明在擴展新功能/時序模擬模型方面顯示了更高的效率。
實現(xiàn)二:多核全系統(tǒng)模擬器的并行加速
為了提高模擬多核處理器的速度,本發(fā)明可以進(jìn)一步采用并行執(zhí)行的方式來發(fā)揮主機平臺多(核)處理器的性能。參考圖1,本發(fā)明采用功能模擬模型與時序模擬模型松耦合的結(jié)構(gòu),在模擬過程中,功能模擬和時序模擬所需要的交互少,頻度低。因此,當(dāng)功能模擬和時序模擬并行化后,兩個并行模塊屬于松耦合的通信方式,從而比基于已有緊耦合模擬框架獲得更高的并行性能。
功能模擬模塊和時序模擬模塊并行后,兩個模塊并行執(zhí)行,并通過共享的指令緩存和內(nèi)存訪問表結(jié)構(gòu)進(jìn)行通信。功能模擬模塊對共享部分添加信息,而時序模擬模塊從共享緩沖中讀取信息,具體如參考圖6。執(zhí)行時,為了避免兩個兩個模塊同時對共享內(nèi)存的一個單元進(jìn)行讀寫導(dǎo)致的模擬結(jié)果錯誤,可在指令緩存和內(nèi)存訪問表結(jié)構(gòu)上添加互斥鎖機制,保證共享緩沖同一單元在一個時刻只能被一個模塊所訪問到。為了減少訪問的沖突,本發(fā)明可以細(xì)化互斥鎖的粒度,把互斥鎖作用到指令緩存和內(nèi)存訪問表結(jié)構(gòu)的每一個具體的條目上,這樣功能模擬模塊在往某一具體條目當(dāng)中記錄訪問信息的時候,時序模擬模塊還可以訪問其他條目中的信息,從而提高了并行性,降低了通信帶來的性能開銷。