丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
人工智能開發(fā)者 正文
發(fā)私信給叨叨
發(fā)送

0

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

本文作者: 叨叨 2017-04-21 18:10
導(dǎo)語:PerfXLab澎峰科技創(chuàng)始人分享

提起矩陣計算,學(xué)過《高等數(shù)學(xué)》的人可能都聽過,但若不是這個領(lǐng)域的研究者,恐怕也只停在“聽過”的程度。在矩陣計算領(lǐng)域,開源項目OpenBLAS影響巨大,除IBM、華為等巨頭公司在使用外,還吸引了全球的研究院校、開發(fā)者們關(guān)注。

雷鋒網(wǎng) AI 研習(xí)社近日有幸邀請到了澎峰科技創(chuàng)始人、OpenBLAS項目創(chuàng)始人和主要維護者張先軼,他將為我們介紹OpenBLAS開源項目以及矩陣乘法的優(yōu)化。

嘉賓介紹

張先軼,中國科學(xué)院博士,MIT博士后,OpenBLAS開源項目創(chuàng)始人和主要維護者,PerfXLab澎峰科技創(chuàng)始人。曾獲2016年中國計算機學(xué)會科技進步二等獎。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

張先軼師從張云泉教授,在中科院取得高性能計算博士學(xué)位。讀博期間,基于GotoBLAS的原有基礎(chǔ),他創(chuàng)建了開源矩陣計算庫OpenBLAS,領(lǐng)導(dǎo)團隊不斷進行修補和維護,目前在矩陣計算的細分領(lǐng)域,成為影響力較大的開源項目。

他在MIT萌生創(chuàng)業(yè)想法,歸國之后,針對“深度學(xué)習(xí)”,創(chuàng)辦PerfXLab澎峰科技,為計算機視覺、語音識別等公司提供一體化性能優(yōu)化方案。雷鋒網(wǎng)【新智造】頻道此前曾采訪并報道了PerfXLab澎峰科技。

課程內(nèi)容

OpenBLAS項目介紹

矩陣乘法優(yōu)化算法

一步步調(diào)優(yōu)實現(xiàn)

以下為公開課完整視頻,共64分鐘:

以下為公開課內(nèi)容的文字及 PPT 整理。

雷鋒網(wǎng)的朋友們大家好,我是張先軼,今天主要介紹一下我們的開源矩陣計算庫OpenBLAS以及矩陣乘法的優(yōu)化。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

首先,什么是BLAS?

BLAS是 Basic Linear Algebra Subprograms (基本線性代數(shù)子程序)的首字母縮寫,主要用來做基礎(chǔ)的矩陣計算,或者是向量計算。它分為三級:

  • BLAS 1級,主要做向量與向量間的dot或乘加運算,對應(yīng)元素的計算;

  • BLAS 2級,主要做矩陣和向量,就類似PPT中藍色部分所示,矩陣A*向量x, 得到一個向量y。除此之外,可能還會有對稱的矩陣變形;

  • BLAS 3級,主要是矩陣和矩陣的計算,最典型的是A矩陣*B矩陣,得到一個C矩陣。由矩陣的寬、高,得到一個m*n的C矩陣。

為什么BLAS是一個非常重要的庫或者接口,是因為它是很多科學(xué)計算的核心之一。每年做超級計算機的排行榜,都要做LINPACK測試,該測試很多部分就是做BLAS 3級矩陣和矩陣的計算。此外,還有很多科學(xué)和工程的模擬,在轉(zhuǎn)換后都變成了一種矩陣上的操作。如果你把矩陣優(yōu)化的特別好的話,對整個應(yīng)用的提升,都是非常有幫助的。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

BLAS與 Deep Learning 的關(guān)系,深度學(xué)習(xí)這幾年火了之后,比如大家非常了解的Alexnet,如果做具體的性能劃分,PPT上的這張圖來源于某篇論文,cut down之后看每個部分花了多少時間,發(fā)現(xiàn)它大部分的時間花費在卷積層(Conv Layer),另外不少時間花在了全連接層(FC layer)。卷基層目前通用的實現(xiàn)是展成矩陣,變成矩陣與矩陣的乘法,就是BLAS 3級。而全連接層一般是變成一個矩陣和向量的乘法,也落成了BLAS操作。

也就是說,基于矩陣類學(xué)習(xí)的深度學(xué)習(xí),有90%或者更多的時間是通過BLAS來操作的。當(dāng)然,隨著新的算法出現(xiàn),卷積層對3*3的卷積核有專門的算法,或者用FFT類類算法也可以做,但是在通用上,展矩陣來做也非常廣泛。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

目前,BLAS只是一個定義了的實現(xiàn)接口,但是具體的實現(xiàn)其實有很多種。從商業(yè)的角度來講,存在很多商業(yè)版本,比如說 Intel、AMD、NVIDIA、IBM公司等,基本上為了搭配自己的硬件,對其做了更優(yōu)的優(yōu)化,出了商業(yè)版本。

針對開源的而言,有如下幾種,之前比較知名的是GoToBLAS,和OpenBLAS有很深的淵源,但是在2010年終止開發(fā)了,有時間在給大家分析其背后的原因,主力的開發(fā)人員后藤,離開了UT Austin的研究組,進入了公司,就終止了開發(fā)。ATLAS是美國一個學(xué)校做的,OpenBLAS是我們基于GotoBLAS做的,BLIS是后藤走了之后,基于GotoBLAS擴展出來的一個項目,目前還處在相對早期的階段,成熟度還差一些。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

OpenBLAS歷史已經(jīng)有幾年了,從2011年初開始進入,最初的原因是GotoBLAS放棄了,我們重新fork了一個社區(qū)發(fā)行版,繼續(xù)開發(fā)和維護,它的維護不是一個簡單修BUG的過程,如果想要獲得比較好的性能,需要不停跟著硬件走,比如說新出一種新的硬件架構(gòu),或者適配更廣的硬件架構(gòu),都要進行一定的優(yōu)化,來獲得比較好的加速效果。OpenBLAS算是目前全球最好的開源矩陣計算庫,在去年的時候得到了中國計算機學(xué)會科技進步二等獎,同時也進入了很多主流的Linux安裝包,比如說Ubuntu里面就有我們的OpenBLAS Package,你能想到的Linux發(fā)行版幾乎都進去了,但這不是我們主動去做的。還有一個OpenHPC的套件,也是最近做高性能計算的一個源。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

目前OpenBLAS的進展是,支持幾乎全部的主流CPU處理器,同時都能達到比較好的優(yōu)化性能。從操作系統(tǒng)來說,基本上常見主流的OS都支持。整體上,從適配的處理器范圍和支持的操作系統(tǒng),在開源庫中算是最廣的實現(xiàn)。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

因此,OpenBLAS的用戶也是比較多的。比如有開源項目Julia語言、GNU octave等;深度學(xué)習(xí)方面有大家熟悉的mxnet、Caffe都可以選OpenBLAS,作為CPU端的計算backend; IBM公司、ARM公司也都在他們的產(chǎn)品里邊使用了OpenBLAS,NVIDIA公司在做一些跟CPU的對比測試時,把OpenBLAS列為了一個基準。其他還有一些做編譯器的以色列創(chuàng)業(yè)公司,還有國內(nèi)的一些互聯(lián)網(wǎng)公司,比如搜狗。前段時間還和搜狗公司的人聊過,我們的庫在線上已經(jīng)穩(wěn)定運行一年多以上的時間,所以說它的工程質(zhì)量上還是還是可以的。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

IBM前段時間,因為深度學(xué)習(xí)非常火,做了一個Power AI的軟件框架,可以看到,最上面一層是一些開源的框架,底層的計算中就有我們的OpenBLAS。當(dāng)然是為了搭載他的服務(wù)器。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

簡要的看一下性能,BLAS庫的性能是越高越好。在Intel的 Sandy Bridge平臺上,相比MKL的性能,基本上是重合在一起的,達到了一個相當(dāng)?shù)男阅堋?/p>

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

這張圖展示了在龍芯上做的一個結(jié)果,測得比較全,整體的BLAS多線程的,性能全測試了,性能比較高的都是我們,提高了一倍到兩倍。這是因為我們針對龍芯3A做了優(yōu)化,所以取得了非常好的效果。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

剛才主要介紹了OpenBLAS的性能和效果,我們在GitHub上做了托管,歡迎對矩陣乘法或優(yōu)化感興趣的同學(xué)能加入進來,貢獻代碼,我們公司愿意拿出一筆錢來支持這個項目繼續(xù)往前走。接下來會開始一些技術(shù)類的干貨,主要講一下大家對優(yōu)化比較感興趣的部分,我參考了矩陣乘法的這幾篇教程,UT Austin Flame組做的教程。我把他的內(nèi)容基本上是摳出來了,一步步帶著大家過一下,如果我們從最簡單的矩陣乘法實現(xiàn),到一個高性能的矩陣乘法實現(xiàn),大概是幾步,怎么來的?或者是為什么優(yōu)化,每一步能獲得多少性能收益。這樣大家對于一些優(yōu)化的其他程序,希望能提供一些幫助。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

我們首先看一下基本實現(xiàn)。

我想只要學(xué)過《線性代數(shù)》之類的,這種矩陣乘法,是一個非常簡單的問題,如果轉(zhuǎn)換成C代碼來做的話,就是一個三重循環(huán),我在這張圖里列出了一個【i j k】的三重循環(huán),這里面矩陣乘法的代碼就已經(jīng)是,它實現(xiàn)的功能就是矩陣A*矩陣B,加到矩陣C里面,C是結(jié)果矩陣,這里面C的代碼,和在課本上看到的累加的公式是一樣的。找到i行,對應(yīng)這個位置的結(jié)果C,把i行的每個元素,都取出來乘以B列,對應(yīng)的乘,然后加起來就可以得到這個結(jié)果。但是這種實現(xiàn),如果你放到現(xiàn)在的處理器上跑性能的話,和優(yōu)化后的BLAS庫的實現(xiàn),性能會差很多倍,甚至?xí)?0倍。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

為什么呢,我們就做了一下最后的性能測試

這張圖也是截自教程里,代表了一個性能圖,越高越好。這里的測試平臺是Intel core i5 ,只是測了單線程,沒管多線程的事情。這種初始實現(xiàn)可能是1 GFlop/s。隨著規(guī)模變大,矩陣的性能在下降是為什么呢?因為在實現(xiàn)的過程中,沒有考慮到cache的原因,當(dāng)矩陣比較小的時候,速度還能快一些,當(dāng)矩陣大了的時候,一定會跌下去,所以圖里就有一個下滑的過程。

這個是非常原始、基礎(chǔ)的實現(xiàn)。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

再往上走一步,怎么樣才能再稍微優(yōu)化一下。我們需要把矩陣的乘法順序調(diào)一下,我們在這里做了一個小的分塊,把p單獨提到了一個函數(shù)里,以點乘的形式寫出來,每次做一個1*4的結(jié)果,單獨提出來變成一個函數(shù)。p的這一步,要把計算順序稍微換一下,把i放到里面,j放到外面,這塊背景為什么要換一下,實際上是因為我們假設(shè)矩陣在存儲的時候是以列優(yōu)先存儲的,在列項的數(shù)值是連續(xù)存儲,行之間是有間隔的,這對于仿存更有優(yōu)勢。變成這樣的實現(xiàn)之后,對整體的性能其實沒什么幫助,那為什么換成這種形式來寫呢,是為了之后的優(yōu)化,留下一定的空間。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

當(dāng)矩陣比較小,在cache里面的時候,性能基本是沒什么變化的,但是超過cache的時候,它的性能稍微好了一點,從剛才非常低的值,也達到了接近1GFlop/s主要的原因是對A(0,p)做了一定的復(fù)用,它省了一些cache。另外一方面,它本身在做循環(huán)的利用來說,相當(dāng)于比這部分做了一定循環(huán)的展開,所以在效率上得到了一定的提升。

這塊的復(fù)用,只從內(nèi)存讀取一次,所以對超過cache的情況有了一定改善。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

在這個基礎(chǔ)上,我們就需要看一下有什么更好的方法來做優(yōu)化。我們的基準就是,AddDot1*4的基準上怎么做,我們想到第一點做的是,我們可不可以用寄存器變量來做,而不是操作內(nèi)存。我可以申請一堆C 00,01這樣的寄存器變量,在C語言中是register double,還有矩陣A的部分,也用寄存器變量。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

剩下的操作都是一些寄存器的變量,當(dāng)然B還是之前的方式,最后再寫回C里面。它完成的流程基本跟與之前的實習(xí)一樣,只是我們引入了寄存器變量,讓更多的數(shù)據(jù)保存到寄存器里,而不是放到cache緩存里,來減輕cache的壓力,這也能獲得一部分性能的提升。

可以看到,紅色的線是我們優(yōu)化后的性能,達到了2GFlop/s,藍色的線是之前的性能,這里做的優(yōu)化就是利用寄存器降低cache的消耗,取得了50%左右的性能提升。完成了這一步之后,我們還可以再怎么樣做優(yōu)化呢?

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

我們剛才在A、C的部分,已經(jīng)用寄存器做了替換,那么B仿存這部分,我們有沒有可能也做一些優(yōu)化。在之前實現(xiàn)的時候,B部分每次的坐標計算都需要算出來,B訪問每個位置都要算一次,這樣就引入了額外的開銷,其實是可以避免的。

我們使用指針的方式,一開始先把對應(yīng)的指針位置指好,每次計算的時候只要指針連續(xù)移動就好,而不是每次讀一個位置重新算一遍,這樣速度就會快一些。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

我們看一下,做完這個小優(yōu)化之后,降低了B index的消耗之后,從剛才的2G F…達到了4G的性能。這塊的改善對于小矩陣有效果,大矩陣全都超出了cache范圍,就不會有效果的。所以假設(shè)矩陣都在cache里面,這塊也獲得了不小的性能提升。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

當(dāng)你完成這一部分的時候,你可以想,我把A矩陣做了寄存器替換,B矩陣通過index改進,我們下一步還能怎么做?

其實就是一個比較常用的方式,做展開。

在最里層循環(huán),是不是可以展開成4次,在做這個的時候,我們可以降低整個循環(huán)這部分的開銷,而且讓它流水的情況更好。OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

這部分也會對性能有一些改善。這張圖比較的當(dāng)初在中間階段的時候比起開始階段,得到了多少提升。通過使用寄存器變量,使用了指針,在做了一定的底層循環(huán)展開之后,達到了紅色線的性能,已經(jīng)比藍色線有了明顯的提升,但是這個還不算完,只是一個基礎(chǔ)。但是在1*4的層面,已經(jīng)沒什么油水可挖了,所以我們需要在更上層找一些方法。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

在1*4的時候,A的值產(chǎn)生了一些重用,但是如果塊再放大一點,比如說變成4*4時,也就是說每次計算的時候算的是一個方塊,而不是列。這個對于整個的優(yōu)化來說,可以復(fù)用你的訪存,而且能夠更充分的發(fā)揮計算能力。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

當(dāng)我們變成小的這種4*4的方塊時,AddDot函數(shù)也要寫成這個模式。當(dāng)然,這部分也要用剛才做過的那些1*4的方法,A這邊之前是1個值,現(xiàn)在是4個值,用寄存器的變量,C部分已經(jīng)是4*4共有16個,也全都是寄存器變量,B的部分全部用指針來優(yōu)化。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

但這樣做的話,對于整體的性能提升是比較有限的。因為這只是一個初始的結(jié)果,可以看到,對于小矩陣,在cache范圍內(nèi),沒有什么起色。但是超過cache后,對于大規(guī)模的矩陣,是有了一定性能提升。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

在以4*4的結(jié)果優(yōu)化基礎(chǔ)上,我們可以再做進一步的優(yōu)化和開發(fā)。為什么要轉(zhuǎn)換成4*4的優(yōu)化,是因為我們現(xiàn)在CPU的處理器,基本上想獲得高的性能,必須要用向量化指令,不管是老的SSE2,AVX或者AVX 2.0等,對于CPU的優(yōu)化,如果想達到高性能,必須要用到單指令多數(shù)據(jù)的向量化指令。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

做了4*4的分塊之后,在這種情況下,會更有利于向量指令。在這里以向量指令重寫了這部分循環(huán)的內(nèi)容,當(dāng)然這部分指令我沒有任何的內(nèi)嵌匯編或者純匯編的操作,我就直接用了Intel Intrinsic的形式來寫,可以看到這部分寫的就是一個128位的sse,這是做一個雙精度浮點double的一個矩陣,數(shù)據(jù)都是double的,從A里把這兩個值load進來。后兩個load進這個向量寄存器里,B部分每次都要用load復(fù)制的這種指令load進去,剩下的這塊基本都是用向量的Intrinsic的變量來做了操作,在這塊跟之前看起來差不多,所以在編譯的時候都變成了向量化的指令。這兩行就算前部分C的值,這部分就算后部分C的值。

通過這種向量寄存器的指令使用后,他的性能提升非常明顯,從剛才4G可以達到超過6G ,而且這一部分是一個整體的變化,cache內(nèi)向量加速效果是非常明顯的,基本上是翻了一倍。

下一步需要解決的是這個cache的問題,問題是沒有做大的分塊,超過cache大小之后性能就會下滑,要解決這個問題的話,需要在更上一層做Blocking。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

轉(zhuǎn)換成代碼的話,在這一層做一個K的切分,下面一層做一個m的切分,至于kc和mc都是參數(shù)。這些參數(shù)都是可調(diào)的,都要根據(jù)L2 cache的大小進行調(diào)整,然后每次做的是一個小塊c的矩陣乘,相當(dāng)于一個子問題,這個子問題的實現(xiàn)基本和剛才4*4的實現(xiàn)是一樣的。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

這一部分blocking做完的性能如圖所示,藍色的線是沒有做Blocking的性能,紅色線是做過之后。當(dāng)問題規(guī)模在cache內(nèi),它的性能改善基本比較小,但是當(dāng)大規(guī)模的矩陣,通過做了這次Blocking之后,可以看到獲得了非常明顯的提升,變快了2倍。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

對于大矩陣,為了充分的利用cache,讓子問題變小,提升它的數(shù)據(jù)局部性,在做其他問題優(yōu)化的時候也很有必要的。下一步當(dāng)我們做到blocking的時候,如果只是代碼級別變化的時候,基本已經(jīng)做完了。

此后再進一步優(yōu)化的點,引入引入一些操作。當(dāng)我們分析程序存在的性能瓶頸,對于A的訪存和B的訪存是比較慢,很多訪存在矩陣中是不連續(xù)的,所以訪存性能就差了很多,一方面不能利用cache,一方面在TLB上也有影響,當(dāng)然C部分也有一些影響,C矩陣往往很大,沒有辦法做packing,只能對A和B來做,packing的意思是說,我在這里有一部分連續(xù)的內(nèi)存空間,m*k,對應(yīng)前面的mc和kc,在這塊內(nèi)存空間,在每次做計算之前,我把所需要用到的A的矩陣,從原始矩陣讀取出來,存放到連續(xù)的一塊內(nèi)存空間里。 Packed Matrix A這個函數(shù)的具體實現(xiàn)非常簡單,基本上就是從對應(yīng)的位置取出來,放在連續(xù)的內(nèi)存地址就結(jié)束。

為什么會做這步操作呢?這步操作的意義在于,通過pack之后,下一步AddDot4*4里讀的元素就不是從A矩陣讀,而是從pack后緩存區(qū)的位置讀。一個好處是,A矩陣已經(jīng)預(yù)熱,放進CPU的cache里了;第二個好處是,你可以看到我在存儲的時候,這種連續(xù)性的存儲,讀的時候也是連續(xù)性讀取,效率會非常高,cache效率也非常高。加上通過pack這一步,對于性能的改善,是非常明顯的。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

這張圖是上一步的操作,做了packing之后,除了極小矩陣規(guī)模沒什么效果,或者引入了額外開銷,效果還變差之外,絕大部分的性能提升是非常明顯的,有50%以上,達到了9GFlop/s。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

對于矩陣乘法實現(xiàn)的話,packing矩陣是一個非常重要的優(yōu)化方式。再往后大家會想,對于A來說做了Packing,對于B是不是也能做Packing,同樣道理也是可以的,就是把它拷貝到一個連續(xù)空間。B部分的Packing操作和A部分類似,也是把它的數(shù)據(jù)從原始矩陣里讀出來,然后放到一個連續(xù)空間里,使它的內(nèi)存訪問做連續(xù)的訪存。當(dāng)然這部分,因為B訪存是個流式的訪存,所以在這部分的改進會稍微小一點,相比A只有大概10%左右的提升。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

對于矩陣乘法實現(xiàn)的話,packing矩陣是一個非常重要的優(yōu)化方式。再往后大家會想,對于A來說做了Packing,對于B是不是也能做Packing,同樣道理也是可以的,就是把它拷貝到一個連續(xù)空間。B部分的Packing操作和A部分類似,也是把它的數(shù)據(jù)從原始矩陣里讀出來,然后放到一個連續(xù)空間里,使它的內(nèi)存訪問做連續(xù)的訪存。當(dāng)然這部分,因為B訪存是個流式的訪存,所以在這部分的改進會稍微小一點,相比A只有大概10%左右的提升。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

當(dāng)你完成到這一步的時候,相比最開始三重循環(huán)的性能改進,你的矩陣乘法的性能已經(jīng)有很明顯的提升了。你如果想做的更好的話,內(nèi)部的核心可能不止要寫intrinsic的指令,還要寫內(nèi)嵌匯編,重排流水線,使硬件資源能夠發(fā)揮更多,可能還會提升10%。當(dāng)然這部分對實現(xiàn)BLAS比較重要,會摳的比較細。

我們再整體回顧一下矩陣乘法的算法,我把算法的這部分放到最后,從開始一步步實現(xiàn)之后,做到最后大家可能看的比較清楚一些。A矩陣*B矩陣得到C矩陣,對應(yīng)的是最外層的循環(huán),每一步往下的時候,其實都是在做分塊,做分塊的原因剛才有提到,就是為了配合硬件結(jié)構(gòu),因為memory、cache等都是分層的,它是越來越小的,做分塊實際上是提高了cache的各層的利用率。

今天就分享到這里,謝謝大家。

問答解答

問題1:什么是訪存優(yōu)化?

張先軼:訪存優(yōu)化解決的是處理器讀取數(shù)據(jù)的性能。從計算上來說,是相對好優(yōu)化的,但是優(yōu)化訪存會非常困難,稠密矩陣乘法的數(shù)據(jù)還是相對規(guī)整的,讀數(shù)據(jù)的順序是有規(guī)則的,更容易優(yōu)化一些。但是我們也做過很多稀疏矩陣的優(yōu)化,比如稀疏矩陣乘向量的優(yōu)化,這個對訪存來說更困難一些,因為沒有辦法預(yù)測到下一次訪存在什么位置,這造成了優(yōu)化的困難。

問題2:OpenBLAS和其他矩陣庫有什么關(guān)系?

張先軼:OpenBLAS和其他BLAS實現(xiàn)其實都是完成了接口,BLAS只是接口的定義,具體來說可以有多種實現(xiàn)。我們認為我們OpenBLAS在開源的實現(xiàn)是非常好的。如果是標準BLAS,有參考實現(xiàn),只是一個非常簡單的Fortran實現(xiàn),性能很差的,我們要比他們快很多。MKL是Intel公司自己做的BLAS,我們跟他們相當(dāng)。Engien我們沒有完全測過,它號稱自己做的很好,但是他們的做法在X86的平臺可能有些效果,但是對其他平臺的效果我表示懷疑。不過我沒有具體做對比測試,所以發(fā)言權(quán)不大。

問題3:從入門到精通需要多久?

張先軼:如果我指導(dǎo)的話,幾個月時間就可以上手做一些事情。歡迎大家。

問題4:比起高通的庫表現(xiàn)如何?

張先軼:說實話高通的庫沒有測過,我覺得它號稱比較快,是因為在32位的ARM上,我們OpenBLAS沒有做向量化優(yōu)化,高通的那個部分做了,所以它可能會比我們快一些,但是在我們公司內(nèi)部的PerfBLAS是優(yōu)化了的。

問題5:分塊的目的是什么?

張先軼:就是優(yōu)化訪存,通過分塊之后讓訪存都集中在一定區(qū)域,能夠提高了數(shù)據(jù)局部性,從而提高cache利用率,性能就會更好。

問題6:硬件不給力能玩神經(jīng)網(wǎng)絡(luò)么?

張先軼:我們給出的一個數(shù)據(jù)是,我們在ARM CortexA57的平臺上,4核1.7GHz,跑AlexNet模型,一張圖是150ms,這個速度還算比較快。另一方面我們還在做一些其他的模型,做了精簡優(yōu)化,再配合底層庫的優(yōu)化。在某個小模型下,在跑一張小圖片的inference只用了50ms。所以,在ARM的處理器上,還是可以做到實時本地化的神經(jīng)網(wǎng)絡(luò)inference。

問題7:內(nèi)部版本和開源版本差別大么?

張先軼:內(nèi)部版本是針對深度學(xué)習(xí)做了一些差異化處理,性能高的可能會到1倍多,這部分的優(yōu)化,一部分是矩陣的規(guī)模,和剛才講的做方陣不一樣,深度學(xué)習(xí)的矩陣大部分是中小型,某個維度會比較小,要用到的優(yōu)化策略,或者分塊策略會不一樣,甚至有時候特別小根本不用分塊或packing,直接做可能更好一些。


雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

OpenBLAS項目與矩陣乘法優(yōu)化 | AI 研習(xí)社

分享:
相關(guān)文章

編輯

雷鋒網(wǎng)北京編輯。關(guān)注人工智能,略雜。微信(yougo5654)可以找到我。
當(dāng)月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說