本發(fā)明屬于數(shù)據(jù)處理,特別涉及一種基于nna2.0的matmul層數(shù)據(jù)處理方法。
背景技術(shù):
1、現(xiàn)有技術(shù)中,nna技術(shù)實現(xiàn)在于加速實現(xiàn)卷積累乘求和計算,在cpu的simd的pipeline上的硬件加速器,操作由特殊的cpu/simd指令控制,在一個線程上運行,用以解決絕大部分的卷積乘加,并支持將最后的結(jié)果進行量化。矩陣點乘matmul是行與列點乘求和得到輸出點。matmul實現(xiàn)邏輯:rslt0=w00*f00+w01*f10+......+w0n*fn0;(一共n個pixel相乘求和)。
2、然而,現(xiàn)有技術(shù)的主要缺陷在于:數(shù)據(jù)不連續(xù),導致無法并行計算,步驟較多,速度較慢。
3、此外,現(xiàn)有技術(shù)中的常用術(shù)語包括:
4、1、feature_shape:輸入數(shù)據(jù)的形狀,抽象理解為多維度數(shù)據(jù),從左到右依次是從高維到低維(ndhwc)n:一次處理featuremap數(shù)量,設置為1;d:輸入通道拆分為32一組的個數(shù),h:輸入數(shù)據(jù)的高,w:輸入數(shù)據(jù)的寬,c:32。
5、2、mac:基于nna的卷積累乘和計算
6、3、ic、oc:輸入通道和輸出通道,一般用于卷積核的通道說明。
7、4、fram:nna用于存儲輸入數(shù)據(jù)空間。
技術(shù)實現(xiàn)思路
1、為了解決上述問題,本技術(shù)的目的在于:將matmul計算邏輯轉(zhuǎn)換為卷積,使用nna進行加速,提高計算效率。
2、具體地,本發(fā)明提供一種基于nna2.0的matmul層數(shù)據(jù)處理方法,所述方法包括以下步驟:
3、s1:權(quán)重重排,第0個輸入源理解為卷積核保存的權(quán)重,外層循環(huán)為n,可n次循環(huán)計算9個權(quán)重;內(nèi)層循環(huán)為m,m可是任意值,每次計算9個,不滿9個數(shù)可根據(jù)nna的mask掩碼,把其余位置補0;
4、假設為一行,有9個權(quán)重;
5、 w00 w01 w02 w03 w04 w05 w06 w07 w08
6、重新排布為3x?3形狀,以便于使用nna卷積計算:
7、 w00 w01 w02 w03 w04 w05 w06 w07 w08
8、每個輸入通道保留一個有效數(shù)據(jù),卷積邏輯是將所有通道相乘累加求和,matmul只有當前權(quán)重與feature相乘,需要去除其余通道影響;
9、 ic0 ic1 ic2 ic3 ic4 ic5 ic6 ... ic31 oc0 w00 0 0 0 0 0 0 ... 0 oc1 0 w00 0 0 0 0 0 ... 0 ... oc31 0 0 0 0 0 0 0 ... w00
10、保留一個權(quán)重通道有效,其余權(quán)重通道設置為0,這樣保證累乘求和之后通道方向累加不會造成結(jié)果異常;
11、s2:數(shù)據(jù)重排,第1個輸入源feature1理解為卷積過程中輸入數(shù)據(jù),行數(shù)可為任意值,假設為9行32通道;所述9行與步驟s1通道9個權(quán)重相對應,通道已32倍數(shù)為一次循環(huán),如果不是32倍數(shù),可單獨計算:
12、 f00 f01 f02 f03 f04 f05 f06 ... f0,31 f10 f11 f12 f13 f14 f15 f16 ... f1,31 f20 f21 f22 f23 f24 f25 f26 ... f2,31 ... f8,0 f8,1 f8,2 f8,3 f8,4 f8,5 f8,6 ... f8,31
13、依次加載load?32個通道chn,存入nna存儲輸入數(shù)據(jù)空間fram,將每32個chn看成一個pixel,
14、然后以卷積核的形式將9個pixel重新排布:
15、假設8bit數(shù)據(jù):
16、la(o,vr0,0,in_ptr,0);第0行數(shù)據(jù);
17、la(o,vr0,1,in_ptr+ichn,0);第1行數(shù)據(jù);
18、la(o,vr0,0,in_ptr+2*ichn,0);第2行數(shù)據(jù);
19、從輸入地址中讀取f00?f10?f20數(shù)據(jù);
20、nndwf0(vr0)
21、nndwf0(vr1)
22、.......循環(huán)讀取后面通道,并行計算8次;
23、將vr0,vr1的數(shù)據(jù)存入fram中,提前配置nna寄存器,可在讀取固定的pixel之后進行行跳轉(zhuǎn),假設設置為8,nndwf0(vr)8次自動跳到下一行fram地址:
24、la(o,vr0,0,in_ptr+3*ichn,0);第3行數(shù)據(jù);
25、la(o,vr0,1,in_ptr+4*ichn,0);第4行數(shù)據(jù);
26、la(o,vr0,0,in_ptr+5*ichn,0);第5行數(shù)據(jù);
27、nndwf0(vr0)
28、nndwf0(vr1)
29、從輸入地址中讀取f30?f40?f50數(shù)據(jù);
30、la(o,vr0,0,in_ptr+6*ichn,0);第6行數(shù)據(jù);
31、la(o,vr0,1,in_ptr+7*ichn,0);第7行數(shù)據(jù);
32、la(o,vr0,0,in_ptr+8*ichn,0);第8行數(shù)據(jù);
33、nndwf0(vr0)
34、nndwf0(vr1)
35、從輸入地址中讀取f60?f70?f80數(shù)據(jù);
36、這樣對應權(quán)重與對應數(shù)據(jù)相乘,得到matmul的計算邏輯:
37、 f00 f10 f20 f30 f40 f50 f60 f70 f80
38、;
39、s3:使用nna進行卷積操作求和:由于硬件設置,卷積核的步長stride設置為2:
40、
41、上表左上角框中的f00~f80表示0~31通道;
42、上表中間上框中的f00~f80表示32~63通道;
43、nna計算的時候會將左上角框與中間上框區(qū)域數(shù)據(jù)同時與權(quán)重相乘,實現(xiàn)權(quán)重復用的思想,減少權(quán)重反復讀取的操作:
44、使用nndwf0將f00~f80,0~63通道數(shù)據(jù)存入fram中;
45、使用nndww將權(quán)重數(shù)據(jù)存入fram中;
46、使用nnmacg指令,將權(quán)重數(shù)據(jù)與輸入數(shù)據(jù)累乘求和,0~31與32~63通道使用同一個wram權(quán)重數(shù)據(jù);
47、s4:并行計算:提前將第一次卷積計算即0~63通道的數(shù)據(jù)寫入fram0,然后進行nna卷積操作mac00,使用nnmacg(mac00,opt_nnmac_wraing,1,opt_nnmac_fp_num0)開始計算mac00,mac過程中寫fram1即64~127通道的數(shù)據(jù),并且將fram0的數(shù)據(jù)存入臨時開辟的空間tmp,然后mac01,交替進行,mac00需要時間,可與simd指令并行,操作如下:
48、mac00計算時間用于mac01的數(shù)據(jù)讀取,mac01的計算時間用于mac00的數(shù)據(jù)讀取,兩塊空間ping-pong計算;
49、上表左下角框中的f00~f80表示64~95通道;
50、上表中間下框中的f00~f80表示96~127通道;
51、將下一次需要計算的64通道提前存入nna?fram空間中,使得nna進行卷積操作的時間用來讀取下一次卷積操作的數(shù)據(jù),提高nna的計算效率;
52、所有通道計算完后將數(shù)據(jù)存入一片tmp,更新權(quán)重,重復以上步驟,即表示為:
53、la(o,vr0,0,in_ptr+ichn,0);
54、la(o,vr0,1,in_ptr+1*ichn,0);
55、la(o,vr0,0,in_ptr+2*ichn,0);
56、nndwf0(vr0)
57、nndwf0(vr1)
58、將剩余行數(shù)據(jù)存入fram中,更新fram數(shù)據(jù),然后進行mac計算,然后將結(jié)果加到tmp的數(shù)據(jù),直到所有權(quán)重計算結(jié)束,表示為:nndrdocb(vr0,opt_nndrdocb_pixel0,nndrdocb_lo);將nna計算結(jié)果存入vr0寄存器中
59、la(o,vr1,0,tmp_ptr,0);讀取tmp空間數(shù)據(jù)
60、add(w,vr2,vr0,vr1);tmp數(shù)據(jù)加上本次計算結(jié)果
61、sa(o,vr2,0,tmp_ptr,0);更新tmp空間的數(shù)據(jù),至此,得到所有權(quán)重與通道相乘累加求和的結(jié)果。
62、所述步驟s2中如果不是32倍數(shù),可用c++代碼單獨計算。
63、所述步長stride=2,根據(jù)nna硬件功能而來,輸出形狀是1x4,一次生成4個點,其中有2個是有效pxiel數(shù)據(jù)生成;如果是nna2.0輸出形狀是1x8,一次生成8個輸出點,其中4個為有效數(shù)據(jù)。
64、所述matmul實現(xiàn)邏輯是最低兩個維度,即w:寬、c:通道,相乘累加求和得到最后結(jié)果。
65、由此,本技術(shù)的優(yōu)勢在于:方法簡單,減少等待時間,提高nna的計算效率。