劉碩
(上海交通大學(xué)電子信息與電氣工程學(xué)院,上海200240)
隨著數(shù)據(jù)規(guī)模的不斷擴展和對DRAM需求的進一步提升,人們開始思考在內(nèi)存中處理大數(shù)據(jù)應(yīng)用的可能性。與傳統(tǒng)基于硬盤訪問的架構(gòu)系統(tǒng)相比,將數(shù)據(jù)存儲在主存中可以實現(xiàn)數(shù)據(jù)訪問的量級加速。該類存內(nèi)計算在數(shù)據(jù)處理方面的潛力已經(jīng)被包括RAMCloud[1]、GraphLab[2]、Pregel、Oracle TimesTen[3]和SAP HANA[4]在內(nèi)的學(xué)術(shù)和工業(yè)界所證實。
粗粒度可重構(gòu)計算架構(gòu)(Coarse-Grained Reconfigurable Array,CGRA)被證明在高性能系統(tǒng)計算和低功耗方面有顯著優(yōu)勢[5-6],已經(jīng)成為近年來的研究熱點[7-9]。其主要特點是芯片的功能可以在運行時根據(jù)不同的應(yīng)用進行配置,結(jié)合了專用集成電路的高能效性和通用可編程處理器的高靈活性。這使得可重構(gòu)處理器非常適合支持在性能和功耗方面具有較高要求的數(shù)據(jù)密集型應(yīng)用,例如多媒體領(lǐng)域[10-12]和密碼學(xué)領(lǐng)域[13]。
由于可重構(gòu)架構(gòu)和存內(nèi)處理都具有對數(shù)據(jù)密集型應(yīng)用的友好性,本文將實現(xiàn)基于粗粒度可重構(gòu)陣列的存內(nèi)計算架構(gòu)仿真,以探尋該架構(gòu)在處理數(shù)據(jù)密集型應(yīng)用上的性能優(yōu)勢。為了實現(xiàn)按需求快速仿真,該仿真器采用面向?qū)ο蟮膶哟位TO(shè)計和參數(shù)化定義。實驗結(jié)果表明,與傳統(tǒng)CPU架構(gòu)相比,實現(xiàn)10x以上的加速提升。
該仿真器的設(shè)計采用粗粒度可重構(gòu)硬件體系結(jié)構(gòu)的一般定義,如圖1所示,在具體設(shè)計實現(xiàn)過程中,該體系結(jié)構(gòu)被劃分為三個抽象層:①處理單元(Processing Element,PE)級仿真;②處理單元陣列(Processing Element Array,PEA)級仿真;③CGRA級仿真。
圖1 CGRA架構(gòu)
PE級:在細粒度架構(gòu)中,邏輯單元通常是查找表和可編程寄存器;在粗粒度架構(gòu)中,PE則是存儲單元(Load/Store Unit,LSU)或是完整的運算邏輯單元(Algorithm Logic Unit,ALU),PE間支持并行數(shù)據(jù)處理。
PEA級:指定PE的數(shù)量和互連方案,PEA的規(guī)模和互連方案都會對架構(gòu)性能造成顯著影響。該方案定義PE之間關(guān)聯(lián)方式和數(shù)據(jù)傳輸方式,PE的數(shù)量支持參數(shù)化配置,可以通過相關(guān)接口進行調(diào)整建模。
CGRA級:CGRA層是最高級別的抽象層。在該層視角下,PEA可以被認為是一個基本的計算單元。指令寄存器(Configuration Memory)用以存儲和配置ALU輸入和功能指令。數(shù)據(jù)存儲器(Data Memory)用于存儲臨時結(jié)果。I/O接口用以CGRA與外界的數(shù)據(jù)傳輸和交換,在本文仿真器中,I/O接口將與DRAM直連,實現(xiàn)近數(shù)據(jù)處理。
本文采用的架構(gòu)探索流程如圖2所示?;贑GRA設(shè)計存內(nèi)處理架構(gòu)建模首先要進行應(yīng)用分析,確定性能要求;之后選擇架構(gòu)參數(shù),初步參數(shù)選擇是依據(jù)過往經(jīng)驗,后續(xù)參數(shù)將依據(jù)具體性能評估結(jié)果進行調(diào)整;進行仿真建模,實現(xiàn)目標(biāo)仿真器,進行性能評估。
圖2架構(gòu)探索流程圖
CGRA架構(gòu)仿真時基于面向?qū)ο蟮膶哟位8拍?,各組件之間有類的繼承關(guān)系,如圖3所示。
圖3 CGRA架構(gòu)內(nèi)繼承關(guān)系
對于圖1中的各組件,可以用類內(nèi)函數(shù)來模擬硬件行為。例如PE類的函數(shù)包括運算(algorithm_func)、選擇器(mux_func)和指令配置(configuration_func)。運算函數(shù)將執(zhí)行由配置指令控制的算術(shù)邏輯功能,這里將設(shè)置一系列通用算術(shù)運算(add、multiple等)和邏輯運算(AND、OR、XOR等),未來針對特定領(lǐng)域的應(yīng)用將添加或移除額外的運算功能。選擇器函數(shù)根據(jù)配置指令接收目標(biāo)輸入,并將它們輸送到運算部分。指令配置函數(shù)接收來自外部的命令,并將目標(biāo)指令發(fā)送到運算和選擇函數(shù)中,作為一個配置參數(shù)變量。
PE的硬件架構(gòu)如圖4所示,包含算術(shù)邏輯單元(ALU),兩輸入一輸出I/O接口,選擇器(MUX)和本地寄存器堆。
圖4處理單元的硬件架構(gòu)
存內(nèi)處理的概念體現(xiàn)在CGRA整體對外的I/O接口與DRAM(圖4中的Off-chip Memory)進行直連,實現(xiàn)數(shù)據(jù)近內(nèi)存?zhèn)鬏?,減少數(shù)據(jù)傳輸延時和相應(yīng)功耗。
為了提高仿真效率和降低仿真模型編寫的困難程度,采用事件驅(qū)動仿真機制實現(xiàn)目標(biāo)架構(gòu)的搭建。
Gem5提供用于創(chuàng)建事件驅(qū)動的包裝器功能(EventFunctionWrapper類)。目標(biāo)函數(shù)封裝時使用lambda表達式,例如:
使用sch edule()函數(shù)進行事件安排,執(zhí)行目標(biāo)函數(shù)processEvent(),使其在某一時刻觸發(fā):
本次設(shè)計基于事件驅(qū)動仿真搭建PE的行為模型,PE類內(nèi)的運算(algorithm_func)函數(shù)、選擇器(mux_func)函數(shù)和指令配置(configuration_func)函數(shù)作為processEvent目標(biāo)函數(shù)被EventFunctionWrapper類封裝,根據(jù)具體行為的執(zhí)行順序進行階段觸發(fā)。由于PE內(nèi)數(shù)據(jù)傳遞都是非阻塞傳輸且物理距離很短,因此上述事件函數(shù)的觸發(fā)時間普遍設(shè)置為當(dāng)前時刻的下一個周期。
Gem5是一款高度模塊化、支持事件驅(qū)動方式的全系統(tǒng)仿真器。在Gem5中,所有模塊單元都被抽象設(shè)計為一個具體完成功能實現(xiàn)的C++類和一個對應(yīng)模塊接口的Python類。當(dāng)Python類與相關(guān)C++類綁定時,傳遞給Python類的具體參數(shù)將通過Gem5的參數(shù)傳遞機制賦值給C++類的相應(yīng)成員變量。C++類內(nèi)完成父類的繼承重寫(虛函數(shù)),構(gòu)造函數(shù)和事件類(Event)實例化等。
仿真流程如圖5所示。由Scons軟件基于Python完成編譯,將所有模塊文件編譯并鏈接生成可執(zhí)行文件。架構(gòu)實現(xiàn)過程中相關(guān)配置參數(shù)的傳遞是通過Python模型對C++模型的接口實現(xiàn)的。具體應(yīng)用時只需對Python模型中的參數(shù)進行設(shè)置,參數(shù)將會傳遞至C++模型中,完成對架構(gòu)整體的搭建和初始化。具體仿真階段,將可執(zhí)行文件加載到系統(tǒng)中開始相關(guān)仿真,Gem5提供debug-file功能,打印中間過程,并取得輸出結(jié)果。
圖5 Gem5仿真流程
Gem5仿真平臺有完整的CPU、總線和內(nèi)存等的仿真,本文設(shè)計實現(xiàn)的CGRA-PIM架構(gòu)通過仿真I/O接口直連到DRAM上。為了實現(xiàn)主處理器對CGRAPIM的調(diào)起操作,這里將在原有的X86指令集上進行擴展,利用Gem5中原有的X86預(yù)留空白指令位置實現(xiàn)目標(biāo)CGRA-PIM指令。優(yōu)勢在于CGRA-PIM指令可以直接作為已有主處理器指令的一部分進行相關(guān)執(zhí)行,不需要對現(xiàn)有的編譯器和編程模型進行修改,降低實現(xiàn)難度。
將cpp文件編譯為可執(zhí)行文件,由CPU進行文件執(zhí)行,當(dāng)CPU執(zhí)行到CGRA-PIM特定指令時,由CPU負責(zé)調(diào)起相關(guān)處理單元。其中,CGRA-PIM和CPU是并行工作的,前者進行相關(guān)處理時,CPU將繼續(xù)執(zhí)行之后的指令。這種并行處理的優(yōu)勢在于能夠有效減少PE的空閑時間,有效提高計算資源利用率。
CPU和CGRA-PIM并發(fā)執(zhí)行可能會帶來的問題是當(dāng)處理的計算密集型應(yīng)用需要循環(huán)操作時,CPU調(diào)取下一條CGRA-PIM相關(guān)指令的時間將有可能比CGRA-PIM自身完成上一條相關(guān)指令時間更短(與CGRA-PIM處理的數(shù)據(jù)規(guī)模有關(guān),這里將根據(jù)實際運行時間有選擇性地控制可重構(gòu)陣列規(guī)模),即后者在當(dāng)前時刻有可能無法立即執(zhí)行該條指令。因此為了避免主處理器運行阻塞,也為了避免造成當(dāng)前指令的遺失,將設(shè)計添加CGRA-PIM工作隊列來存放待處理的任務(wù),該工作隊列采用先進先出(FIFO)的行為方式。由CPU調(diào)取CGRA的待處理任務(wù)將會放入該工作隊列中,已經(jīng)完成的任務(wù)會從隊列中彈出。
系統(tǒng)參數(shù)設(shè)置如表1所示,目標(biāo)架構(gòu)CGRA為異構(gòu)粗粒度可重構(gòu)模型。處理單元陣列規(guī)模為8×8,共64個處理單元組成。其中LSU28個,ALU36個,LSU分布在四條邊上,ALU分布在陣列內(nèi)部。
表1 系統(tǒng)參數(shù)設(shè)置
由于CGRA-PIM架構(gòu)主要解決的是大規(guī)模數(shù)據(jù)傳輸造成的性能影響,因此將使用典型的數(shù)據(jù)密集型應(yīng)用——稀疏矩陣向量乘(SpMV)來評估該架構(gòu)性能。
選擇不同規(guī)模矩陣(N×N)作為測試樣本,將比較CGRA-PIM架構(gòu)和CGRA-DRAM(不考慮近內(nèi)存處理)架構(gòu)以及傳統(tǒng)CPU架構(gòu)(CPU-DRAM)的性能,將根據(jù)傳統(tǒng)CPU架構(gòu)進行歸一化。不同規(guī)模矩陣進行SpMV應(yīng)用后三者性能結(jié)果對比如表2所示。
表2 各架構(gòu)性能加速比
不同架構(gòu)性能加速比在不同規(guī)模矩陣下呈現(xiàn)結(jié)果有一定差異。隨著矩陣規(guī)模的擴大,CGRA-DRAM和CGRA-PIM的加速比都有提高,原因是處理數(shù)據(jù)的時間占比上升。在矩陣規(guī)模較小時,數(shù)據(jù)讀取和預(yù)處理的時間占比較高,留給CGRA進行處理加速的循環(huán)操作時間占比較低,故而加速比較低,而隨著矩陣規(guī)模的擴大,循環(huán)操作的時間占比提升,這時可供CGRA加速的余地更大,因此帶來了更高的加速比,這也是CGRA-PIM更適合進行數(shù)據(jù)密集型應(yīng)用加速處理的原因。
本文從實際應(yīng)用角度出發(fā),針對數(shù)據(jù)密集型應(yīng)用提出一種新型的存算一體架構(gòu)CGRA-PIM。通過Sp-MV實例說明該架構(gòu)較傳統(tǒng)架構(gòu)的優(yōu)越性,取得了明顯的性能提升。未來將考慮在該架構(gòu)的通用性上進行擴展。