吳家飛 黃 晞 施文灶
(福建師范大學,福建省光電傳感應用工程技術研究中心 福建 福州 350007)
隨著大數據時代的來臨,以數據為驅動的深度學習已經在語音識別、機器視覺、自然語言處理等領域引發突破性的變革[1]。2015年由Kaiming He等提出的Resnet網絡在ImageNet比賽中錯誤率降低到驚人的3.57%,已經超過人眼的水平[2]。2016年,由谷歌開發的AlphaGo與世界冠軍李世石對戰,成功贏下了人機對戰的比賽[3]。但是伴隨著深度學習的發展,計算規模也越來越大,比如VGG-16的參數達到1億3千萬個,基于傳統的CPU平臺已經難以滿足如此大規模的計算,因此我們需要一種較好的硬件加速方式來滿足計算需求。
傳統對圖像處理算法的加速采用的平臺主要是GPU、DPS[4],雖然易于編程,但在功耗、性能、成本,以及圖像實時處理等方面還是FPGA更具有優勢。因此在嵌入式系統中采用FPGA來對算法進行硬件加速無疑是一種不錯的選擇[5]。
FPGA是以硬件語言Verilog或HDL來完成電路設計,設計期間需要仿真、時序分析和綜合一系列步驟來完成設計[6]。復雜的時序設計、邏輯轉化以及花費很多時間重復地進行仿真和優化,這需要設計者有扎實的相關基礎和多年的經驗才能完成。Xilinx公司發布的HLS工具,使設計者無需用傳統的硬件描述語言來編寫復雜的程序,只需將算法用C、C++等可讀性高、易于維護的高級語言來完成。HLS工具能將相應的代碼轉換為硬件描述語言,并且還可以進行C/RTL協同仿真測試算法方案的正確性,滿足了設計的靈活性。
目前已有許多應用HLS成功開發的項目,比如在文獻[7]中,作者用HLS工具基于FPGA完成對數據挖掘中非常耗時的頻繁項集挖掘(FIM)部分進行加速,速度比6核心的CPU快約3.2倍。和GPU相比,如果用最新的FPGA來完成算法,在低功耗的情況下性能甚至高于GPU。文獻[8]中用機器學習的方式構建一套客觀感知圖像質量的方法。然后用HLS工具設計實現,在FPGA上完成算法的硬件加速。
雖然HLS能夠方便地完成C/C++語言到硬件描述語言的轉換,但如果我們想要充分地利用FPGA上的資源,我們需要用HLS工具對代碼的函數、循環、接口、數組添加相應的優化指令來加快算法運行速度。具體的優化指令如表1所示。如果一段算法代碼需要的優化點較多,比如:我們對離散余弦(dct)進行優化,優化4個循環部分、2個函數部分、2個接口部分,共8個優化點,將產生84×72×52=5 017 600種優化方案。假設每一種方案花費20 s時間分析,那么人工手動遍歷每一種方案,從中選出最優方案,將會花費約3年多的時間,顯然這是不可取的。

表1 粒子的編碼
目前,在國內外,還有沒有關于HLS工具優化方法的綜合性研究,大多是對HLS的粗糙使用。比如:文獻[9],把SHA-3加密算法用HLS進行優化設計時,只考慮到算法最大吞吐量,將算法中的子函數全都設置為pipeline指令,提高并行能力,將代碼中的數組采用partitioned和dependece來解決循環執行中的相關性問題。雖然將吞吐量提高了200多倍,但是優化過于簡單粗糙,且沒有給出資源使用情況。文獻[10]中,對FFT算法進行優化,主要分析了代碼中3個循環使用不同優化指令的情況下,latency和資源使用情況。選出最小latency和資源使用較少的方案,滿足了設計需求,但由于對算法的針對性較強,且算法規模較小,因此可拓展性不強。文獻[11]中,通過對LeNet卷積神經網每一層都進行硬件分析設計,在節省硬件資源的情況下,利用HLS精細地劃分最消耗時間的循環部分,并在MNIST手寫識別數據庫測試了架構的運行效率,取得了非常不錯的效果。但這種方式需要設計者具備較多經驗,對于一般軟件設計者來說難度較大。
綜上所述,由于目前基于HLS工具的應用還普遍比較粗糙,通過人工的優化方法,需要了解算法的結構,掌握并行運算的知識,并通過不斷的嘗試,從大量的組合方案中挑選合適的方案,這個工作量是非常巨大的,因此工作效率不高。本文提出的一種基于HLS的智能優化算法的架構,并在此架構上采用模糊離散粒子群算法將待轉換的原代碼進行編碼,并通過自動調用HLS,進行仿真優化處理,分析提取latency和資源評估圖的BPRAM_18K、DSP48E、FF、LUT等參數,并對產生的優化方案進行評估,從中優選合適的優化方案。從實驗結果看,本文方法有效地提升工作效率。
粒子群算法是一種群智能算法,具有算法簡單、運算速度快、精確度高等特點,非常適合在大規模集合中迭代尋優。因此本文基于粒子群算法,設計一套HLS優化架構,流程如圖1所示。

圖1 流程框圖
首先,我們將C/C++算法代碼中需要優化部分進行設置,設置完成后運行粒子群的主程序,隨機產生初始種群,把種群的參數信息傳入HLS工具的API接口進行RTL仿真,提取仿真后產生XML文件中的Latency、DSP48、BRAM_18k、LUT、FF參數進行適應度計算。其次,記錄個體適應度極值和種群適應度極值。再次,反復進行速度和位置更新、RTL仿真、適應度計算、個體和種群更新等迭代尋優的操作,直到滿足停止條件。最后得到一個優化方案。
以矩陣乘法(matrixmul)程序為例:
void matrixmul(
mat_a_t a[MAT_A_ROWS][MAT_A_COLS],
mat_b_t b[MAT_B_ROWS] [MAT_B_COLS],
result_t res[MAT_A_ROWS][MAT_B_COLS]
)
{
Row: for(int i=0; i { Col: for(int j=0; j { Res[i][j]=0; Product: for(int k =0; k res[i][j]+=a[i][k]*b[k][j]; } } } 假如我們想要優化這段代碼中的函數matrixmul,接口a、b、res,循環Col,將這些優化點進行相應的編碼設置,編碼方式如表1所示。 我們將每個優化點設置為3位,第1位為相應的標簽名;第2位表示優化點的類型,0、1、2、3、分別代表優化點的類型為函數、循環、數組、接口;第3位表示的是添加優化指令的編號,可通過查看表2中優化類型所對應的指令編號得出。舉例說明:(matrixmul 0 5),表示優化點標簽為matrixmul,優化的類型為函數,添加的優化指令為interface。(Col 1 1),表示優化點的標簽為Col,優化的類型為循環,添加的指令為pipeline。由多個優化點組成一個例子,隨機初始化一個粒子,如表3所示。 表2 HLS常用優化指令 表3 隨機初始化一個粒子 本文中,粒子適應度(Fitness)的表達式如下: (1) 式中:Cost如下: Cost=latency×(BPRAM+DSP48E+FF+LUT) (2) 當方案具有較小的latency和較小的BPRAM、DSP48E、FF、LUT時將取得較大的適應度,適應度越高表示優化方案越優秀。 在一個N維搜索空間中,n個粒子組成粒子種群X=(X1,X2,…,Xn),第i個粒子在N維搜索空間中的位置用Xi=(x1,x2,…,xn)T表示,在本文中Xi代表優化指令解的集合。Vi=(Vi1,Vi2,…,Vin)T為第i個粒子的速度,相對應的個體極值為Pi=(Pi1,Pi2,…,Pin)T,種群極值為Pg=(Pg1,Pg2,…,Pgn)T。速度和位置的更新公式如下: (3) 式中:ω為慣性系數;d=1,2,…,n;k為當前迭代的次數;c1、c2為非負常數;r1、r1是分布于[0,1]之間的隨機數。 在本文中將粒子的位置用優化指令的集合表示。我們需要將速度矢量和位置矢量用模糊集合來代替。以表3這個隨機初始化的粒子為例,由5個優化點組成的粒子的位置(也就是每組第三位優化指令的編號)為(5,1,1,5,4),從表1 中可以得到優化指令編號的域為{0,1,2,3,4,5,6,7}。因此可以將位置模糊化為如下矩陣: 同樣道理速度也可以用這樣方式來表示。之后將位置和速度模糊集合代入式(3)進行速度和位置的更新。 這個粒子經過位置更新之后的粒子位置如下所示: (1) 標準化 標準化的方法為每行除以每行相對應的最大的數: (2) 去模糊化 去模糊化就是將模糊化的集合重新恢復為矢量: 最終,初始粒子在經過位置和速度更新之后的粒子如表4所示。 表4 位置更新之后的粒子 matrixmul函數優化指令由interface設置為pipeline,Col循環的優化指令由pipeline設置為unroll,a、b、res接口的優化指令都被設置為array_stream。 本文的實驗采用的FPGA為Xilinx kintex7,xc7k160tfbg484-1。粒子群算法的框架通過VS2013編寫,選取矩陣相乘(matrixmul)和離散余弦變換(dct)進行實驗,其中算法的參數設置如表5所示。 表5 粒子群算法參數設置 首先對matrixmul算法代碼進行優化,優化點為5個,分別是1個函數,1個循環和3個接口。優化指令組合數共有(6+1)×(7+1)×(5+1)3=12 096種,加1為沒有添加指令的情況。應用本文的HLS自動化架構能夠從中快速的找出適應度較高的優化方案,迭代尋優過程如圖2所示。初始個體適應度極值較低,經過多次的迭代,最優個體適應度極值得到了提升,由于matrixmul案例相對復雜度不高,因此最優個體適應度很快在第5代穩定下來,并且不再變化。 圖2 matrixmul案例迭代尋優過程 在多次迭代后,我們找到了一個優化方案。為了評估該方案的性能和資源使用情況,我們將該方案與未添加優化指令的方案和Xilinx公司提供的方案進行對比。如圖3所示,由本文自動化架構求得的方案和未作優化的方案相比,latency大大降低,甚至低于Xilinx公司提供的方案的latency。而從圖4資源對比圖中可以知道,在各項資源的使用量上,第3種和第2種基本持平。因此,綜合時延和資源使用來說,本文得出的方案無疑可以很好地滿足設計需求。 圖3 matrixmul案例不同方案的latency對比圖 圖4 matrixmul案例不同方案的資源使用對比圖 同理,我們對dct案例進行測試,由于選取的優化點有10個,分別是2個函數、4個循環、2個數組、2個接口,共有兩億多種方案的組合。因此我們增加粒子的個數,以及迭代的次數,粒子群迭代的過程如圖5所示,最優個體適應度不斷提高,最終在第10代穩定下來。 圖5 dct案例迭代尋優過程 同理,我們將迭代后找到的最優方案與未添加優化指令的方案和Xilinx公司提供的方案進行對比,從圖6和圖7中我們可以得到,第3種方案的latency比第1種方案低數十倍,比第2種方案低3倍,但是第3種方案的各項資源的使用量也相應增加。因此綜合而言,在資源充足的情況下,如果開發人員想要更低的latency,由本文方法得出的方案可以很好地滿足要求。 圖6 dct案例不同方案的latency對比圖 圖7 dct案例不同方案的資源使用對比圖 HLS工具可以高效率地進行高級語言到硬件語言的轉換,解決了傳統FPGA開發周期長、難度大等問題。目前HLS開發大多是通過人工的優化方法,需要了解算法的結構,掌握并行運算的知識,并通過不斷的嘗試,從大量的組合方案中挑選合適的方案,工作量非常巨大。因此本文基于粒子群算法設計了一套HLS自動化架構,在無需提前了解相關知識的前提下,設計者只需設置需要優化的優化點及粒子群參數就可以完成優化方案尋找。之后的流程都是機器完成,極大地提升設計人員的設計效率。最后通過自動化HLS架構對兩個matrix和dct兩個案例進行實驗,都成功地得到了優化方案。將優化方案與Xilinx公司提供的方案相對比,結果證明本文方法得到的方案在性能和資源使用上都能較好地滿足需求,進一步證明本文的優化架構具有一定程度的可行性和通用性。

2.2 適應度計算方式設置
2.3 速度和位置更新操作
2.4 模糊化和去模糊化操作



3 實驗結果與分析







4 結 語