一種支持可變分塊的矩陣乘加速方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及嵌入式平臺下的矩陣乘加速技術(shù),具體涉及一種支持可變分塊的矩陣 乘加速方法。
【背景技術(shù)】
[0002] 隨著半導體制造工藝的發(fā)展以及集成電路技術(shù)的進步,單芯片上能夠集成越來越 多的晶體管,使用可編程器件,特別是FPGA(FieldProgrammableGateArray)芯片進行設(shè) 計成為了目前構(gòu)建嵌入式系統(tǒng)以及硬件加速平臺的一種重要方式。當前FPGA芯片提供了 專用的算術(shù)模塊、大量的邏輯資源和存儲資源,以及外部存儲器接口、網(wǎng)絡(luò)接口和其它外圍 接口,為構(gòu)建高性能計算系統(tǒng)提供了條件,也使FPGA可重構(gòu)計算系統(tǒng)成為加速科學計算的 一種重要選擇。當前的FPGA芯片相對于DSP(DigitalSignalProcessor,數(shù)字信號處理 器)具有可編程的優(yōu)勢,同時能夠并行處理海量數(shù)據(jù),既具有通用處理器的靈活性,又具有 ASIC(ApplicationSpecificIntegratedCircuit,專用集成電路)的高性能,在嵌入式計 算領(lǐng)域備受青睞。
[0003] 浮點矩陣乘法是數(shù)字信號的基本算法,同時也是許多科學計算方法的基本運算。 在數(shù)字圖像處理,計算機視覺的快速處理以及工業(yè)實時控制等領(lǐng)域都被廣泛應(yīng)用。但由于 實際應(yīng)用中,浮點矩陣規(guī)模通常較大,矩陣乘算法本身復雜度較高、處理效率較低,成為限 制系統(tǒng)性能提升的瓶頸所在,因此為此類應(yīng)用設(shè)計高性能的硬件結(jié)構(gòu)是當前FPGA結(jié)構(gòu)設(shè) 計的研宄熱點。
[0004] 盡管近年來提出了很多基于FPGA的矩陣乘加速器設(shè)計,但是都缺乏對非均勻的 大規(guī)模矩陣加速的討論和支持,這種大規(guī)模矩陣的特征是行列數(shù)相差很大(> =10倍),并 且廣泛存在于很多現(xiàn)代應(yīng)用領(lǐng)域中,如圖像處理,深度學習等。在這些應(yīng)用領(lǐng)域之中,矩陣 乘占據(jù)了計算量的主要部分。由于單片F(xiàn)PGA芯片上存儲資源和計算資源十分有限,加速大 規(guī)模矩陣乘時往往需要對矩陣進行分塊。對于鏈式結(jié)構(gòu)的矩陣乘加速器,雖然對大多數(shù)大 規(guī)模矩陣的加速效果十分明顯,但對于加速非均勻矩陣時的計算效率卻很低,其主要原因 就是這類加速器往往只支持固定的分塊,也就是說,分塊大小與矩陣鏈長(矩陣鏈中處理 單元個數(shù))相等或者是其倍數(shù)。當分塊大小與矩陣加速器鏈長不匹配時,加速器計算效率 會發(fā)生明顯的下降。據(jù)我們所知,至今還沒有公開文獻涉及支持可變分塊的矩陣乘法器設(shè) 計,也沒有經(jīng)典分塊算法基礎(chǔ)上的分塊優(yōu)化問題方面的相關(guān)研宄,因此如何選擇最優(yōu)的分 塊,使得矩陣乘加速器獲得更高的計算效率,以更好地適應(yīng)現(xiàn)代應(yīng)用的加速需求,已經(jīng)成為 一項亟待解決的關(guān)鍵技術(shù)問題。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明要解決的技術(shù)問題是:針對現(xiàn)有技術(shù)的上述技術(shù)問題,提供一種支持可變 分塊,可根據(jù)分塊大小調(diào)整使用的處理單元數(shù)目,加速非均勻矩陣乘運算加速效率高的支 持可變分塊的矩陣乘加速方法。
[0006] 為了解決上述技術(shù)問題,本發(fā)明采用的技術(shù)方案為:
[0007] -種支持可變分塊的矩陣乘加速方法,步驟包括:
[0008] 1)輸入矩陣乘運算所需的M*N的矩陣A和N*R的矩陣B;
[0009] 2)根據(jù)矩陣A和矩陣B的規(guī)模確定子塊大小Si,將矩陣A以規(guī)模為Si*N的子塊為 單位進行按行分塊,將矩陣B以規(guī)模為N*Si的子塊為單位進行按列分塊,使得矩陣乘運算 等同為多個子塊乘運算;
[0010] 3)為每一個子塊乘運算所需數(shù)據(jù)生成一個DMA描述符,將所有子塊乘運算的DMA描述符構(gòu)建DMA描述符鏈表并存入主存;
[0011] 4)針對每一個子塊乘運算,通過矩陣乘加速器的DMA從主存的DMA描述符鏈表讀 取子塊乘運算所需數(shù)據(jù),然后通過矩陣乘加速器中至少一條處理單元鏈中的前Sif處理單 元進行子塊乘運算,并將各個子塊乘運算的結(jié)果通過矩陣乘加速器的DMA分別寫回主存。
[0012] 優(yōu)選地,所述步驟2)中根據(jù)矩陣A和矩陣B的規(guī)模確定子塊大小Si的詳細步驟 包括:
[0013] 2. 1)輸入矩陣A和矩陣B的矩陣規(guī)模,所述矩陣規(guī)模包括矩陣A的行數(shù)M、矩陣A 的列數(shù)N、矩陣B的列數(shù)R三者的值;
[0014] 2. 2)根據(jù)矩陣規(guī)模獲取滿足式⑴所示約束的分塊大小集合;
[0016] 式(1)中,3,表示矩陣A被按行劃分的行數(shù),S」表示矩陣B被按列劃分的列數(shù), M表示矩陣A的行數(shù),N表示矩陣A的列數(shù),BW表示矩陣乘加速器中單條處理單元鏈的 訪存帶寬,max以,Sj表示從SJP\中取較大值,F(xiàn)表示訪存頻率;P表示矩陣乘加速 器中單條處理單元鏈的處理單元數(shù)量,Stageadd表示矩陣乘加速器中的加法器流水級數(shù), maxm-SiXi^R-SjXn}表示從M-SiXm和R-SjXn中取較大值,R表示矩陣B的列數(shù),m表示 矩陣A的行數(shù)M除以矩陣A被按行劃分的行數(shù)結(jié)果的向下取整值,n表示矩陣B的列 數(shù)R除以矩陣B被按列劃分的列數(shù)&的結(jié)果的向下取整值;
[0017] 2. 3)將矩陣A視為包含整數(shù)個規(guī)模為S#N的子塊的子矩陣①和剩余的不規(guī)則的 子矩陣②、將矩陣B視為包含整數(shù)個規(guī)模為N*Si的子塊的子矩陣③和剩余的不規(guī)則的子矩 陣④,將矩陣A和矩陣B的矩陣乘運算視為子矩陣①~子矩陣④四者中的兩兩相乘,建立式 (2)所示的評估函數(shù);
[0018]f(S^ Sj)=T1; 3(S^ Sj)+T1; 4(S^ Sj)+T2; 3(S^ Sj)+T2; 4(S^ Sj)(2)
[0019] 式⑵中,f(Si,Sp表示評估函數(shù)的值,5,表示矩陣A被按行劃分的行數(shù),5」表 示矩陣B被按列劃分的列數(shù),USpSp表示子矩陣①乘子矩陣③的計算時鐘節(jié)拍數(shù), USi,Sj表示子矩陣①乘子矩陣④的計算時鐘節(jié)拍數(shù),T2,3(Si,Sj表示子矩陣②乘子矩陣 ③的計算時鐘節(jié)拍數(shù),T2,4(Si,SP表示子矩陣②乘子矩陣④的計算時鐘節(jié)拍數(shù);
[0020] 2. 4)使用MATLAB數(shù)學工具對式(2)所示的評估函數(shù)生成滿足式(1)約束的可視 化圖像,以矩陣A被按行劃分的行數(shù)Si和矩陣B被按列劃分的列數(shù)Sd目等為前提,通過所 述可視化圖像確定評估函數(shù)定義域內(nèi)的全局最小值,得到分塊大小集合內(nèi)最優(yōu)的分塊大小 si〇
[0021] 優(yōu)選地,所述步驟3)的詳細步驟包括:
[0022] 3. 1)將矩陣A以規(guī)模為SjN的子塊為單位按行分塊,得到包含整數(shù)個規(guī)模為SjN 的子塊的子矩陣①,如果仍有剩余的不規(guī)則的子塊,則將剩余的不規(guī)則的子塊作為子矩陣 ②;將矩陣B以規(guī)模為N*Sd^子塊為單位按行分塊,得到包含整數(shù)個規(guī)模為N*S,的子塊的 子矩陣③,如果仍有剩余的不規(guī)則的子塊,則將剩余的不規(guī)則的子塊作為子矩陣④;將矩陣 A和矩陣B的矩陣乘運算視為得到的所有子矩陣的兩兩相乘,根據(jù)得到的子矩陣數(shù)量建立 使用指針相連接的DMA描述符鏈表,使得每一對相乘的子矩陣對應(yīng)一個DMA描述符鏈表;
[0023] 3. 2)選擇一個子塊乘運算作為當前子塊乘運算;
[0024] 3. 3)獲取當前子塊乘運算在矩陣A中對應(yīng)子塊數(shù)據(jù)的首地址、傳輸長度及傳輸步 長,獲取當前子塊乘運算在矩陣B中對應(yīng)子塊數(shù)據(jù)的首地址、傳輸長度及傳輸步長,將當前 子塊乘運算在矩陣A中對應(yīng)子塊數(shù)據(jù)的首地址、傳輸長度及傳輸步長和當前子塊乘運算在 矩陣B中對應(yīng)子塊數(shù)據(jù)的首地址、傳輸長度及傳輸步長封裝生成一個DMA描述符,根據(jù)當前 子塊乘運算所屬的一對相乘的子矩陣確定對應(yīng)的DMA描述符鏈表,并將該DMA描述符寫入 對應(yīng)的DMA描述符鏈表中;
[0025] 3. 4)判斷是否所有子塊乘運算已經(jīng)完成處理,如果尚未完成所有子塊乘運算的處 理,則選擇下一個子塊乘運算作為當前子塊乘運算,跳轉(zhuǎn)執(zhí)行步驟3. 3);否則,如果已經(jīng)完 成所有子塊乘運算的處理則跳轉(zhuǎn)執(zhí)行步驟4)。
[0026] 優(yōu)選地,所述步驟4)的詳細步驟包括:
[0027] 4. 1)CPU將DMA描述符鏈表中第一個DMA描述符的首地址配置給矩陣乘加速器的 DMA,矩陣乘加速器的DMA開始根據(jù)首地址讀取第一個DMA描述符作為當前描述符;
[0028] 4. 2)矩陣乘加速器的DMA解析當前描述符,得到當前描述符對應(yīng)子塊乘運算所需 的一對子塊在外存中的地址及傳輸長度,并根據(jù)預設(shè)的傳輸步長和當前描述符中攜帶的一 對子塊的地址及傳輸長度,以分時的方式交換讀取當前描述符對應(yīng)子塊乘運算所需數(shù)據(jù), 并將輸入數(shù)據(jù)存入FIFO緩存;
[0029] 4. 3)基于FIFO緩存中當前描述符對應(yīng)子塊乘運算所需數(shù)據(jù),通過矩陣乘加速器 中至少一條處理單元鏈中的前Si個處理單元進行當前描述符對應(yīng)子塊乘運算;
[0030] 4. 4)將當前描述符對應(yīng)子塊乘運算的結(jié)果通過矩陣乘加速器的DMA分別寫回主 存;
[0031] 4. 5)判斷DMA描述符鏈表中的所有DMA描述符是否已經(jīng)處理完畢,如果尚未處理 完畢,則從DMA描述符鏈表中選擇下一個DMA描述符作為當前描述符,跳轉(zhuǎn)執(zhí)行步驟4. 2); 如果已經(jīng)處理完畢,則結(jié)束并退出。
[0032] 優(yōu)選地,所述步驟4. 3)的詳細步驟包括:
[0033] 4. 3. 1)在矩陣乘加速器中確定一條用于當前描述符對應(yīng)子塊乘運算的處理單元 鏈,所述處理單元鏈至少包含Si個處理單元;所述矩陣乘加速器中設(shè)有用于控制各個處理 單元工作狀態(tài)的狀態(tài)機,所述狀態(tài)機包括預取階段、預取及計算階段、提交階段共三個狀 態(tài);初始化變量k為0,控制狀態(tài)機進入預取狀態(tài);
[0034] 4. 3. 2)在預取階段,針對當前描述符對應(yīng)子塊乘運算,矩陣乘加速器的DMA將屬 于矩陣A的子塊中的第k列數(shù)據(jù)附帶上Sif處理單元的編號信息