矩陣乘法的優(yōu)化及其在卷積中的應用
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
本文轉(zhuǎn)自 | 視覺算法

基本概念

(其中 ??、??、?? 分別指代三層循環(huán)執(zhí)行的次數(shù),2 指代循環(huán)最內(nèi)層的一次乘法和加法) ,內(nèi)存訪問操作總數(shù)為 4??????(其中 4 指代對 ??、??、?? 三者的內(nèi)存訪問,?? 需要先讀取內(nèi)存、累加完畢在存儲,且忽略對 ?? 初始化時的操作)。GEMM 的優(yōu)化均以此為基點。for (int m = 0; m < M; m++) {for (int n = 0; n < N; n++) {C[m][n] = 0;for (int k = 0; k < K; k++) {C[m][n] += A[m][k] * B[k][n];}}}

計算拆分展示

for (int m = 0; m < M; m++) {for (int n = 0; n < N; n += 4) {C[m][n + 0] = 0;C[m][n + 1] = 0;C[m][n + 2] = 0;C[m][n + 3] = 0;for (int k = 0; k < K; k++) {C[m][n + 0] += A[m][k] * B[k][n + 0];C[m][n + 1] += A[m][k] * B[k][n + 1];C[m][n + 2] += A[m][k] * B[k][n + 2];C[m][n + 3] += A[m][k] * B[k][n + 3];}}}

for (int m = 0; m < M; m += 4) {for (int n = 0; n < N; n += 4) {C[m + 0][n + 0..3] = 0;C[m + 1][n + 0..3] = 0;C[m + 2][n + 0..3] = 0;C[m + 3][n + 0..3] = 0;for (int k = 0; k < K; k++) {C[m + 0][n + 0..3] += A[m + 0][k] * B[k][n + 0..3];C[m + 1][n + 0..3] += A[m + 1][k] * B[k][n + 0..3];C[m + 2][n + 0..3] += A[m + 2][k] * B[k][n + 0..3];C[m + 3][n + 0..3] += A[m + 3][k] * B[k][n + 0..3];}}}

發(fā)展到了
。for (int m = 0; m < M; m += 4) {for (int n = 0; n < N; n += 4) {C[m + 0..3][n + 0..3] = 0;C[m + 0..3][n + 0..3] = 0;C[m + 0..3][n + 0..3] = 0;C[m + 0..3][n + 0..3] = 0;for (int k = 0; k < K; k += 4) {C[m + 0..3][n + 0..3] += A[m + 0..3][k + 0] * B[k + 0][n + 0..3];C[m + 0..3][n + 0..3] += A[m + 0..3][k + 1] * B[k + 1][n + 0..3];C[m + 0..3][n + 0..3] += A[m + 0..3][k + 2] * B[k + 2][n + 0..3];C[m + 0..3][n + 0..3] += A[m + 0..3][k + 3] * B[k + 3][n + 0..3];}}}

處理內(nèi)存布局


for (int mo = 0; mo < M; mo += 8) {for (int no = 0; no < N; no += 8) {for (int mi = 0; mi < 2;mi ++) {for (int ni = 0; ni < 2; ni++) {int m = mo + mi * 4;int n = no + ni * 4;C[m + 0..3][n + 0..3] = 0;C[m + 0..3][n + 0..3] = 0;C[m + 0..3][n + 0..3] = 0;C[m + 0..3][n + 0..3] = 0;for (int k = 0; k < K; k += 4) {C[m + 0..3][n + 0..3] += A[m + 0..3][k + 0] * B[k + 0][n + 0..3];C[m + 0..3][n + 0..3] += A[m + 0..3][k + 1] * B[k + 1][n + 0..3];C[m + 0..3][n + 0..3] += A[m + 0..3][k + 2] * B[k + 2][n + 0..3];C[m + 0..3][n + 0..3] += A[m + 0..3][k + 3] * B[k + 3][n + 0..3];}}}}}
量化神經(jīng)網(wǎng)絡

這樣浮點計算也可通過 Gemmlowp 在僅支持定點計算的處理器上運行。和 QNNPACK 不同,Gemmlowp 似乎目的在于支持 GEMM 而非單純神經(jīng)網(wǎng)絡,因此在神經(jīng)網(wǎng)絡方面的性能目前落后于 QNNPACK 。計算劃分與削減維度


內(nèi)存組織的特點

im2col 計算方法

內(nèi)存布局與卷積性能


參考
—完—
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~
評論
圖片
表情

