2.3 卷積計算加速單元的設計思路
作為CNN網絡中比重最大、最為核心的卷積計算加速單元,是CNN軟核性能加速的關鍵,也佔用了FPGA晶片的大部分算力分配和邏輯資源消耗。下面將針對EdgeBoard卷積計算加速單元的設計思路進行簡要介紹,此章節也是理解CNN軟核算力彈性配置的技術基礎。
每一層網絡的卷積運算,有M個輸入圖片(稱之為feature map,對應著一個輸入通道),N個輸出feature map(N個輸出通道),M個輸入會分別進行卷積運算然後求和,獲得一幅輸出map。那麼需要的卷積核數量就是M*N。
針對上述計算特點,EdgeBoard的卷積單元採用脈動陣列的數據流動結構,將數據在PE之間通過寄存器進行打拍操作,可以實現在第二個PE計算結果出來的同時完成和前一個PE的求和。這樣可以使數據在運算單元的陣列中進行流動,減少訪存的次數,並且結構更加規整,布線更加統一,提高系統工作頻率,避免了採用加法樹等並行結構所造成的高扇出問題。
因此,如上圖所示,我們可以分別從Feature Map和Kernel兩個維度去定義脈動陣列的並行結構。從Feature Map的角度,縱向的行與行直接卷積窗口相互獨立,也就是輸出的每行之間所對應的數據計算互不幹擾,在此維度定義的多並發計算稱之為Window維度的並行度。從Kernel的角度,為了達到計算結果的快速流出減少片上緩存佔用,我們設計了每個Kernel核之間的多並發計算,稱之為Kernel維度的並行度。以上兩個維度同時並發既可以提高整體並行計算效率,也充分利用了脈動陣列的數據流水特性。
2.4 卷積計算加速單元的通用性擴展
前一章節詳細介紹了基於PL實現的卷積計算加速單元的設計原理,那麼如果是由於晶片的SRAM存儲資源不夠而導致的CNN網絡參數支持範圍較小,EdgeBoard將如何拓展CNN軟核的網絡支持通用性? 我們可以利用靈活的SDK調度管理單元提前將Feature Map或者Kernel數據進行拆分,然後再執行算子任務的下發。
一條滑窗鏈的Feature Map數據不夠存儲
SDK可以將一條滑窗鏈的Feature Map數據分成B塊,並將分塊數B和每個塊的數據量告訴卷積計算加速單元,那麼後者則可以分批依次從DDR讀取B次Feature Map數據,每次的數據量是可以存入到Image SRAM內。
Kernel的總體數據不夠存儲
SDK可以將Kernel的數量分割成S份,使得分割後的每份Kernel數量可以下發到PL側的Filter SRAM中,然後SDK分別調度S次卷積算子執行操作,所有的數據返回DDR後,再從通道(Channel)維度做這S次計算結果的數據拼接(Concat)即可。不過要注意的是,我們的Filter SRAM雖然不需存儲所有Kernel的數據量,但至少要保證能夠存儲一個Kernel的數據量。
由此看來,即使EdgeBoard三兄弟中最小的FZ3擁有極其有限的片上存儲資源,也是能夠很好地完成大多數CNN網絡的參數適配。