《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于CUDA的拉普拉斯金字塔的優(yōu)化
基于CUDA的拉普拉斯金字塔的優(yōu)化
2016年微型機與應用第10期
邵靖凱,,厲旭杰
(溫州大學 物理與電子信息工程學院,,浙江 溫州 325035)
摘要: 提出了基于CUDA的并行拉普拉斯金字塔算法,。算法采用的并行拉普拉斯算法很好地解決了共享存儲器的bank沖突和全局存儲器的合并訪問的問題,,為了最大化并行效率,計算了SM占用率,,并通過公式進行了論證,。在GTX480平臺下,基于CUDA的并行拉普拉斯金字塔算法獲得了幾十倍的加速比,。最后,,將基于CUDA的并行拉普拉斯金字塔算法成功地應用于圖像融合和增強圖片的細節(jié)處理,充分證明了并行拉普拉斯金字塔算法廣泛的有效性和必要性,。
Abstract:
Key words :

  邵靖凱,,厲旭杰

  (溫州大學 物理與電子信息工程學院,浙江 溫州 325035)

  摘要:提出了基于CUDA的并行拉普拉斯金字塔算法,。算法采用的并行拉普拉斯算法很好地解決了共享存儲器的bank沖突和全局存儲器的合并訪問的問題,,為了最大化并行效率,計算了SM占用率,并通過公式進行了論證,。在GTX480平臺下,,基于CUDA的并行拉普拉斯金字塔算法獲得了幾十倍的加速比。最后,,將基于CUDA的并行拉普拉斯金字塔算法成功地應用于圖像融合和增強圖片的細節(jié)處理,充分證明了并行拉普拉斯金字塔算法廣泛的有效性和必要性,。

  關鍵詞:CUDA,;拉普拉斯金字塔;GPU,;并行計算

0引言

  拉普拉斯金字塔算法可以進行多尺度的圖像分解,,廣泛應用于圖像分析[12]。PARIS S等人[3]用拉普拉斯金字塔算法實現了邊緣突出的圖像處理,,但是算法的效率很低,。因此又提出限制拉普拉斯分解的層數的算法,從而提高圖像處理的速度,,但是圖像處理的效果有所下降,。雖然拉普拉斯金字塔分解本身算法復雜度不高,但是因為應用中通常需要進行很多層的拉普拉斯分解和重構,,使得整個過程需要消耗大量的時間,。因此提高拉普拉斯金字塔算法的速度顯得非常重要。祁艷杰[4]實現了基于FPGA的實時拉普拉斯金字塔,。

  本文研究了基于CUDA的拉普拉斯金字塔算法的實現,。本算法采用并行拉普拉斯算法很好地解決了共享存儲器的bank沖突和全局存儲器的合并訪問的問題,而且最大化了并行效率,,從而使性能得到了很大的提高,。

1圖像金字塔

  1.1高斯金字塔的構建過程

  設原圖像為G0,高斯金字塔的第L層的構造方法如下:先將L-1層圖像GL-1和窗口函數w(m,n)進行卷積,,結果做隔行隔列的降采樣,,即

  GL(i,j)=∑2m=-2∑2n=-2w(m,n)GL-1(2i+m,2j+n) (1)

  其中,(i,j)為像素索引,w(m,n)是5×5高斯核:

  2.png

  計算G0,,G1,,…,GN就構成了高斯金字塔,。

  1.2拉普拉斯金字塔的構建過程

  將GL內插放大,,得到放大圖像G*L,使G*L的尺寸與GL-1的尺寸相同:

  3.png

  令LPL=GL-G*L+1,,當0≤L<N時

  LPL=GL,,當L=N時,則LP0,LP1,,…,,LPN構成了拉普拉斯金字塔。

  2基于CUDA的拉普拉斯金字塔的并行化實現

  本文主要介紹基于CUDA的可分離高斯濾波器的實現,。

  4.png

  從公式(5)中可以看出,,高斯濾波器很適合在GPU上進行高效的并行計算。公式(2)說明,,采用可分離濾波器可以分解成兩個一維高斯濾波器,,可以使計算更加簡單。

  從圖1中可以看出,,基于CUDA的拉普金字塔首先采用高斯卷積,,然后下采樣得到高斯金字塔,高斯金字塔經過上采樣,,并經過高斯卷積得到拉普拉斯金字塔,。

  

001.jpg

  對于圖像的卷積,通常的方法是將圖像的像素傳輸到global memory,,然后每個thread負責計算一個像素的卷積結果,。然而這種方法需要大量訪問全局寄存器,導致性能下降,,甚至運行的速度會比在CPU上的性能還要差,。共享存儲器位于GPU片內,速度比表1所示使用CUDA profiler測試程序基于CUDA的可分離高斯金字塔local/global memory快得多,。在不發(fā)生bank conflict的情況下,,share memory的延遲幾乎只有l(wèi)ocal或global memory的1/100,訪問速度與寄存器相當,,是實現線程間通信延遲最小的方法,。

  為了減少空閑的線程和充分利用共享存儲器,本設計讓每個thread負責將多個全局寄存器數據傳輸到共享存儲器,,負責多個像素的卷積,,block尺寸為16×8,每個thread負責傳輸(2+8)個全局存儲器到共享存儲器,,同時負責8個像素的卷積計算,。設置Apron的寬度為16的倍數,以便在存取全局存儲器時符合合并訪問的條件,。計算16×8×4像素的卷積,,只需要用16×10×4的共享存儲器,有效利用了共享存儲器,。

005.jpg

  表1顯示了使用CUDA profiler測試程序基于CUDA的可分離高斯金字塔,,其中行可分離高斯金字塔,,每個線程用了11個寄存器,每個block使用了5 120 B的共享存儲器,。而每個SM最多可激活8個block,,通過下面的公式可以計算得到寄存器和共享存儲器的使用率。

  塊內總束數量Wblock如下[5]:

  Wblock=ceil(T/Wsize,1)(5)

  其中,,T是塊內線程數,,Wsize是束尺寸,ceil(x,y)等于x向上取到y(tǒng)的整數倍,。

  分給一個塊的總寄存器數量Rblock如下:

  Rblock=ceil(Rk×Wsize,GT)×Wblock(6)

  Rk是內核使用的寄存器數,,GT是線程分配的粒度。

  塊內總共享存儲器數量Sblock如下:

  Sblock=ceil(Sk,GS)(7)

  其中,,Sk是內核使用的共享存儲器總量,以字節(jié)為單位,,GS是共享存儲器分配的粒度,。

  通過公式(5)~(7)可以計算得到寄存器和共享存儲器的使用率,為了選取合適的block大小,,提高SM占用率,,通過CUDA GPU Occupancy Calculator來選擇block的大小,從圖2中可以看出,,選取block圖2使用CUDA GPU Occupancy Calculator計算block大小,、寄存器大小和共享存儲器的使用對SM占用率的影響大小為16×8×1可以使SM占用率提高到0.667,這個結果與用CUDA profiler測試的結果和公式(5)~(7)計算的結果是一致的,。如果繼續(xù)增加block的大小,,從表1或者公式(5)~(7)都很容易得到,因為共享存儲器容量的限制,,SM占用率不會因為block大小的增加而增加,,而選擇block大小為16×4×1,SM占用率為0.33,。因此在GTX480上,,選取Block大小為16×8×1是最合適的。

002.jpg

3實驗結果

  3.1性能測試

  表2顯示了基于CUDA的拉普拉斯金字塔性能的測試結果,。結果顯示提出的算法獲得了幾十倍的加速比,。基于CUDA的拉普拉斯金字塔采用可分離卷積濾波核,,很好地解決了利用了共享存儲器和全局存儲器的合并訪問的要求,。

006.jpg

  3.2拉普拉斯金字塔的應用

  (1)基于拉普拉斯金字塔的融合

003.jpg

  圖3金字塔變換后區(qū)域特征量測所得圖像(3層拉普拉斯金字塔分解)采用基于區(qū)域特征量測的拉普拉斯金字塔分解的圖像融合算法,圖3顯示了金字塔變換后區(qū)域特征量測所得圖像(3層拉普拉斯金字塔分解),。當層數較低時,,如分解層數小于5層,分解層數越大,融合圖像的分辨率越高,,圖像越清晰,;當層數大于5層時,增加層數對于改善分辨率的影響減小,,但增大了計算量,。而基于CUDA的拉普拉斯金字塔由于性能上有較大的提高,可以支持層數大于5層的實時圖像融合,。因此基于CUDA的拉普拉斯金字塔特別適合對圖像融合效果要求高而需要進行很多層拉普拉斯金字塔分解的實時圖像融合,。

  (2)基于拉普拉斯金字塔的增強圖片的細節(jié)處理,PARIS S等人[4]用拉普拉斯金字塔算法在處理圖像平滑,、圖像細節(jié)控制,、色調映射等領域表現出了很好的特性,不足之處是每處理一萬個像素需要近1 min時間,,圖4顯示了圖像邊緣保持的細節(jié)提高,,在圖6中圖像尺寸為300×200的情況下,需要進行8次拉普拉斯分解和重構,,整個程序需要耗時3 min,。而基于CUDA的拉普拉斯金字塔算法在GTX480平臺下獲得了幾十倍的加速比。

  

004.jpg

4結語

  本文提出了基于CUDA的并行拉普拉斯金字塔算法,,二維高斯濾波被分解成可分離的兩個一維卷積操作,。提出的基于CUDA的拉普拉斯金字塔算法在GTX480平臺下獲得了幾十倍的加速比。

參考文獻

 ?。?] 趙健,高軍,羅超,等. 基于數字圖像處理的玻璃缺陷在線檢測系統(tǒng)[J]. 電子技術應用, 2013,39(12):9092.

 ?。?] 李波,梁攀,關沫. 一種基于邊緣提取的交互式圖像分割算法[J]. 微型機與應用, 2013, 32(10):4147.

  [3] PARIS S, HASINOFF S, KAUTZ J. Local Laplacian filters: edgeaware image processing with a Laplacian pyramid[J]. ACM Transactions on Graphics, 2011,30(4):12441259.

 ?。?] 祁艷杰. LOG算子在FPGA中的實現[J]. 電子技術應用, 2007, 33(3):6365.

 ?。?] NVIDIA. NVIDIA CUDA programming guide 4.0[EB/OL].(201132)[20160329]http://developer.nvidia.com/cudatoolkit40.


此內容為AET網站原創(chuàng),未經授權禁止轉載,。