郭廣楠 張瑜 張欣
摘 要 為了解決計(jì)算密集型的圖像平滑,在分析常見的平滑算法的基礎(chǔ)上,采用統(tǒng)一計(jì)算設(shè)備架構(gòu)的軟件和硬件架構(gòu),提出了一種利用圖形處理器(GPU)的實(shí)現(xiàn)方法。首先引入了高強(qiáng)度的GPU并行計(jì)算的結(jié)構(gòu),介紹了GPU均值濾波和中值濾波兩種典型的算法。然后,用不同分辨率的圖像作為測試數(shù)據(jù),比較相同的市場價(jià)格下CPU和GPU之間的計(jì)算效率。實(shí)驗(yàn)結(jié)果表明,同種算法GPU獲得了與CPU相同的效果,同時(shí)提高的計(jì)算效率是CPU的10倍,從而證明了GPU在數(shù)字圖像處理中的實(shí)際應(yīng)用效果。
關(guān)鍵詞 圖形處理器 圖像平滑 圖像處理
中圖分類號(hào):TP31 文獻(xiàn)標(biāo)識(shí)碼:A
0 引言
近年來,隨著圖形處理器硬件技術(shù)的不斷發(fā)展以及可編程能力的不斷增強(qiáng),越來越多的應(yīng)用通過使用基于GPU的計(jì)算框架提高了算法和系統(tǒng)的效率。GPU的應(yīng)用領(lǐng)域不斷擴(kuò)大,已被廣泛地應(yīng)用到通用信號(hào)處理、物理模擬、財(cái)務(wù)數(shù)據(jù)分析以及生物科學(xué)等領(lǐng)域,并取得了顯著的效果。在分子動(dòng)力學(xué)領(lǐng)域中,GeForce 8800GTX 實(shí)現(xiàn)了比CPU高達(dá)240倍的處理速度。在腦電波模擬、視覺和嗅覺計(jì)算等方面,通過協(xié)同CPU和GPU工作,實(shí)現(xiàn)了130倍的性能提高。借助GPU,GIS(地球信息系統(tǒng))原本需要20分鐘完成的計(jì)算過程,現(xiàn)在只需要30秒就能完成。
1 GPU并行計(jì)算架構(gòu)
GPU現(xiàn)在已已實(shí)現(xiàn)可編程的圖像處理,由于它具有高內(nèi)存帶寬驅(qū)動(dòng)的多內(nèi)核,已成為圖像處理的絕對(duì)主力。
1.1 GPU架構(gòu)
GPU支持單指令多數(shù)據(jù)(SIMD)指令的數(shù)據(jù)并行計(jì)算。在SIMD結(jié)構(gòu)中,單一的控制組件分配到每個(gè)管線,相同的指令同時(shí)執(zhí)行。例如,NVDIA8800GT包含每組8個(gè),共14組的多處理器組,但每個(gè)處理器只有一個(gè)指令單元。從線程的角度看,每個(gè)多處理器組可以同時(shí)并行運(yùn)行768個(gè)活躍線程,即GPU包含14組多處理器組可以同時(shí)并行10752個(gè)活動(dòng)線程。在存儲(chǔ)器方面,每個(gè)多處理器擁有16KB的可讀寫共享內(nèi)存、8KB的只讀常量緩存、8KB的只讀紋理緩存和8192個(gè)32位寄存器。
1.2 GPU編程模型
CUDA(統(tǒng)一設(shè)備計(jì)算架構(gòu))是一個(gè)GPU編程平臺(tái),見圖2。它包括一個(gè)硬件驅(qū)動(dòng)程序和應(yīng)用程序接口(API)以及兩個(gè)數(shù)學(xué)函數(shù)庫,因此程序員不需要調(diào)用復(fù)雜的圖形API接口。 CUDA中的API還兼容標(biāo)準(zhǔn)C語言庫,這樣程序員就可以通過調(diào)用函數(shù)訪問內(nèi)存并執(zhí)行指令。
為了簡化開發(fā),CUDA允許程序員將CPU代碼和GPU的代碼混合到程序文件。NVCC作為C語言編譯器,負(fù)責(zé)隔離設(shè)備代碼和宿主代碼。在CUDA匯編時(shí),GPU作為計(jì)算設(shè)備可以執(zhí)行大量的并行線程,類似于CPU的協(xié)同處理器。換句話說,用不同的數(shù)據(jù)被執(zhí)行多次的應(yīng)用程序可以被劃分成在不同設(shè)備上執(zhí)行的多個(gè)函數(shù),這被稱為內(nèi)核。
2 基于GPU的圖像平滑實(shí)現(xiàn)
2.1 圖像平滑的原理
圖像平滑的方法主要分為兩類:空域法和頻域法。在空域法中,常用的方法是均值濾波和中值濾波。
均值濾波是一種線性空間濾波。它使用大小這奇數(shù)的掩模在圖像上滑動(dòng),并用掩膜中所像素的灰度均值替換掩膜中心相應(yīng)的像素灰度值。如果在均值處理時(shí)對(duì)掩膜中每個(gè)像素的權(quán)重進(jìn)行調(diào)整,即確定每個(gè)像素的系數(shù),它則被稱作加權(quán)平均濾波。這與頻域中的卷積的概念類似,因此線性空間濾波通常被稱為掩膜圖像卷積。中值濾波是一種非線性空間濾波,與均值濾波的差別在于:掩膜中心對(duì)應(yīng)的像素點(diǎn)的灰度值均被替換為掩膜中所有像素灰度的中值。本文使用了均值濾波和中值濾波兩種空域法實(shí)現(xiàn)圖像的平滑。
2.2 計(jì)算分配
GPU的數(shù)據(jù)處理能力要比CPU高得多,雖然它也可以直接負(fù)責(zé)顯示。在與顯示相關(guān)的算法設(shè)計(jì)中,應(yīng)該在直接繪圖前盡可能將計(jì)算分配給GPU并行處理,而僅讓CPU完成數(shù)據(jù)到內(nèi)存的加載。在一般與顯示無關(guān)的算法設(shè)計(jì)中,GPU并行計(jì)算數(shù)據(jù),得到結(jié)果,然后將數(shù)據(jù)傳輸?shù)絉AM。
2.3 實(shí)現(xiàn)過程
用GPU實(shí)現(xiàn)圖像的平滑的主要步驟如下:
第1步:讀取圖像數(shù)據(jù)。根據(jù)圖像大小在GPU上分配設(shè)備存A,并將數(shù)據(jù)傳送到設(shè)備內(nèi)存A。
第2步:設(shè)置GPU的執(zhí)行參數(shù),即網(wǎng)格和塊的大小。
第3步:將圖像數(shù)據(jù)與GPU的紋理內(nèi)存綁定,建立與GPU內(nèi)存之間的映射。
第4步:在OpenGL中打開GPU操作所需的高速緩存,完成GPU和OpenGL之間連接。
第5步:調(diào)用內(nèi)核函數(shù)來執(zhí)行圖像平滑。
第6步:OpenGL顯示處理結(jié)果。
內(nèi)核定義需要使用規(guī)范“_global_”, 用擴(kuò)展語法“<<< >>>” 指定每個(gè)并行執(zhí)行的線程數(shù)。內(nèi)核在程序中聲明如下:
ImageSmooth<<< imageH,64>>>(imageIn,imageW,imageW,imageH)(1)
其中, <<< >>>中的參數(shù)說明:分配imageH個(gè)塊和每塊包含64個(gè)活動(dòng)線程。imageIn 是要處理的圖像數(shù)據(jù)的起始地址指針,imageW是圖像寬度,imageH是圖像高度。
數(shù)據(jù)塊的大小被聲明為圖像高度imageH,每個(gè)塊負(fù)責(zé)一行中像素的平滑處理。每個(gè)線程塊包含64個(gè)線程,每個(gè)線程負(fù)責(zé)imageW/64像素的卷積。這樣就有64譱mageH個(gè)獨(dú)立的線程在執(zhí)行(1)。
3 結(jié)論
本文實(shí)現(xiàn)了基于GPU的圖像平滑算法,并分析了其實(shí)驗(yàn)結(jié)果。結(jié)果表明,與CPU相比,在可以分獨(dú)立單位的典型算法中,比如均值和中值濾波都依賴其固有的并行計(jì)算硬件結(jié)構(gòu)特點(diǎn),GPU可以提高到非常高的性能。當(dāng)圖象數(shù)據(jù)量增加時(shí),這種提高就更加明顯。在實(shí)驗(yàn)平臺(tái)上,GPU的計(jì)算會(huì)提高到10倍,這表明了GPU在高密度數(shù)據(jù)計(jì)算中的強(qiáng)大的計(jì)算能力,這可以為快速圖像預(yù)處理提供硬件支持。