李一芒,孫鳳全
(常州大學(xué) 機(jī)械工程學(xué)院,江蘇 常州 213000)
與傅里葉變換相比,小波變換能夠通過(guò)低通濾波器和高通濾波器將圖像的基本信息與變化信息、邊緣信息分離開(kāi)來(lái),并且由于小波變換具有緊支撐的性質(zhì),即取值在某一區(qū)間內(nèi)為常數(shù),在此區(qū)間外為0,使得能量較為集中,能夠反映局部信息的變換,因此被應(yīng)用于圖像處理領(lǐng)域。作者在研究夜間圖像檢測(cè)過(guò)程中,將小波變換應(yīng)用于圖像融合,根據(jù)選擇小波變換的四項(xiàng)原則,即正交、線(xiàn)性相位、連續(xù)、緊支撐[1],選擇了二維離散哈爾小波變換,但是在CPU環(huán)境下運(yùn)行需要耗費(fèi)大量資源,實(shí)時(shí)性存在問(wèn)題,為方便后續(xù)研究,本文對(duì)GPU環(huán)境下的二維離散哈爾小波變換進(jìn)行了研究。
GPU(graphic processing unit)最初是一種圖形處理器,后來(lái)根據(jù)人們的需要被用作并行計(jì)算的處理器,對(duì)于GPU下的小波變換已有許多,例如文獻(xiàn)[2]在偽代碼層面添加滑動(dòng)窗口機(jī)制處理大數(shù)據(jù)流;文獻(xiàn)[3]將數(shù)據(jù)進(jìn)行全局劃分,實(shí)現(xiàn)小波變換;文獻(xiàn)[4]通過(guò)改寫(xiě)寄存器文件結(jié)構(gòu),提升SIMD結(jié)構(gòu)數(shù)據(jù)處理速度;文獻(xiàn)[5]將MPI技術(shù)和GPU結(jié)合;文獻(xiàn)[6]將數(shù)據(jù)分成奇數(shù)塊和偶數(shù)塊進(jìn)行處理;文獻(xiàn)[7]基于晶格結(jié)構(gòu)提出了新的離散小波算法。本文采用了一種正在發(fā)展中的新架構(gòu)SIMT(單指令多線(xiàn)程),在它本身配套的CUDA C算法平臺(tái)上進(jìn)行實(shí)現(xiàn),將二維離散小波變換對(duì)應(yīng)到線(xiàn)程,進(jìn)行并行公式推導(dǎo),并且通過(guò)調(diào)整GPU的邏輯布局、同步設(shè)置、內(nèi)存優(yōu)化,實(shí)現(xiàn)性能的提升,比SIMD架構(gòu)GPU效率可提升16.3%,比CPU效率可提升51.1%。
計(jì)算機(jī)架構(gòu)根據(jù)指令和數(shù)據(jù)進(jìn)入CPU的方式分為單指令單數(shù)據(jù)(SISD)、單指令多數(shù)據(jù)(SIMD)、多指令單數(shù)據(jù)(MISD)、多指令多數(shù)據(jù)(MIMD),其中SIMD、MIMD以及后來(lái)出現(xiàn)的SIMT就是GPU中的數(shù)據(jù)并行結(jié)構(gòu)體系[8]。SIMT架構(gòu)的概念最早由NVIDIA公司在2008年于文獻(xiàn)[9]中提出,SIMD架構(gòu)是傳統(tǒng)的數(shù)據(jù)并行結(jié)構(gòu),區(qū)別如圖1所示。
圖1 SIMT架構(gòu)與SIMD架構(gòu)圖
如圖1(右)所示,在SIMD結(jié)構(gòu)中,數(shù)據(jù)被打包成一個(gè)向量,具體的數(shù)量取決于有多少個(gè)SP(流處理器),這就是GPU處理大量數(shù)據(jù)快的原因,也是并行計(jì)算[10]的基礎(chǔ)。但是并不是所有數(shù)據(jù)都適合向量化,為了追求速度,著色程序越來(lái)越長(zhǎng),并且因?yàn)橄蛄炕a(chǎn)生的代碼量巨大,需要類(lèi)似于內(nèi)存對(duì)齊[11]這樣的操作,對(duì)編譯器的負(fù)荷巨大。
如圖1(左)所示,區(qū)別于SIMD結(jié)構(gòu)GPU的是,在SIMT結(jié)構(gòu)GPU中,多了線(xiàn)程的概念。將一個(gè)數(shù)據(jù)就存放在一個(gè)線(xiàn)程內(nèi),也就有了對(duì)應(yīng)的地址,這樣就可以對(duì)單個(gè)數(shù)據(jù)進(jìn)行操作,為了滿(mǎn)足并行的要求,SIMT將32個(gè)線(xiàn)程組合成一個(gè)線(xiàn)程束[12]。一個(gè)線(xiàn)程束里的數(shù)據(jù)同時(shí)只能響應(yīng)一個(gè)命令,如果其中部分線(xiàn)程需要響應(yīng)其他命令,那么這部分線(xiàn)程進(jìn)入非活躍狀態(tài),等活躍線(xiàn)程執(zhí)行完再執(zhí)行。這樣的執(zhí)行方式從某方面來(lái)講和SIMD結(jié)構(gòu)GPU將數(shù)據(jù)向量化存在相似[13],因此SIMT結(jié)構(gòu)是在SIMD的結(jié)構(gòu)基礎(chǔ)上設(shè)計(jì)出來(lái)的。
圖2 GPU邏輯架構(gòu)
SIMT結(jié)構(gòu)對(duì)比SIMD結(jié)構(gòu)的優(yōu)勢(shì)在于不需要考慮數(shù)據(jù)向量化、內(nèi)存對(duì)齊的事情,并且它最小并行的數(shù)據(jù)寬度為32,遠(yuǎn)小于SIMD,所以它對(duì)于數(shù)據(jù)的處理更加高效且靈活,同時(shí),指令和數(shù)據(jù)的調(diào)度編譯[14]工作更加簡(jiǎn)單。在本文的實(shí)驗(yàn)中,SIMT架構(gòu)的GPU比SIMD架構(gòu)的GPU快上19.5%。
SIMT結(jié)構(gòu)以線(xiàn)程為基礎(chǔ),統(tǒng)一的存在一個(gè)網(wǎng)格(grid)內(nèi),網(wǎng)格內(nèi)包含若干線(xiàn)程塊(block),線(xiàn)程塊內(nèi)包含若干線(xiàn)程(thread),每個(gè)線(xiàn)程都有一個(gè)輸入數(shù)據(jù),這些線(xiàn)程會(huì)被分配相對(duì)應(yīng)索引號(hào),通過(guò)索引號(hào)可以操縱數(shù)據(jù),GPU會(huì)根據(jù)網(wǎng)格和線(xiàn)程塊的維度分配相應(yīng)維度坐標(biāo),類(lèi)似于矩陣坐標(biāo)。
網(wǎng)格的維度和線(xiàn)程塊的維度是由我們自行指定的,可從一維設(shè)置到三維,這里以二維結(jié)構(gòu)來(lái)設(shè)置一個(gè)矩陣為例,則邏輯結(jié)構(gòu)如圖2所示。
設(shè)圖像矩陣A中的元素為ai,j,βi,j、γi,j、δi,j、ζi,j分別為矩陣C、D、E、F的元素,則經(jīng)過(guò)推導(dǎo)可得:
(1)
(2)
(3)
(4)
接下來(lái)根據(jù)式(1)~(4)將數(shù)據(jù)分配進(jìn)線(xiàn)程。根據(jù)圖(2)可知,線(xiàn)程塊ID以列優(yōu)先的方式分配,線(xiàn)程的ID以塊為單位,在每個(gè)塊中再按列優(yōu)先分配ID,線(xiàn)程ID在其所在的塊內(nèi)為獨(dú)有。矩陣的數(shù)據(jù)存儲(chǔ)進(jìn)線(xiàn)程的時(shí)候不按塊為單位,根據(jù)全局的線(xiàn)程按照列優(yōu)先進(jìn)行存儲(chǔ)。設(shè)圖像矩陣AM×N中的元素為ai,j,線(xiàn)程矩陣中的元素為μi,j,BH×I的線(xiàn)程塊矩陣中的元素為νi,j,則推導(dǎo)可得:
ai=μi+H·νi
(5)
aj=μj+I·νj
(6)
在實(shí)際存儲(chǔ)形式中,數(shù)據(jù)按照一維數(shù)組的形式進(jìn)行存儲(chǔ),GPU在訪問(wèn)全局內(nèi)存[16]的時(shí)候也是直接訪問(wèn)數(shù)據(jù)的全局內(nèi)存索引,因此需要找到全局內(nèi)存索引和矩陣坐標(biāo)的關(guān)系,在這里要注意的是和矩陣數(shù)據(jù)存儲(chǔ)原則不同,全局內(nèi)存索引的分配按照行優(yōu)先原則而并非是列優(yōu)先原則。設(shè)全局內(nèi)存索引為S,根據(jù)式(5)、式(6)可推得全局內(nèi)存索引和矩陣元素關(guān)系為:
S=ai+aj·M
(7)
首先按行方向?qū)D像矩陣的列進(jìn)行變換,需要知道數(shù)據(jù)取出位置和數(shù)據(jù)存儲(chǔ)位置。設(shè)變換后數(shù)據(jù)取出位置的全局內(nèi)存索引為SO1,SO2,根據(jù)式(7)可推得:
SO1=2ai+aj·M
(8)
SO2=2ai+aj·M+1
(9)
而數(shù)據(jù)的存儲(chǔ)位置由于式(8)、式(9)推導(dǎo)過(guò)程中為了先對(duì)應(yīng)均值塊,使得有些索引超出了界限,而如果均值塊處理后的數(shù)據(jù)存儲(chǔ)位置索引按行方向只取前M/2個(gè)索引,而細(xì)節(jié)塊處理的數(shù)據(jù)存儲(chǔ)位置的索引由均值數(shù)據(jù)索引向右M/2個(gè)偏移量則可解決。設(shè)變換后數(shù)據(jù)存儲(chǔ)位置的全局內(nèi)存索引為SI1,SI2則可推得:
SI1=S=ai+aj·M
(10)
SI2=ai+aj·M+M/2
(11)
其次按列方向?qū)D像矩陣的行進(jìn)行變換,和列變換存儲(chǔ)位置相似,均值塊處理后的數(shù)據(jù)存儲(chǔ)位置索引按列方向只取前N/2個(gè)索引,細(xì)節(jié)塊處理的數(shù)據(jù)存儲(chǔ)位置索引由均值數(shù)據(jù)索引向右偏移M2/2個(gè)偏移量[17]。設(shè)變換后數(shù)據(jù)取出位置的全局內(nèi)存索引為SO1,SO2,數(shù)據(jù)存儲(chǔ)位置的全局內(nèi)存索引為SI1,SI2,則可推得:
SO1=2aj·M+ai
(12)
SO2=(2aj+1)·M+ai
(13)
SI1=S=ai+aj·M
(14)
SI2=S=ai+aj·M+M2/2
(15)
至此,完成了二維離散哈爾小波變換的并行公式推導(dǎo)。
由于在運(yùn)行一個(gè)進(jìn)程的時(shí)候,所需要的內(nèi)存大小其實(shí)會(huì)超過(guò)實(shí)際的內(nèi)存[18]大小,因此會(huì)通過(guò)分頁(yè)的方式,整合計(jì)算機(jī)的存儲(chǔ)資源,映射出一個(gè)超過(guò)物理內(nèi)存大小的虛擬內(nèi)存[19],需要數(shù)據(jù)的時(shí)候通過(guò)頁(yè)和頁(yè)幀將數(shù)據(jù)調(diào)度進(jìn)物理內(nèi)存中進(jìn)行操作。CPU與GPU傳輸數(shù)據(jù)也需要用到虛擬內(nèi)存,其關(guān)系流程如圖3所示。
圖3 GPU與CPU數(shù)據(jù)流通流程圖
如圖3左所示,數(shù)據(jù)邏輯上存放于虛擬內(nèi)存,通過(guò)虛擬地址將數(shù)據(jù)調(diào)度進(jìn)入CPU的物理內(nèi)存中,CPU和GPU的物理內(nèi)存通過(guò)總線(xiàn)互聯(lián)傳遞數(shù)據(jù),GPU再將數(shù)據(jù)存放于GPU的虛擬內(nèi)存中,等到使用的時(shí)候進(jìn)行調(diào)度,送入TPC(處理器)[20]中進(jìn)行處理,經(jīng)過(guò)ROP(顏色處理單元)輸出結(jié)果到GPU虛擬內(nèi)存中,需要被傳輸?shù)臄?shù)據(jù)通過(guò)虛擬地址將數(shù)據(jù)調(diào)度進(jìn)GPU物理內(nèi)存,傳輸給CPU物理內(nèi)存,再將數(shù)據(jù)存放進(jìn)CPU虛擬內(nèi)存中[21]。
這種模式會(huì)產(chǎn)生一些不必要的開(kāi)銷(xiāo),可以看到在這過(guò)程中數(shù)據(jù)在被不停的復(fù)制、映射,而這些是由于尋址方式造成的,因?yàn)閔ost端與device端開(kāi)辟的空間地址不統(tǒng)一,互相不能直接進(jìn)行數(shù)據(jù)的存取,所以本文在這里采用虛擬內(nèi)存統(tǒng)一尋址的方式,使得GPU虛擬內(nèi)存和CPU虛擬內(nèi)存的虛擬地址統(tǒng)一,此時(shí)GPU就可以直接從CPU的物理內(nèi)存中取用數(shù)據(jù)了,簡(jiǎn)化了代碼,減少了不必要開(kāi)銷(xiāo),便于后續(xù)處理。
要找到能夠處理大分辨率數(shù)據(jù)速度最快的邏輯布局,就必須從數(shù)據(jù)在SIMT結(jié)構(gòu)GPU中被處理的底層邏輯上去尋找,否則每一個(gè)邏輯布局都去嘗試根本就是無(wú)法做到的。數(shù)據(jù)的存儲(chǔ)在實(shí)際的硬件中是以一維的方式存儲(chǔ)的,但是SM(流式多處理器)處理數(shù)據(jù)的最小執(zhí)行單元并不是線(xiàn)程,在數(shù)據(jù)處理的過(guò)程中,線(xiàn)程束才是SM中基本的執(zhí)行單元。當(dāng)一個(gè)內(nèi)核被啟動(dòng)時(shí),網(wǎng)格塊中的線(xiàn)程塊會(huì)被分配到某一個(gè)SM上,這些線(xiàn)程塊里的線(xiàn)程就會(huì)分成多個(gè)線(xiàn)程束,在一個(gè)線(xiàn)程束中,所有被分配到線(xiàn)程上的數(shù)據(jù)都會(huì)執(zhí)行這一個(gè)線(xiàn)程束被分配到的指令,目前每個(gè)線(xiàn)程數(shù)是以32個(gè)線(xiàn)程為一組的,一個(gè)線(xiàn)程束就能夠同時(shí)對(duì)32個(gè)數(shù)據(jù)執(zhí)行同一個(gè)命令,而在命令分配的時(shí)候,多個(gè)線(xiàn)程束會(huì)分配到同一個(gè)命令,同時(shí),一個(gè)命令最小能夠處理的數(shù)據(jù)只有32個(gè),也使得在實(shí)際的并行處理中能夠更加的靈活,這就是SIMT結(jié)構(gòu)GPU性能更加優(yōu)越的原因。
而線(xiàn)程束的存在使得數(shù)據(jù)處理速度變快的同時(shí),也會(huì)帶來(lái)一個(gè)問(wèn)題,同一個(gè)線(xiàn)程束內(nèi)的32個(gè)線(xiàn)程在每個(gè)周期內(nèi)必須執(zhí)行相同的指令,如果產(chǎn)生了沖突,例如一個(gè)線(xiàn)程束內(nèi)的16個(gè)線(xiàn)程需要執(zhí)行某一條指令,另外16個(gè)線(xiàn)程需要執(zhí)行另一條指令,此時(shí),線(xiàn)程束會(huì)先選擇其中的一條指令進(jìn)行處理,同時(shí)禁用不執(zhí)行這個(gè)命令的其他線(xiàn)程,這樣就會(huì)產(chǎn)生線(xiàn)程束分化,而這些被禁用的線(xiàn)程依舊在消耗寄存器資源,就會(huì)使得數(shù)據(jù)處理速度下降,線(xiàn)程束分化的越嚴(yán)重,性能下降越大,并行性削弱也越嚴(yán)重。
要避免線(xiàn)程束分化,除了在偽代碼層面要避免之外,在構(gòu)建邏輯布局的時(shí)候就要合理,并且邏輯布局中的線(xiàn)程數(shù)量越多,會(huì)增加數(shù)據(jù)處理的速度。因此,在嘗試建立不同的邏輯布局時(shí),應(yīng)該根據(jù)線(xiàn)程束的特性來(lái)構(gòu)建網(wǎng)格塊和線(xiàn)程塊的維度,而這只是建立在理論上,在實(shí)際的處理過(guò)程中,理論上性能優(yōu)越的邏輯布局可能會(huì)由于多方面因素影響使得數(shù)據(jù)處理速度達(dá)不到期望值。例如,理論上線(xiàn)程數(shù)量越大的邏輯布局應(yīng)當(dāng)能夠提升數(shù)據(jù)處理速度,但是在實(shí)際操作過(guò)程中,一個(gè)512×512的圖片應(yīng)用線(xiàn)程塊為64×1,網(wǎng)格塊16×1 024的邏輯布局時(shí),不僅在處理速度上沒(méi)有線(xiàn)程塊為16×1,網(wǎng)格塊16×512的邏輯布局塊,還出現(xiàn)了數(shù)據(jù)處理不完全的情況,導(dǎo)致圖片數(shù)據(jù)重建出來(lái)之后有些部分還是原圖片。這一現(xiàn)象在大量的實(shí)驗(yàn)中間歇性的出現(xiàn)在邏輯布局的線(xiàn)程數(shù)遠(yuǎn)超過(guò)圖片像素的情況下,并且當(dāng)邏輯布局的維度出現(xiàn)奇數(shù),例如線(xiàn)程塊為35×1,網(wǎng)格塊15×1 024這樣的布局時(shí),這樣的現(xiàn)象出現(xiàn)的次數(shù)變得更加頻繁。
因此,需要通過(guò)大量的實(shí)驗(yàn)找出能夠提升大分辨率圖像數(shù)據(jù)處理速度的,并且是通用的邏輯布局,同時(shí)還要避免為了追求處理速度而不斷增加線(xiàn)程數(shù)量,從而導(dǎo)致數(shù)據(jù)處理不完全的邏輯布局。而為了避免上文線(xiàn)程束分化的問(wèn)題,將線(xiàn)程塊和網(wǎng)格塊的橫坐標(biāo)方向維度定為了16、32、64、128,同時(shí),為了提升數(shù)據(jù)處理速度,要盡量的增加邏輯布局中的線(xiàn)程數(shù)量,在實(shí)際的實(shí)驗(yàn)過(guò)程中,將網(wǎng)格塊的縱坐標(biāo)維度和圖像的分辨率大小保持一致的時(shí)候數(shù)據(jù)的處理速度比較塊,并且不會(huì)出現(xiàn)數(shù)據(jù)處理不完全的情況。表1挑選了對(duì)于不同的邏輯布局下處理一份完整的圖像數(shù)據(jù)的實(shí)驗(yàn)中,比較有代表性的實(shí)驗(yàn)數(shù)據(jù)。
表1 不同邏輯布局下數(shù)據(jù)處理時(shí)間 ms
根據(jù)表1可以看出,不同的邏輯布局對(duì)于不同分辨率圖片的處理速度提升效果不一樣,對(duì)于256×256的圖片,線(xiàn)程塊為64×1,網(wǎng)格塊16×1 024的邏輯布局的線(xiàn)程數(shù)量不是最多的,卻是數(shù)據(jù)處理速度最快的,但是這種大線(xiàn)程量的邏輯布局并不適合256×256分辨率的圖片,因?yàn)樵趯?shí)際的處理過(guò)程中出現(xiàn)了數(shù)據(jù)處理不完全的情況。結(jié)合數(shù)據(jù)處理速度和數(shù)據(jù)處理完整度,線(xiàn)程塊為16×1,網(wǎng)格塊16×256的邏輯布局是最適合256×256分辨率的圖片的。同時(shí)可以看出,隨著圖像分辨率的增大,線(xiàn)程塊為64×1,網(wǎng)格塊16×1 024的邏輯布局的數(shù)據(jù)處理速度一直是比較快的,雖然在實(shí)際處理過(guò)程中應(yīng)用在小分辨率圖像上時(shí)會(huì)出現(xiàn)數(shù)據(jù)處理不完全的狀況,但是應(yīng)用在大分辨率圖像的處理過(guò)程中,數(shù)據(jù)處理速度是最快的,并且也不會(huì)出現(xiàn)數(shù)據(jù)處理不完全的情況,因此,通過(guò)大量的實(shí)驗(yàn)之后,本文對(duì)于大分辨率圖像的處理應(yīng)用線(xiàn)程塊為64×1,網(wǎng)格塊16×1 024的邏輯布局。
與CPU的同步特性不同,核函數(shù)的調(diào)用與主機(jī)是異步的,當(dāng)完成核函數(shù)調(diào)用的指令之后,會(huì)立即返回,不管運(yùn)算是否完成,因此CUDA有一個(gè)專(zhuān)門(mén)的函數(shù)是等核函數(shù)執(zhí)行完再進(jìn)行下一步運(yùn)算。
基于不同的同步特性,在進(jìn)行圖像的小波變換處理時(shí),通常情況下是將所有數(shù)據(jù)全部進(jìn)行小波變換行處理之后,再進(jìn)行小波變換列處理,接著將處理完成的數(shù)據(jù)取出進(jìn)行需要的圖像重建之類(lèi)的工作。這樣的方法在圖像數(shù)據(jù)量較小的情況下是沒(méi)有問(wèn)題的,但是在圖像數(shù)據(jù)量比較大的時(shí)候,就會(huì)拖慢數(shù)據(jù)處理速度。為了改進(jìn)這個(gè)缺點(diǎn),提高數(shù)據(jù)處理效率,對(duì)這個(gè)同步過(guò)程進(jìn)行了分析。這個(gè)過(guò)程簡(jiǎn)單來(lái)看就是取出數(shù)據(jù)、行方向變換、列方向變換、圖像重建四步,而根據(jù)GPU處理數(shù)據(jù)的速度來(lái)看,等待數(shù)據(jù)全部處理完成再進(jìn)行下一步是比較浪費(fèi)資源的,這也是在處理大分辨率數(shù)據(jù)時(shí)速度會(huì)比較慢的原因,因此,在這里進(jìn)行了一個(gè)數(shù)據(jù)的分割之后再進(jìn)行處理,具體流程為:取出第一份數(shù)據(jù)進(jìn)行并行計(jì)算,在完成第一份數(shù)據(jù)的并行行計(jì)算后,對(duì)第一份數(shù)據(jù)進(jìn)行并行列計(jì)算的同時(shí),取出第二份數(shù)據(jù)進(jìn)行并行行計(jì)算;在第一份數(shù)據(jù)完成并行列計(jì)算后,將數(shù)據(jù)放入上文提到的虛擬地址當(dāng)中;CPU從虛擬地址中取出第一份數(shù)據(jù)進(jìn)行圖像重建等操作的同時(shí),第二份數(shù)據(jù)完成并行行計(jì)算,開(kāi)始進(jìn)行并行列計(jì)算。循環(huán)這個(gè)過(guò)程直到所有數(shù)據(jù)完成處理。
對(duì)于圖像數(shù)據(jù)的分割,需要注意的是在分割的時(shí)候是否會(huì)造成圖像數(shù)據(jù)的損壞,造成圖像特征信息的丟失。本文對(duì)圖像數(shù)據(jù)進(jìn)行分割的時(shí)候只是為了將大量數(shù)據(jù)分成幾份,使得每次處理的數(shù)據(jù)量減小,從而加快數(shù)據(jù)處理速度,因此這里的分割只是數(shù)據(jù)量上的分割,不會(huì)造成信息的損壞以及特征的丟失問(wèn)題。將圖像數(shù)據(jù)分割不同的份數(shù)時(shí),會(huì)獲得不同的運(yùn)行效率,也會(huì)出現(xiàn)不同的問(wèn)題,而根據(jù)上文確定的二維線(xiàn)程塊邏輯布局,如果分割出的數(shù)據(jù)量是2的偶數(shù)倍的時(shí)候應(yīng)當(dāng)獲得最大的運(yùn)行效率,如果分割出的數(shù)據(jù)量是2的奇數(shù)倍的時(shí)候則有可能會(huì)出現(xiàn)運(yùn)行效率反而降低的情況。因此,在同一個(gè)硬件基礎(chǔ)上,本文將不同分辨率圖像各自分成不同的份數(shù),進(jìn)行對(duì)比實(shí)驗(yàn),如表2所示。
表2 不同分辨率下切割成不同份的數(shù)據(jù)處理時(shí)間 ms
根據(jù)表2可以看出,圖像分辨率較小的圖片,由于本身的數(shù)據(jù)處理時(shí)間就比較小,因此這種切割數(shù)據(jù),改變同步方式的方法的提升效果并不是很明顯,只有根據(jù)減少的時(shí)間相對(duì)于原始處理時(shí)間的比例可以看出還是有些較好的提升效果的。隨著圖片分辨率的提高,原始處理時(shí)間基數(shù)的增大,效果也變得逐漸明顯,而比較1 024×1 024和2 048×2 048兩個(gè)分辨率的實(shí)驗(yàn)結(jié)果可以看出,分辨率越大,提升效果雖然越大,可是相對(duì)于原始處理速度,提升的幅度在降低,不過(guò)提升的幅度也能達(dá)到22%,所以切割數(shù)據(jù)的方法效果還是較為顯著的。
比較1 024×1 024和2 048×2 048兩個(gè)大分辨率下不同切割份數(shù)的效果可以看出,隨著切割份數(shù)的增多,數(shù)據(jù)的處理時(shí)間不斷減小,但是并不是切割份數(shù)越多越好,從表2中可看到切割成6份時(shí)的處理時(shí)間不僅沒(méi)有減少,反而多于切割成4份時(shí)的處理時(shí)間,切割成10份的處理時(shí)間多于切割成8份的處理時(shí)間,因此,將數(shù)據(jù)切割成2的偶數(shù)倍份數(shù)是比較合理的,通過(guò)對(duì)比實(shí)驗(yàn)可以得出,切割成8份是效果最好的。
對(duì)于不同的環(huán)境,將數(shù)據(jù)分割所帶來(lái)的處理速度的提升幅度是一致的,因此只要比較一份完整的數(shù)據(jù)在哪種環(huán)境下處理速度最快,那么將數(shù)據(jù)分割后的數(shù)據(jù)處理速度也一定是最快的,因此,本文在CPU環(huán)境、SIMD結(jié)構(gòu)的GPU、SIMT結(jié)構(gòu)的GPU下分別對(duì)不同分辨率的同一張圖片,對(duì)二維離散哈爾小波變換的運(yùn)行時(shí)間進(jìn)行了對(duì)比試驗(yàn)。這里所用的CPU芯片型號(hào)為AMD Ryzen 7 5800H,SIMD架構(gòu)的顯卡型號(hào)為AMD的Radeon RX 6000,SIMT架構(gòu)的顯卡型號(hào)為NVIDIA的GeForce RTX 3060,表3列出了不同分辨率在不同環(huán)境中的速度,以及是否經(jīng)過(guò)優(yōu)化的速度。
表3 不同分辨率下的小波變換運(yùn)行時(shí)間 ms
單獨(dú)從小波變換的運(yùn)行時(shí)間來(lái)看,從表3中可以看出,圖片在小分辨率時(shí),CPU環(huán)境下最快運(yùn)行速度和GPU是相差不大的,隨著分辨率的增大,GPU的優(yōu)勢(shì)越來(lái)越明顯,而優(yōu)化后的GPU程序相對(duì)于CPU在2 048×2 048時(shí)提升幅度最大,為90.3%,相對(duì)于原始GPU程序的提升保持在40%以上,從架構(gòu)上來(lái)看,SIMT架構(gòu)的GPU比SIMD架構(gòu)的GPU最大快19.5%左右。
考慮到整個(gè)過(guò)程是包含圖像數(shù)據(jù)的讀取、GPU加載數(shù)據(jù)時(shí)間、小波變換計(jì)算時(shí)間以及內(nèi)存讀取結(jié)果并重建成圖像的時(shí)間。因此表4比較了CPU環(huán)境下最快運(yùn)行速度的運(yùn)算以及GPU環(huán)境下最快運(yùn)行速度的情況。
算上總體時(shí)間后,在圖片分辨率大于512×512之后,GPU的優(yōu)勢(shì)就已經(jīng)體現(xiàn)的較為明顯,分辨率大于1 024×1 024之后,SIMT架構(gòu)的GPU的優(yōu)勢(shì)也展現(xiàn)出來(lái)了,根據(jù)表4的數(shù)據(jù),SIMT架構(gòu)對(duì)比SIMD架構(gòu)的提升幅度最大為16.3%。SIMT架構(gòu)GPU對(duì)比CPU最大提升幅度為51.1%,提升幅度沒(méi)有只計(jì)算小波變換時(shí)間的幅度大,因?yàn)镚PU計(jì)算是有部分操作要先在CPU里做,提升的只有數(shù)據(jù)送進(jìn)GPU里之后的運(yùn)行速度,從時(shí)間上來(lái)看,已經(jīng)能夠達(dá)到實(shí)時(shí)處理的目的。
表4 不同尺寸的整體運(yùn)行時(shí)間 ms
針對(duì)大分辨率圖像處理實(shí)時(shí)性不足的問(wèn)題,本文通過(guò)GPU有大量可編程核心的特點(diǎn),采用了SIMT結(jié)構(gòu)的GPU對(duì)小波變換進(jìn)行并行公式推導(dǎo),通過(guò)大量的實(shí)驗(yàn),找出了SIMT結(jié)構(gòu)GPU下,對(duì)于大分辨率圖像處理速度最快,并且不會(huì)出現(xiàn)數(shù)據(jù)處理不完全情況的邏輯布局,在這種邏輯布局下,進(jìn)一步的將數(shù)據(jù)分割,改變了數(shù)據(jù)處理的同步方式,通過(guò)實(shí)驗(yàn)對(duì)比得出,針對(duì)大分辨率圖像,將數(shù)據(jù)分割成8份是處理速度最快的,同時(shí)改變了內(nèi)存的尋址方式,通過(guò)虛擬尋址進(jìn)一步提高了數(shù)據(jù)處理速度,并簡(jiǎn)化了偽代碼,在整體上提高了小波變換的運(yùn)行效率。同時(shí),實(shí)驗(yàn)通過(guò)對(duì)一份完整的大分辨率圖像數(shù)據(jù),比較了CPU環(huán)境下的串行算法和SIMT、SIMD架構(gòu)的GPU環(huán)境下的并行算法以及優(yōu)化后的算法,表明了在小波變換計(jì)算的效率上,隨著分辨率的增加,SIMT結(jié)構(gòu)GPU相對(duì)于CPU效率最大可到90.3%,SIMT比SIMD架構(gòu)的GPU效率高19.5%,優(yōu)化后的程序比優(yōu)化前的效率隨著分辨率增大最大可提升47.4%。在整個(gè)完成過(guò)程,包含了數(shù)據(jù)讀取、數(shù)據(jù)加載、小波變換以及內(nèi)存讀取并重建圖像的時(shí)間上,SIMT結(jié)構(gòu)GPU相對(duì)于CPU效率提升最大可到51.1%,SIMT比SIMD架構(gòu)的GPU效率高16.3%,表明了SIMT結(jié)構(gòu)GPU具有優(yōu)越性,并且達(dá)到了實(shí)時(shí)處理的目的,同時(shí),本方法也可移植于同類(lèi)問(wèn)題。