国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

CNN卷積計(jì)算在移動(dòng)GPU上的加速研究*

2018-01-26 02:46王湘新
關(guān)鍵詞:存儲器線程工作組

王湘新,時(shí) 洋,文 梅

(1.武警湖南省消防總隊(duì)信息中心,湖南 長沙 410205;2.國防科技大學(xué)計(jì)算機(jī)學(xué)院,湖南 長沙 410073)

1 引言

關(guān)于卷積神經(jīng)網(wǎng)絡(luò)CNN(Convolution Neural Network)的相關(guān)研究在過去幾十年中取得了很多的成果,CNN作為一種強(qiáng)有力的方法在圖像分類[1]、語音識別[2]以及目標(biāo)檢測[3]等相關(guān)領(lǐng)域中所取得的結(jié)果明顯優(yōu)于傳統(tǒng)方法。在圖像分類領(lǐng)域,CNN方法甚至已經(jīng)具有了擊敗人類的能力。微軟在ImageNet的數(shù)據(jù)集上使用CNN將分類錯(cuò)誤率降至3.57%[4],而人類自己眼睛分類的錯(cuò)誤率大約是5.1%。CNN應(yīng)用的不斷普及也使得研究人員開始嘗試在移動(dòng)設(shè)備上對其進(jìn)行使用。

從較高的層次來看,CNN的工作過程分為兩個(gè)階段。首先是利用大量數(shù)據(jù)讓網(wǎng)絡(luò)進(jìn)行學(xué)習(xí)的訓(xùn)練階段,接下來的前向階段則是利用網(wǎng)絡(luò)來進(jìn)行推斷工作。

對于移動(dòng)設(shè)備上的CNN應(yīng)用來說,往往只需要前向階段。CNN在移動(dòng)設(shè)備上得到普及的最大制約因素就是巨大的計(jì)算量。以圖像分類的前向過程為例,在常見的手機(jī)移動(dòng)設(shè)備上,一張圖像的分類結(jié)果就需要數(shù)秒的時(shí)間,這些時(shí)間主要被用來進(jìn)行CNN中的卷積計(jì)算。如何處理好復(fù)雜的卷積計(jì)算是CNN在移動(dòng)設(shè)備上取得實(shí)際應(yīng)用的關(guān)鍵。

Figure 1 Convert the convolution to matrix multiplication圖1 矩陣乘法計(jì)算卷積

本文提出了一種新的方法來處理CNN的卷積過程,以實(shí)現(xiàn)更好的性能。我們的基礎(chǔ)是MXNet[5]所提供的在手機(jī)CPU上的CNN基礎(chǔ)實(shí)現(xiàn)[6]。我們注意到,手機(jī)上的圖形處理單元GPU(Graphics Processing Unit)相對于CPU來說,計(jì)算性能更為強(qiáng)大。因此,本文利用OpenCL(Open Computing Language)[7]將卷積計(jì)算轉(zhuǎn)化為并行度更高的矩陣乘法運(yùn)算,并將其轉(zhuǎn)移到GPU端來進(jìn)行。之后,本文又采用了諸如優(yōu)化任務(wù)分配、利用片上存儲、向量化和循環(huán)展開等操作來進(jìn)行優(yōu)化,最終,卷積過程取得了16.39倍的加速比,前向分類過程取得了2.1的加速比。

2 背景與相關(guān)研究介紹

2.1 卷積層實(shí)現(xiàn)方式

雖然各種各樣的CNN具有不同的網(wǎng)絡(luò)結(jié)構(gòu),但是它們都是由卷積層、池化層等網(wǎng)絡(luò)層連接組成。在這些網(wǎng)絡(luò)層中,CNN絕大部分的計(jì)算量都集中在卷積層。卷積層通過將卷積核在圖像數(shù)據(jù)上滑動(dòng)計(jì)算,來提取圖像中的高維特征。在CNN的具體實(shí)現(xiàn)中,對于卷積計(jì)算有兩種主流實(shí)現(xiàn)方法:一是按照卷積定義來進(jìn)行計(jì)算。這種方法的優(yōu)點(diǎn)是原理簡潔,缺點(diǎn)則是計(jì)算訪存混亂,容易觸發(fā)內(nèi)存速度瓶頸。另一種方式則是將計(jì)算過程轉(zhuǎn)化為矩陣相乘來實(shí)現(xiàn),優(yōu)點(diǎn)是訪存更加規(guī)整,可以利用已有的數(shù)學(xué)運(yùn)算庫,缺點(diǎn)則是增加內(nèi)存消耗。

在本文的卷積加速實(shí)現(xiàn)中,考慮到移動(dòng)GPU的功能特點(diǎn),我們采用的是第二種矩陣乘的方法,可以更加充分地利用GPU的并行計(jì)算性能,同時(shí)有更多的優(yōu)化空間。具體的轉(zhuǎn)化過程在Kumar的論文[8]中有詳細(xì)的介紹,示例過程如圖1所示。原理就是將圖像數(shù)據(jù)以及卷積核數(shù)據(jù)進(jìn)行復(fù)制重排,構(gòu)造兩個(gè)大矩陣,通過這兩個(gè)大矩陣的相乘來得到卷積計(jì)算的最終結(jié)果。

2.2 移動(dòng)GPU與OpenCL

圖形處理單元(GPU)[9]首先應(yīng)用在計(jì)算機(jī)圖形應(yīng)用程序比如游戲之中,后來,人們又利用它的多核架構(gòu)來進(jìn)行通用并行計(jì)算。不同于人們在桌面GPU上長達(dá)幾十年的嘗試與研究,在移動(dòng)GPU這一領(lǐng)域,直到最近幾年才有人開始嘗試開發(fā)。得益于類似OpenCL這樣的編程框架的興起,我們才可以方便地使用移動(dòng)GPU進(jìn)行通用編程。

OpenCL是一個(gè)開放的、無版權(quán)的跨平臺并行編程標(biāo)準(zhǔn),它提供了一個(gè)標(biāo)準(zhǔn)接口來給程序員進(jìn)行編程。由制造計(jì)算設(shè)備的硬件廠商來實(shí)現(xiàn)這個(gè)接口并將其具體實(shí)現(xiàn)封裝在設(shè)備之中。在OpenCL中,主機(jī)處理器(通常是CPU)管理OpenCL的運(yùn)行環(huán)境上下文以及計(jì)算設(shè)備,程序員需要進(jìn)行選擇來將計(jì)算密集的任務(wù)編程成為一個(gè)kernel文件,然后選擇一個(gè)計(jì)算設(shè)備來執(zhí)行這個(gè)任務(wù)。在一個(gè)計(jì)算設(shè)備中,可以劃分為許多的工作組,而每個(gè)工作組又可以劃分為許多的計(jì)算單元。每個(gè)計(jì)算單元都會獨(dú)立地執(zhí)行編寫的kernel程序。

一個(gè)典型的移動(dòng)GPU是由數(shù)個(gè)計(jì)算單元組成的,在每個(gè)單元內(nèi)有數(shù)個(gè)算術(shù)邏輯單元ALU(Arithmetic Logic Unit)。這里我們以高通公司生產(chǎn)的Adreno 330 GPU[10]為例:這款移動(dòng)GPU具有4個(gè)計(jì)算單元和總計(jì)128個(gè)ALU,在每個(gè)計(jì)算單元中有16線程可以并行。與桌面GPU不同,移動(dòng)GPU的存儲器與CPU芯片共享相同的內(nèi)存,但是每個(gè)計(jì)算單元具有不能由其他計(jì)算單元使用的本地存儲器。之前很少有人研究如何利用移動(dòng)GPU來加速應(yīng)用。龔若皓[11]在移動(dòng)GPU平臺上進(jìn)行了關(guān)于加速靜態(tài)、動(dòng)態(tài)圖像解碼算法的嘗試,取得了4倍的加速比;曾寶國[12]借助移動(dòng)GPU給離散傅里葉變換的高效實(shí)現(xiàn)提供了一種新的思路,可以大大提高信號處理的實(shí)時(shí)性。對于移動(dòng)GPU利用的探索,還是一個(gè)很新的研究課題,具有一定的研究意義。

3 實(shí)現(xiàn)與優(yōu)化

3.1 卷積神經(jīng)網(wǎng)絡(luò)(CNN)

在MXNet框架中,卷積計(jì)算是通過矩陣乘法來實(shí)現(xiàn)的。其中,矩陣A表示輸入圖像數(shù)據(jù),矩陣B是卷積內(nèi)核,矩陣C存儲計(jì)算的結(jié)果。這里設(shè)A具有M行和K列,B具有K行和N列,C具有M行和N列。在卷積計(jì)算過程中,三個(gè)矩陣均使用列主序來進(jìn)行存儲。在矩陣乘法的實(shí)現(xiàn)方式上,MXNet選擇的是OpenBLAS[13]數(shù)學(xué)運(yùn)算庫中的SGEMM函數(shù)。

本文目標(biāo)是在移動(dòng)設(shè)備上利用GPU的并行計(jì)算能力來對卷積層進(jìn)行加速實(shí)現(xiàn)。為此,本文首先利用OpenCL編程框架在移動(dòng)GPU上實(shí)現(xiàn)了矩陣乘法的多重循環(huán)樸素算法。這里設(shè)定局部大小為{1,1}和全局大小為{M,N},在此條件下,我們有M*N個(gè)工作線程,每個(gè)工作組包含一個(gè)線程,每個(gè)線程計(jì)算C的一個(gè)元素,這是我們的基本內(nèi)核。接下來,本文將討論一些優(yōu)化手段來提升程序性能。

3.2 優(yōu)化方法

在討論具體的優(yōu)化策略之前,我們需要對矩陣的數(shù)據(jù)存儲結(jié)構(gòu)進(jìn)行調(diào)整。首先,由于GPU的結(jié)構(gòu)決定了它在處理ALU運(yùn)算時(shí)速度快,處理?xiàng)l件分支時(shí)卻相當(dāng)緩慢,我們將歸一化矩陣規(guī)模,以減少由于矩陣尺寸所引起的條件分支數(shù)量。在這里,我們用零填充矩陣使之行列數(shù)都是32的倍數(shù)。

第二,我們需要恢復(fù)矩陣A為行主序存儲而不是列主序存儲。在矩陣乘法計(jì)算中,計(jì)算C中的一個(gè)元素,需要A的一整行和B的一整列。如3.1節(jié)所述,初始矩陣被存儲在列主序中。換句話說,在B的某一列中的元素可以被連續(xù)地訪問,但A某一行中的元素則不能。所以,這種調(diào)整有助于提升矩陣乘法中對內(nèi)存的訪問連續(xù)性。接下來,我們重點(diǎn)介紹兩種加速GPU上卷積實(shí)現(xiàn)的方法。

3.2.1 優(yōu)化任務(wù)劃分并使用局部存儲

在本文所使用的Adreno 330 GPU中有4個(gè)計(jì)算單元,而且每一個(gè)計(jì)算單元中都有32個(gè)ALU,并支持16個(gè)線程同時(shí)運(yùn)行。因此,前文中的樸素內(nèi)核對于GPU的計(jì)算能力利用并不充分。當(dāng)某一工作組被裝載到GPU某個(gè)計(jì)算單元時(shí),這個(gè)工作組中僅有一個(gè)線程運(yùn)行,并且這個(gè)線程只負(fù)責(zé)計(jì)算C中的一個(gè)元素。這種計(jì)算模式下的線程劃分會造成線程數(shù)目以及空閑ALU單元過多的問題。為了提升GPU的利用率,本文采取分塊矩陣乘的方法來優(yōu)化線程任務(wù)劃分。

該方法的示意圖如圖2所示,為了計(jì)算矩陣C的一個(gè)子塊,需要矩陣A相應(yīng)的行和矩陣B相應(yīng)的列?,F(xiàn)在,如果我們利用分塊(記為Asub和Bsub以及Csub)來劃分A和B,我們可以通過反復(fù)計(jì)算Asub與Bsub的乘積進(jìn)行累加來得到Csub的值。

Figure 2 Principe of block matrix multiplication圖2 矩陣乘分塊算法原理

經(jīng)過對于矩陣分塊規(guī)模的測試,本文最終選擇局部大小為{1,32}以及全局大小為{M/32,N}。這意味著現(xiàn)在每32個(gè)線程將組成一個(gè)工作組,總計(jì)擁有M*N/1024工作組。工作組中的每個(gè)線程將計(jì)算包含32個(gè)元素的一列。矩陣子塊中的每一列數(shù)據(jù)將由工作組中的一個(gè)線程負(fù)責(zé)計(jì)算。通過矩陣分塊,本文可以解決之前內(nèi)核所造成的線程數(shù)量過多的問題。

在目前卷積計(jì)算的加速實(shí)現(xiàn)中,每當(dāng)需要矩陣A、B的數(shù)據(jù)時(shí),都會從全局內(nèi)存中進(jìn)行讀取。頻繁的全局內(nèi)存訪問會造成程序執(zhí)行緩慢。值得注意的是,在移動(dòng)GPU中,每個(gè)計(jì)算單元具有一塊獨(dú)立的存儲空間,稱為本地存儲器,本地存儲器中的數(shù)據(jù)訪問速度高于全局存儲器,并且在本地存儲器中的數(shù)據(jù)可以在此工作組中的線程之間實(shí)現(xiàn)共享。因此,本文將利用本地存儲器來優(yōu)化程序的訪存速度。

在Adreno 330 GPU中本地存儲器塊的大小為8 192 KB,即可容納2 048個(gè)單精度浮點(diǎn)數(shù)。所以本文將分塊矩陣實(shí)現(xiàn)中A和B的兩個(gè)32 *32子塊(Asub與Bsub)迭代加載到本地存儲器,線程從本地的存儲器讀取數(shù)據(jù),而不是從全局存儲器來讀取計(jì)算的數(shù)據(jù)。通過這種訪存優(yōu)化,在本地存儲器中的每個(gè)元素將被用于工作組中的32個(gè)線程。也就是說,本文成功地將程序全局內(nèi)存訪問量減少到只有原來的1/32。

3.2.2 循環(huán)展開與向量化

在這一小節(jié)里,將討論兩種可以加速程序循環(huán)體執(zhí)行的方法:循環(huán)展開以及向量化。

循環(huán)展開是一種循環(huán)變換技術(shù),可以加快整個(gè)循環(huán)執(zhí)行的速度,其代價(jià)則是代碼二進(jìn)制文件的大小增加。由于GPU對于條件分支的執(zhí)行很慢,而循環(huán)展開則會減少甚至消除分支的數(shù)量,所以循環(huán)展開技術(shù)在GPU上將帶來性能上的提升。而另一方面,更大的循環(huán)體會給編譯器提供更多優(yōu)化的機(jī)會。值得一提的是,并不是越大的循環(huán)體就會取得越好的性能,這里面還有一個(gè)高速緩存交換的因素也要考慮。在本文中,經(jīng)過對性能以及代碼文件大小的綜合考量,我們選擇以8為距離進(jìn)行循環(huán)展開。

現(xiàn)在在我們的內(nèi)核中,所操作的數(shù)據(jù)類型為4個(gè)字節(jié)的單浮點(diǎn)類型。本文提出對于循環(huán)執(zhí)行進(jìn)行向量化操作,增加對訪存部件寬度的利用率。在Adreno 330的硬件層次不支持向量運(yùn)算(如向量乘或向量加),但他們確實(shí)有專為全局和本地存儲器特殊設(shè)計(jì)的更寬的讀取和存儲指令。這將使我們得到更快的速度,因?yàn)楦鼘挼臄?shù)據(jù)類型減少了加載/存儲指令的數(shù)目。OpenCL還支持簡單的向量數(shù)據(jù)類型,這使得我們也不必將矩陣轉(zhuǎn)換成向量類型就可以享受到向量化帶來的收益。

經(jīng)過對于float4、float8以及float16三種向量寬度的測試,本文選擇了表現(xiàn)最好的float4向量來進(jìn)行向量化。圖3顯示了我們?nèi)绾卫眠@些優(yōu)化來從存儲器加載數(shù)據(jù)。

4 實(shí)驗(yàn)結(jié)果

本文中所涉及的實(shí)驗(yàn)在小米note[14]上完成。這款手機(jī)使用的是高通801處理器,在這個(gè)處理器上集成了一顆Adreno 330的GPU,其單精度32位浮點(diǎn)計(jì)算峰值為84.6 GFlops/s,訪存速度為2.84 GB/s。

本文首先使用AlexNet[1]來測試卷積實(shí)現(xiàn)中矩陣乘法使用不同內(nèi)核的執(zhí)行時(shí)間,以檢驗(yàn)本文GPU實(shí)現(xiàn)以及優(yōu)化手段的加速效果。結(jié)果展示如圖4所示。從實(shí)驗(yàn)結(jié)果可以看到,利用GPU比使用CPU獲得了明顯的加速效果。對于移動(dòng)GPU,帶寬是非常緊缺的資源,所以優(yōu)化策略應(yīng)著眼于內(nèi)存訪問。我們使用本地存儲器后速度提升了3倍;使用向量加載/存儲指令將性能提升了1.25倍;而循環(huán)展開又將性能提升了1.16倍。對于最終的卷積內(nèi)核,程序訪存速度為2.24 GB/s,達(dá)到了GPU訪存峰值的79.9%,對GPU進(jìn)行了比較充分的利用。圖5是手機(jī)上運(yùn)行我們應(yīng)用程序的一個(gè)屏幕截圖,可以看到圖像經(jīng)過CNN網(wǎng)絡(luò)被正確分類(文本框中是分類的結(jié)果)。

Figure 4 Comparison of the speed of matrix multiplication圖4 矩陣乘法速度比較

Figure 5 Screen capture of the App圖5 程序運(yùn)行截圖

盡管使用移動(dòng)GPU來進(jìn)行卷積計(jì)算會帶來額外的開銷,比如說數(shù)據(jù)的重新組織以及傳輸?shù)?,但是對于整體前向過程的測試結(jié)果顯示,在整體時(shí)間上,本文的實(shí)現(xiàn)也取得了很好的加速效果。在此本文選取了不同的三種CNN網(wǎng)絡(luò)來測試GPU實(shí)現(xiàn)在整體前向過程上的加速效果以及加速穩(wěn)定性:AlexNet、Inception-Full Net以及Inception-Sub Net。AlexNet是首個(gè)在圖像分類領(lǐng)域擊敗傳統(tǒng)方法的CNN網(wǎng)絡(luò);Inception Net是由Szegedy[15]提出的一個(gè)比AlexNet更加復(fù)雜精確的網(wǎng)絡(luò),計(jì)算量也更大;這個(gè)網(wǎng)絡(luò)有一個(gè)簡化的、應(yīng)用更加廣泛的版本為Inception-sub。前向整體時(shí)間的測試結(jié)果顯示在表1中。

Table 1 Forward time of different networks

可以看到,對于不同結(jié)構(gòu)的CNN網(wǎng)絡(luò),本文的卷積實(shí)現(xiàn)都能取得大約2.1倍的前向過程加速比,因此程序?qū)τ诓煌木W(wǎng)絡(luò)結(jié)構(gòu)具有穩(wěn)定性。

5 結(jié)束語

針對CNN網(wǎng)絡(luò)中卷積計(jì)算負(fù)載較大的問題,本文在移動(dòng)GPU上采取矩陣乘方法對卷積算法進(jìn)行了實(shí)現(xiàn)。同時(shí),通過探索利用優(yōu)化任務(wù)劃分、局部存儲單元、向量化以及循環(huán)展開等技術(shù)來加速程序的執(zhí)行速度。優(yōu)化之后,矩陣乘法的執(zhí)行速度由CPU版本的0.44 Gflops提升了16.39倍,達(dá)到了7.21 Gflops;同時(shí)實(shí)驗(yàn)結(jié)果還表明,本文的優(yōu)化實(shí)現(xiàn)可以將整體前向的時(shí)間減少到只有原來的一半。

一個(gè)可以繼續(xù)研究的問題依然是關(guān)于處理時(shí)間的。今后的工作重點(diǎn)將是利用CPU和GPU協(xié)同工作,以得到更快的速度。

[1] Krizhevsky A,Sutskever I,Hinton G E.Imagenet classification with deep convolutional neural networks[C]∥Proc of International Conference on Advances in Neural Information Processing Systems, 2012: 1097-1105.

[2] Abdel-Hamid O, Mohamed A,Jiang H,et al.Applying convolutional neural networks concepts to hybrid NN-HMM model for speech recognition[C]∥Proc of 2012 IEEE International Conference on Acoustics,Speech and Signal Processing (ICASSP),2012: 4277-4280.

[3] Chen Y N,Han C C,Wang C T,et al.The application of a convolution neural network on face and license plate detection[C]∥Proc of the 18th International Conference on Pattern Recognition,2006:552-555.

[4] He K,Zhang X,Ren S,et al.Deep residual learning for image recognition[C]∥Proc of 2016 IEEE Conference on Computer Vision and Pattern Recognition, 2016:1.

[5] Chen T,Li M,Li Y,et al.MXNet: A flexible and efficient machine learning library for heterogeneous distributed systems[J].arXiv preprint arXiv:1512.01274,2015.

[6] Leliana/WhatsThis[EB/OL].[2015-11-11].https:∥github.com/Leliana/WhatsThis.

[7] Munshi A. The openCL specification[EB/OL].[2016-03-10]. http:∥www.khronos.org/opencl.

[8] Chellapilla K,Puri S,Simard P.High performance convolutional neural networks for document processing[C]∥Proc of the 10th International Workshop on Frontiers in Handwriting Recognition,2006:1.

[9] Owens J D,Houston M,Luebke D,et al.GPU computing[J].Proceedings of the IEEE,2008,96(5): 879-899.

[10] Qualcomm Inc. Qualcomm Adreno GPU[EB/OL].[2013-01-11].https:∥www.qualcomm.com/news/onq/2013/01/11/inside-snapdragon-800-series-processors-new-adreno-330-gpu.

[11] Gong Ruo-hao.Image codec parallel optimization based on embedded mobile GPU[D].Chengdu:Southwest Jiaotong University,2015.(in Chinese)

[12] Zeng Bao-guo,Yang Bin,et al,Parallelization of DFT based on embedded mobile GPU[J].Microcontrolles & Embedded Systems,2016:16(1):12-15.(in Chinese)

[13] Zhang Xian-yi,Wang Qian,Saar W.OpenBLAS library[EB/OL].[2015-12-09].https:∥www.openblas.net.

[14] XiaoMi. XiaoMi note[EB/OL].[2015-01-15].https:∥www.mi.com/minote.

[15] Szegedy C,Liu W,Jia Y,et al.Going deeper with convolutions[J].arXiv preprint arXiv:1409.4842,2014.

附中文參考文獻(xiàn):

[11] 龔若皓. 基于嵌入式移動(dòng) GPU 的圖像編解碼并行優(yōu)化[D].成都:西南交通大學(xué),2015.

[12] 曾寶國,楊斌.基于嵌入式移動(dòng) GPU 的離散傅里葉變換并行優(yōu)化[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2016,16(1): 12-15.

猜你喜歡
存儲器線程工作組
靜態(tài)隨機(jī)存儲器在軌自檢算法
基于C#線程實(shí)驗(yàn)探究
肖幼率工作組赴戴家湖涵指導(dǎo)搶險(xiǎn)
基于國產(chǎn)化環(huán)境的線程池模型研究與實(shí)現(xiàn)
線程池調(diào)度對服務(wù)器性能影響的研究*
32個(gè)工作組印跡 >
任意2~k點(diǎn)存儲器結(jié)構(gòu)傅里葉處理器
存儲器——安格爾(墨西哥)▲
百項(xiàng)能效標(biāo)準(zhǔn)推進(jìn)工程聯(lián)合工作組會議在京召開
一種存儲器容錯(cuò)設(shè)計(jì)方法
彭州市| 瓦房店市| 亚东县| 大兴区| 拉孜县| 尼木县| 平塘县| 闸北区| 沙湾县| 宝丰县| 衡水市| 罗山县| 昭苏县| 神池县| 聊城市| 开鲁县| 陆川县| 沙雅县| 肥乡县| 安国市| 廊坊市| 台湾省| 泽库县| 靖远县| 永清县| 香格里拉县| 时尚| 云龙县| 随州市| 宁城县| 丽江市| 清丰县| 道真| 黄梅县| 太谷县| 邻水| 高平市| 巫山县| 佛坪县| 山西省| 泾源县|