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