從winograd原理到實(shí)現(xiàn)及匯編優(yōu)化

一稻据、預(yù)備知識(shí)

1.1 卷積操作

卷積的基本操作就是這樣的:這僅是單通道的計(jì)算,多通道類似蹄梢。

基本卷機(jī)操作

1.2 img2col

思路:

  • 首先,為啥要有這玩意沛硅?
  • 其次,這玩意是怎么做的绕辖?
  • 最后摇肌,這玩意有啥優(yōu)缺點(diǎn)?邊界在哪仪际?

1.2.1 為什么要造出img2col來? 或者說造這玩意的目的是啥围小?

這個(gè)概念是在卷積的實(shí)現(xiàn)很粗糙的背景下提出來的,不信你看這個(gè)鏈接树碱,里面是關(guān)于caffe框架的作者對(duì)他們卷積實(shí)現(xiàn)的吐槽肯适,說當(dāng)時(shí)是在很短的時(shí)間內(nèi)要做出這個(gè)框架,所以就以一個(gè)學(xué)生水平的代碼來實(shí)現(xiàn)的成榜,他的原始實(shí)現(xiàn)方式如下:

Loosely speaking, assume that we have a W*H image with depth D at each input location. For each location, we get a K*K patch, which could be considered as a K*K*D vector, and apply M filters to it. In pseudocode, this is (ignoring boundary conditions):

for w in 1..W
  for h in 1..H
    for x in 1..K
      for y in 1..K
        for m in 1..M
          for d in 1..D
            output(w, h, m) += input(w+x, h+y, d) * filter(m, x, y, d)
          end
        end
      end
    end
  end
end

哈哈哈哈哈哈框舔。。赎婚。刘绣。

等等。挣输。额港。作者當(dāng)時(shí)是博士第三年,還上了Berkeley's CS267 (parallel computers)課程歧焦,并在課程設(shè)計(jì)中針對(duì)兩層做過了最優(yōu)設(shè)計(jì)的男人~我哪來的自信哈哈哈移斩?!


咳咳绢馍。向瓷。。

好舰涌,我們現(xiàn)在嚴(yán)肅回來猖任!

你現(xiàn)在問我為什么么要造img2col這玩意出來?我只能告訴你:

這當(dāng)然是為了優(yōu)化卷積運(yùn)算咯瓷耙!

1.2.2 img2col的實(shí)現(xiàn)原理是啥朱躺?

你看我們?cè)瓉淼膱D像是這樣的:

按照二維存儲(chǔ)的話,假如我們是3X3的卷積核同時(shí)圖像比較大的時(shí)候(內(nèi)存地址的stride > cache line size)搁痛,那么我們的小cache喲长搀,那可是受不了的!

什么鸡典?你問為什么cache受不了源请?

嗯。。谁尸。舅踪。簡(jiǎn)單來說就是不滿足cache空間局部性原理,更細(xì)致的原因可以去找一個(gè)cpu的新片手冊(cè)良蛮,讀一下cache那章抽碌,在cache line那個(gè)地方就有講。

于是很自然的决瞳,我們想可不可以直接把這些跨度很大的內(nèi)存單元提前放到一個(gè)連續(xù)的內(nèi)存單元里來货徙,這樣子的話我們的cache hit rate會(huì)大大提高。

于是img2col就是干這個(gè)活的瞒斩。

這里得說明一下: col并不一定是表示列喲破婆,不同平臺(tái)下實(shí)現(xiàn)方式不一樣的額,如matlab是按列來的胸囱,但是caffe卻是按照行來存的祷舀,其目的都是一樣的,都是為了加速內(nèi)存訪問烹笔。

這里懶得畫了裳扯,借用圖片一下(圖片來源自這):

你看,每一步的卷積都提前給轉(zhuǎn)換好谤职,放到連續(xù)的內(nèi)存中來饰豺。

點(diǎn)評(píng):你看吧,瞎子都看出來了允蜈,有大量的冗余內(nèi)存單元被放進(jìn)來了冤吨,這就是典型的空間換時(shí)間的例子。

再捋一下:
你看下圖示一張圖饶套,在卷積前先給加一層padding漩蟆,然后開始卷積;

正常情況下左上角的綠色框就是要被卷積的妓蛮,但是由于cache特性不好怠李,所以我們給轉(zhuǎn)一下,把這這三組(每組3個(gè)內(nèi)存)不連續(xù)內(nèi)存轉(zhuǎn)成右圖綠色框中那種形式蛤克,成為一列捺癞,這樣在內(nèi)存中就有辦法搞成連續(xù)的內(nèi)存地址了。

好了构挤,目標(biāo)定好了髓介,那么我們?cè)趺丛O(shè)計(jì)轉(zhuǎn)換算法?

其實(shí)我也不會(huì)設(shè)計(jì)儿倒,就是看caffe的源碼實(shí)現(xiàn)是按行來的版保,如圖中的紅色藍(lán)色框所示呜笑,以這種間隔的方式按行存儲(chǔ)原始數(shù)據(jù)夫否,最終得到的就是每個(gè)卷積區(qū)域都轉(zhuǎn)換成一列了彻犁,也就是線性的了

1.2.3 img2col的優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn)
    cache性能好很多了喲~

  • 缺點(diǎn)
    很明顯啊凰慈,內(nèi)存占用大大增加了啊汞幢,上圖中原始圖大小是7x7,轉(zhuǎn)換后為9x9微谓,也就是說內(nèi)存占用多了65%吧瘛!

這部分最后加上作者在Berkeley演講時(shí)的ppt作為小結(jié):


下面表示整個(gè)輸入的feature map的卷積區(qū)域給連續(xù)展開了豺型,轉(zhuǎn)換成一個(gè)(HxW)x(CxKxK)的矩陣仲智;
這里需要理解的是KxK:

  • 我們之前是CxHxW視角,也就是先看一整個(gè)面HxW姻氨,然后再看深度C钓辆,也就是 C個(gè)HxW平面。
  • 后面是以HxW面中的一小塊區(qū)域(KxK)為坐標(biāo)肴焊,然后加上深度信息前联,這樣才構(gòu)成一個(gè)基本的步進(jìn)單元。解讀為 HxW個(gè)CxKxK立方體

最后一頁沒畫娶眷,但是基本上就是Filter Matrix乘以Feature Matrix的轉(zhuǎn)置似嗤,得到輸出矩陣Cout x (H x W),就可以解釋為輸出的三維Blob(Cout x H x W)届宠。

第一部分附錄:

圖片來源:https://blog.csdn.net/lanchunhui/article/details/74838635

全連接
卷積
三維卷積輸出的是二維feature map
按 [kernel_height, kernel_width, kernel_depth] ? 將輸入分成 3 維的 patch烁落,并將其展成一維向量
此時(shí)的卷積操作就可轉(zhuǎn)化為矩陣乘法

二、winograd原理

2.1 先·宏觀來看

Strassen算法僅僅比通用矩陣相乘算法好一點(diǎn)豌注,因?yàn)橥ㄓ镁仃囅喑怂惴〞r(shí)間復(fù)雜度是:

而Strassen算法復(fù)雜度只是:

但隨著n的變大伤塌,比如當(dāng)n >> 100時(shí),Strassen算法是比通用矩陣相乘算法變得更有效率幌羞。

根據(jù)wikipedia上的介紹寸谜,后來Coppersmith–Winograd 算法把 N* N大小的矩陣乘法的時(shí)間復(fù)雜度降低到了:

而2010年,Andrew Stothers再度把復(fù)雜度降低到了:

一年后的2011年属桦,Virginia Williams把復(fù)雜度最終定格為:

三熊痴、winograd實(shí)現(xiàn)

在ncnn的convolution_3x3.h文件中conv3x3s1_winograd64_neon4(const Mat& bottom_blob, Mat& top_blob, const Mat& kernel_tm, const Mat& _bias) 實(shí)現(xiàn)了winograd算法。

步驟如下:

  • 首先把輸出通道按照6x6的大小做補(bǔ)齊聂宾,使得整體的大小為6x6的整數(shù)倍果善,填充后的輸出再加一層padding。

  • 第二步就是處理底層feature map層了系谐。
    //把底層復(fù)制成擴(kuò)展后的輸出層+邊的大小,空出來的地方填充V值巾陕。
    copy_make_border(bottom_blob, bottom_blob_bordered, 0, h - bottom_blob.h, 0, w - bottom_blob.w, 0, 0.f);

  • 第二步就是處理底層feature map層了讨跟。

    • 首先把輸出做tile操作,也就是把每個(gè)6x6擴(kuò)大到8x8鄙煤,此時(shí)得到w_tm = outw / 6 * 8晾匠、h_tm = outh / 6 * 8

四、winograd匯編性能優(yōu)化

待續(xù)梯刚。凉馆。。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亡资,一起剝皮案震驚了整個(gè)濱河市澜共,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锥腻,老刑警劉巖嗦董,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瘦黑,居然都是意外死亡京革,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門供璧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來存崖,“玉大人,你說我怎么就攤上這事睡毒±淳澹” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵演顾,是天一觀的道長(zhǎng)供搀。 經(jīng)常有香客問我,道長(zhǎng)钠至,這世上最難降的妖魔是什么葛虐? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮棉钧,結(jié)果婚禮上屿脐,老公的妹妹穿的比我還像新娘。我一直安慰自己宪卿,他們只是感情好的诵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著佑钾,像睡著了一般西疤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上休溶,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天代赁,我揣著相機(jī)與錄音扰她,去河邊找鬼。 笑死芭碍,一個(gè)胖子當(dāng)著我的面吹牛徒役,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豁跑,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼廉涕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼泻云!你這毒婦竟也來了艇拍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤宠纯,失蹤者是張志新(化名)和其女友劉穎卸夕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婆瓜,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡快集,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了廉白。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片个初。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖猴蹂,靈堂內(nèi)的尸體忽然破棺而出院溺,到底是詐尸還是另有隱情,我是刑警寧澤磅轻,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布珍逸,位于F島的核電站,受9級(jí)特大地震影響聋溜,放射性物質(zhì)發(fā)生泄漏谆膳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一撮躁、第九天 我趴在偏房一處隱蔽的房頂上張望漱病。 院中可真熱鬧,春花似錦把曼、人聲如沸杨帽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睦尽。三九已至,卻和暖如春型雳,著一層夾襖步出監(jiān)牢的瞬間当凡,已是汗流浹背山害。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沿量,地道東北人浪慌。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像朴则,于是被迫代替她去往敵國(guó)和親权纤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容