圖3.3layer并行模式下資源和時(shí)間分配示意圖
我們的設(shè)計(jì)采用了是Layer串行的模式,數(shù)據(jù)在CPU、FPGA和DDR直接的交互過(guò)程如圖3.4所示。
圖3.4計(jì)算流程圖
3.2.3計(jì)算單個(gè)Layer的PM(ProcessingModule)設(shè)計(jì)
如圖3.5所示,數(shù)據(jù)處理過(guò)程如下,所有過(guò)程都流水線進(jìn)行:(1)Kernel和Data通過(guò)兩個(gè)獨(dú)立通道加載到CONV模塊中;
(2)CONV完成計(jì)算,并將結(jié)果存在ReduceRAM中;
(3)(可選)如果當(dāng)前l(fā)ayer需要做ReLU/Norm,將ReLU/Norm做完之后寫(xiě)回ReduceRAM中;
(4)(可選)如果當(dāng)前l(fā)ayer需要做MaxPooling,將Max做完之后寫(xiě)回ReduceRAM中;
(5)將計(jì)算結(jié)果進(jìn)行格式重排之后寫(xiě)回DDR中。
圖3.5ProcessingModule的結(jié)構(gòu)框圖
3.2.4CONV模塊的設(shè)計(jì)
在整個(gè)PM模塊中,最主要的模塊是CONV模塊,CONV模塊完成數(shù)據(jù)的卷積。由圖3.6所示,卷積計(jì)算可以分解成兩個(gè)過(guò)程:kernel及Data的展開(kāi)和矩陣乘法。
Kernel可以預(yù)先將展開(kāi)好的數(shù)據(jù)存在DDR中,因此不需要在FPGA內(nèi)再對(duì)Kernel進(jìn)行展開(kāi)。Data展開(kāi)模塊,主要是將輸入的featuremap按照kernel的大小展開(kāi)成可以同kernel進(jìn)行求內(nèi)積計(jì)算的矩陣。數(shù)據(jù)展開(kāi)模塊的設(shè)計(jì)非常重要,不僅要減小從DDR讀取數(shù)據(jù)的數(shù)據(jù)量以減小DDR帶寬的要求,還要保證每次從DDR讀取數(shù)據(jù)時(shí)讀取的數(shù)據(jù)為地址連續(xù)的大段數(shù)據(jù),以提高DDR帶寬的讀取效率。
圖3.6卷積過(guò)程示意圖
圖3.7為矩陣乘法的實(shí)現(xiàn)結(jié)構(gòu),通過(guò)串聯(lián)乘加器來(lái)實(shí)現(xiàn),一個(gè)周期可以完成一次兩個(gè)向量的內(nèi)積,通過(guò)更新端口上的數(shù)據(jù),可以實(shí)現(xiàn)矩陣乘法。
圖3.7矩陣乘法實(shí)現(xiàn)結(jié)構(gòu)
展開(kāi)后的矩陣比較大,F(xiàn)PGA因?yàn)橘Y源結(jié)構(gòu)的限制,無(wú)法一次完成那么的向量?jī)?nèi)積,因此要將大矩陣的乘法劃分成幾個(gè)小矩陣的乘加運(yùn)算。拆分過(guò)程如圖3.8所示。
假設(shè)大矩陣乘法為O=X*W,其中,輸入矩陣X為M*K個(gè)元素的矩陣;權(quán)重矩陣W為K*P個(gè)元素的矩陣;偏置矩陣O為M*P個(gè)元素的矩陣;
圖3.8大矩陣乘法的拆分過(guò)程
R=K/L,如果不能整除輸入矩陣,權(quán)重矩陣和偏置通過(guò)補(bǔ)零的方式將矩陣處理成可以整除;
S=P/Q,如果不能整除將權(quán)重矩陣和偏置矩陣通過(guò)補(bǔ)零的方式將矩陣處理成可以整除;
3.2.5實(shí)現(xiàn)過(guò)程的關(guān)鍵點(diǎn)
(1)決定系統(tǒng)性能的主要因素有:DSP計(jì)算能力,帶寬和片內(nèi)存儲(chǔ)資源。好的設(shè)計(jì)是將這三者達(dá)到一個(gè)比較好的平衡。參考文獻(xiàn)[2]開(kāi)發(fā)了roofline性能模型來(lái)將系統(tǒng)性能同片外存儲(chǔ)帶寬、峰值計(jì)算性能相關(guān)聯(lián)。(2)為了達(dá)到最好的計(jì)算性能就是要盡可能地讓FPGA內(nèi)的在每一個(gè)時(shí)鐘周期都進(jìn)行有效地工作。為了達(dá)到這個(gè)目標(biāo),CONV模塊和后面的ReLU/Norm/Pooling必須能異步流水線進(jìn)行。Kernel的存儲(chǔ)也要有兩個(gè)存儲(chǔ)空間,能對(duì)系數(shù)進(jìn)行乒乓加載。另外,由于計(jì)算是下一層的輸入依賴于上一層的輸出,而數(shù)據(jù)計(jì)算完成寫(xiě)回DDR時(shí)需要一定時(shí)間,依次應(yīng)該通過(guò)交疊計(jì)算兩張圖片的方式(Batch=2)將這段時(shí)間通過(guò)流水迭掉。
(3)要選擇合適的架構(gòu),是計(jì)算過(guò)程中Data和Kernel只要從DDR讀取一次,否則對(duì)DDR帶寬的要求會(huì)提高。