邵靖凱,厲旭杰
(溫州大學(xué) 物理與電子信息工程學(xué)院,浙江 溫州 325035)
摘要:提出了基于CUDA的并行拉普拉斯金字塔算法。算法采用的并行拉普拉斯算法很好地解決了共享存儲器的bank沖突和全局存儲器的合并訪問的問題,為了最大化并行效率,計(jì)算了SM占用率,并通過公式進(jìn)行了論證。在GTX480平臺下,基于CUDA的并行拉普拉斯金字塔算法獲得了幾十倍的加速比。最后,將基于CUDA的并行拉普拉斯金字塔算法成功地應(yīng)用于圖像融合和增強(qiáng)圖片的細(xì)節(jié)處理,充分證明了并行拉普拉斯金字塔算法廣泛的有效性和必要性。
關(guān)鍵詞:CUDA;拉普拉斯金字塔;GPU;并行計(jì)算
0引言
拉普拉斯金字塔算法可以進(jìn)行多尺度的圖像分解,廣泛應(yīng)用于圖像分析[12]。PARIS S等人[3]用拉普拉斯金字塔算法實(shí)現(xiàn)了邊緣突出的圖像處理,但是算法的效率很低。因此又提出限制拉普拉斯分解的層數(shù)的算法,從而提高圖像處理的速度,但是圖像處理的效果有所下降。雖然拉普拉斯金字塔分解本身算法復(fù)雜度不高,但是因?yàn)閼?yīng)用中通常需要進(jìn)行很多層的拉普拉斯分解和重構(gòu),使得整個過程需要消耗大量的時間。因此提高拉普拉斯金字塔算法的速度顯得非常重要。祁艷杰[4]實(shí)現(xiàn)了基于FPGA的實(shí)時拉普拉斯金字塔。
本文研究了基于CUDA的拉普拉斯金字塔算法的實(shí)現(xiàn)。本算法采用并行拉普拉斯算法很好地解決了共享存儲器的bank沖突和全局存儲器的合并訪問的問題,而且最大化了并行效率,從而使性能得到了很大的提高。
1圖像金字塔
1.1高斯金字塔的構(gòu)建過程
設(shè)原圖像為G0,高斯金字塔的第L層的構(gòu)造方法如下:先將L-1層圖像GL-1和窗口函數(shù)w(m,n)進(jìn)行卷積,結(jié)果做隔行隔列的降采樣,即
GL(i,j)=∑2m=-2∑2n=-2w(m,n)GL-1(2i+m,2j+n) (1)
其中,(i,j)為像素索引,w(m,n)是5×5高斯核:
計(jì)算G0,G1,…,GN就構(gòu)成了高斯金字塔。
1.2拉普拉斯金字塔的構(gòu)建過程
將GL內(nèi)插放大,得到放大圖像G*L,使G*L的尺寸與GL-1的尺寸相同:
令LPL=GL-G*L+1,當(dāng)0≤L<N時
LPL=GL,當(dāng)L=N時,則LP0,LP1,…,LPN構(gòu)成了拉普拉斯金字塔。
2基于CUDA的拉普拉斯金字塔的并行化實(shí)現(xiàn)
本文主要介紹基于CUDA的可分離高斯濾波器的實(shí)現(xiàn)。
從公式(5)中可以看出,高斯濾波器很適合在GPU上進(jìn)行高效的并行計(jì)算。公式(2)說明,采用可分離濾波器可以分解成兩個一維高斯濾波器,可以使計(jì)算更加簡單。
從圖1中可以看出,基于CUDA的拉普金字塔首先采用高斯卷積,然后下采樣得到高斯金字塔,高斯金字塔經(jīng)過上采樣,并經(jīng)過高斯卷積得到拉普拉斯金字塔。
對于圖像的卷積,通常的方法是將圖像的像素傳輸?shù)絞lobal memory,然后每個thread負(fù)責(zé)計(jì)算一個像素的卷積結(jié)果。然而這種方法需要大量訪問全局寄存器,導(dǎo)致性能下降,甚至運(yùn)行的速度會比在CPU上的性能還要差。共享存儲器位于GPU片內(nèi),速度比表1所示使用CUDA profiler測試程序基于CUDA的可分離高斯金字塔local/global memory快得多。在不發(fā)生bank conflict的情況下,share memory的延遲幾乎只有l(wèi)ocal或global memory的1/100,訪問速度與寄存器相當(dāng),是實(shí)現(xiàn)線程間通信延遲最小的方法。
為了減少空閑的線程和充分利用共享存儲器,本設(shè)計(jì)讓每個thread負(fù)責(zé)將多個全局寄存器數(shù)據(jù)傳輸?shù)焦蚕泶鎯ζ?,?fù)責(zé)多個像素的卷積,block尺寸為16×8,每個thread負(fù)責(zé)傳輸(2+8)個全局存儲器到共享存儲器,同時負(fù)責(zé)8個像素的卷積計(jì)算。設(shè)置Apron的寬度為16的倍數(shù),以便在存取全局存儲器時符合合并訪問的條件。計(jì)算16×8×4像素的卷積,只需要用16×10×4的共享存儲器,有效利用了共享存儲器。
表1顯示了使用CUDA profiler測試程序基于CUDA的可分離高斯金字塔,其中行可分離高斯金字塔,每個線程用了11個寄存器,每個block使用了5 120 B的共享存儲器。而每個SM最多可激活8個block,通過下面的公式可以計(jì)算得到寄存器和共享存儲器的使用率。
塊內(nèi)總束數(shù)量Wblock如下[5]:
Wblock=ceil(T/Wsize,1)(5)
其中,T是塊內(nèi)線程數(shù),Wsize是束尺寸,ceil(x,y)等于x向上取到y(tǒng)的整數(shù)倍。
分給一個塊的總寄存器數(shù)量Rblock如下:
Rblock=ceil(Rk×Wsize,GT)×Wblock(6)
Rk是內(nèi)核使用的寄存器數(shù),GT是線程分配的粒度。
塊內(nèi)總共享存儲器數(shù)量Sblock如下:
Sblock=ceil(Sk,GS)(7)
其中,Sk是內(nèi)核使用的共享存儲器總量,以字節(jié)為單位,GS是共享存儲器分配的粒度。
通過公式(5)~(7)可以計(jì)算得到寄存器和共享存儲器的使用率,為了選取合適的block大小,提高SM占用率,通過CUDA GPU Occupancy Calculator來選擇block的大小,從圖2中可以看出,選取block圖2使用CUDA GPU Occupancy Calculator計(jì)算block大小、寄存器大小和共享存儲器的使用對SM占用率的影響大小為16×8×1可以使SM占用率提高到0.667,這個結(jié)果與用CUDA profiler測試的結(jié)果和公式(5)~(7)計(jì)算的結(jié)果是一致的。如果繼續(xù)增加block的大小,從表1或者公式(5)~(7)都很容易得到,因?yàn)楣蚕泶鎯ζ魅萘康南拗疲琒M占用率不會因?yàn)閎lock大小的增加而增加,而選擇block大小為16×4×1,SM占用率為0.33。因此在GTX480上,選取Block大小為16×8×1是最合適的。
3實(shí)驗(yàn)結(jié)果
3.1性能測試
表2顯示了基于CUDA的拉普拉斯金字塔性能的測試結(jié)果。結(jié)果顯示提出的算法獲得了幾十倍的加速比?;贑UDA的拉普拉斯金字塔采用可分離卷積濾波核,很好地解決了利用了共享存儲器和全局存儲器的合并訪問的要求。
3.2拉普拉斯金字塔的應(yīng)用
(1)基于拉普拉斯金字塔的融合
圖3金字塔變換后區(qū)域特征量測所得圖像(3層拉普拉斯金字塔分解)采用基于區(qū)域特征量測的拉普拉斯金字塔分解的圖像融合算法,圖3顯示了金字塔變換后區(qū)域特征量測所得圖像(3層拉普拉斯金字塔分解)。當(dāng)層數(shù)較低時,如分解層數(shù)小于5層,分解層數(shù)越大,融合圖像的分辨率越高,圖像越清晰;當(dāng)層數(shù)大于5層時,增加層數(shù)對于改善分辨率的影響減小,但增大了計(jì)算量。而基于CUDA的拉普拉斯金字塔由于性能上有較大的提高,可以支持層數(shù)大于5層的實(shí)時圖像融合。因此基于CUDA的拉普拉斯金字塔特別適合對圖像融合效果要求高而需要進(jìn)行很多層拉普拉斯金字塔分解的實(shí)時圖像融合。
(2)基于拉普拉斯金字塔的增強(qiáng)圖片的細(xì)節(jié)處理,PARIS S等人[4]用拉普拉斯金字塔算法在處理圖像平滑、圖像細(xì)節(jié)控制、色調(diào)映射等領(lǐng)域表現(xiàn)出了很好的特性,不足之處是每處理一萬個像素需要近1 min時間,圖4顯示了圖像邊緣保持的細(xì)節(jié)提高,在圖6中圖像尺寸為300×200的情況下,需要進(jìn)行8次拉普拉斯分解和重構(gòu),整個程序需要耗時3 min。而基于CUDA的拉普拉斯金字塔算法在GTX480平臺下獲得了幾十倍的加速比。
4結(jié)語
本文提出了基于CUDA的并行拉普拉斯金字塔算法,二維高斯濾波被分解成可分離的兩個一維卷積操作。提出的基于CUDA的拉普拉斯金字塔算法在GTX480平臺下獲得了幾十倍的加速比。
參考文獻(xiàn)
?。?] 趙健,高軍,羅超,等. 基于數(shù)字圖像處理的玻璃缺陷在線檢測系統(tǒng)[J]. 電子技術(shù)應(yīng)用, 2013,39(12):9092.
?。?] 李波,梁攀,關(guān)沫. 一種基于邊緣提取的交互式圖像分割算法[J]. 微型機(jī)與應(yīng)用, 2013, 32(10):4147.
[3] PARIS S, HASINOFF S, KAUTZ J. Local Laplacian filters: edgeaware image processing with a Laplacian pyramid[J]. ACM Transactions on Graphics, 2011,30(4):12441259.
?。?] 祁艷杰. LOG算子在FPGA中的實(shí)現(xiàn)[J]. 電子技術(shù)應(yīng)用, 2007, 33(3):6365.
?。?] NVIDIA. NVIDIA CUDA programming guide 4.0[EB/OL].(201132)[20160329]http://developer.nvidia.com/cudatoolkit40.