代碼。index表示當(dāng)前是第幾個CPU加載線程或是第幾個GPU控制線程,每一個CPU加載線程對應(yīng)一個GPU控制線程(每個GPU控制線程控制一個GPU的計算)。id是線程的識別號,GPUNUM為GPU線程的個數(shù),我們的實現(xiàn)中,前GPUNUM個線程為CPU加載線程,后GPUNUM個線程為GPU控制線程。對每個線程來說,它遍歷訪問圖片,多個加載線程或多個GPU控制線程將以round robin的方式來訪問。以兩個加載線程為例,第一個線程訪問單數(shù)號的圖片,第二個線程訪問雙數(shù)號的線程。加載線程中,int_img為加載完畢后的圖片數(shù)據(jù)結(jié)構(gòu),其中包括圖片的寬度、高度、和圖片中每個像素點的值。像素值是一個很大的數(shù)組,若每個圖片都要重新分配內(nèi)存則影響性能,我們在內(nèi)存優(yōu)化的過程中創(chuàng)建了一個緩存,里面事先分配好頂GBUFSIZE個圖片大小的數(shù)組,緩存中的數(shù)組是可以循環(huán)利用的,每次新建一個圖片數(shù)據(jù)結(jié)構(gòu)時,就將緩存中某一個數(shù)組分配給該int_img,并將數(shù)組清零即可,從而減少內(nèi)存分配的時間。當(dāng)數(shù)據(jù)加載完畢后,把int_img放到imgs_g這個數(shù)組中,并將對應(yīng)的f lag_g置為I,imgs_g數(shù)組和f lag_g數(shù)組大小都為頂GSIZE,且能夠被GPU控制線程所訪問XPU控制線程按順序訪問圖片,當(dāng)?shù)趇張圖片的flag不為I時就一直等待,等到該flag變成I,即圖片已經(jīng)加載完畢后,調(diào)用⑶DA方法DetDesO,需要計算的圖片數(shù)據(jù)已在imgs_g[i]中。每加載一張圖片loadnumber[index]++,每完成一張圖片的GPU運算,processed[index]++,當(dāng)loadnumber[index]- processed[index]大于緩存大小時,表明加載線程速度較快,加載線程需等待GHJ的計算。
[0036]由于GPU支持DMA異步傳輸?shù)奶攸c,和流水線相結(jié)合,可以進一步將數(shù)據(jù)傳輸部分的時間也重疊起來,即形成CPU計算、數(shù)據(jù)傳輸、以及GPU計算三個階段的流水線。形象地說,也就是當(dāng)CPU在進行第i張圖片的初始化計算時,同時將第1-Ι張圖片的初始化數(shù)據(jù)傳到GPU內(nèi)存中去,而GPU此時正在處理第1-2張圖片的特征檢測和描述?!揪唧w實施方式】如上述代碼所示,GPU控制線程中,若要調(diào)用CUDA方法計算第i張圖片,就需第i及第i+Ι張圖片都加載完畢。在06七068()方法中會用(311(^161]?^72048711(3()方法來異步傳輸?shù)谪? 1張圖片的數(shù)據(jù),從而使數(shù)據(jù)傳輸?shù)臅r間和GPU計算時間重疊起來。
[0037]另外,本發(fā)明還充分利用了CPU的剩余資源,讓多余的核也獨立完成部分算法,以提高性能。假設(shè)是4核的CPU,一個核用于控制GPU及數(shù)據(jù)傳輸,另一個核做CPU計算,那么另外的兩個核就可以獨立地完成部分圖片的特征提取計算,如圖2所示。
[0038](4)性能測試
本發(fā)明還包括詳細(xì)的測試結(jié)果,測試的主機是Intel Q8300的4核CPU,內(nèi)存大小為2GB。測試使用的GPU是GeForce GTX260,它有27個SM,總共216個核,時鐘率為1.24GHz,顯存大小為1GB。主機操作系統(tǒng)為Ubuntu 8.10(linux內(nèi)核版本為2.6.27-7-generic)。
[0039]如圖3所示,局部圖像特征提取算法在CPU串行執(zhí)行時,每計算一張圖片需393毫秒,也就是I秒鐘處理2.56張,該速度遠(yuǎn)遠(yuǎn)小于實時處理速度。在CPU上并行地進行SURF算法(按最快的分塊并行算),速度提升為14.86幀/秒。而細(xì)粒度的GPU實現(xiàn),將算法提高到74.45幀/秒,是CHJ上并行版本的5X。經(jīng)過GPU內(nèi)存優(yōu)化以及和CPU的協(xié)同工作,速度上升到84.56幀/秒和172.33幀/秒。該速度已達到實時的處理速度。
[0040]本發(fā)明還用了硬件配置為Intel 17的CI3U和GPUGTX295(480個核)做了進一步測試,測試結(jié)果表明,在該配置下,局部特征提取算法的速度高達340.47幀/秒。
【主權(quán)項】
1.一種基于GPU的圖像特征提取算法的加速方法,其特征在于: 首先在GPU上細(xì)粒度地實現(xiàn)圖像特征提取的并行算法,所謂細(xì)粒度是指在局部特征提取算法的每一個階段分別以最小的粒度,即按每個特征點,來開發(fā)數(shù)據(jù)并行;使用CUDA編程模型,將這種細(xì)粒度的數(shù)據(jù)并行映射到GPU上計算;所述的局部特征檢索算法采用檢索算法SURF; 所述的局部特征檢索算法檢測出圖像特征并對這些特征加以描述,它分為三階段:圖像初始化、特征檢測和特征描述;特征檢測與特征描述兩個部分放在GPU上計算; 所述圖像初始化,分為載入圖像、計算灰度圖像、計算積分圖像三步; 所述特征檢測,是利用積分圖像檢測出圖像的特征點;其中,首先計算每個點的特征值;此階段映射到GPU上時,每個點的特征值計算相對獨立,每個采樣像素點為一個GPU線程;具體使用0個內(nèi)核循環(huán)計算來避免GPU上的分支計算,oSSURF算法中圖像層數(shù);當(dāng)每個點的特征值計算完畢之后,即進入特征點定位階段;該階段在每8個相鄰點中選取特征值最大的點作為可選的特征點;每8個點為一個GPU線程進行計算; 所述特征描述,使用特定的數(shù)據(jù)結(jié)構(gòu)對找到的特征點加以描述,以方便以后對圖像的處理;其中,首先對每個特征點周圍的109個像素點做哈爾小波變換,該階段每個周圍的像素點為一個GHJ線程;接著,該109個周圍點對特征點的42個特征方向區(qū)域進行投票,票數(shù)最多的那個方向為該特征點的方向,該階段每個特征區(qū)域為一個GPU線程;最后,每個特征點生成一個64維特征向量,該向量的計算由特征點周圍4*4的區(qū)域中計算出來,因此,每個特征點又分為16個GPU線程來計算。2.根據(jù)權(quán)利要求1所述的基于GPU的圖像特征提取算法的加速方法,其特征在于:利用GPU內(nèi)存即GPU紋理存儲器在處理2維數(shù)據(jù)時的特點來提高算法性能,并盡可能地減少算法對內(nèi)存的反復(fù)分配與釋放;具體是對于S U R F算法中涉及的二維數(shù)組,用C U D A中cudaBindTexture2D方法綁定到GPU紋理存儲器上; 同時,SURF算法中在存儲原圖像、積分圖像、特征值、以及其他變量時,都在每張圖像處理開始和結(jié)尾進行內(nèi)存分配和釋放;在批量處理圖片時,在程序初始階段就分配好固定的內(nèi)存,從而減少多余的內(nèi)存分配與釋放。3.根據(jù)權(quán)利要求2所述的基于GPU的圖像特征提取算法的加速方法,其特征在于:使CPU和GPU以異步流水線的方式協(xié)同工作; 所謂流水線的方式是指將整個算法分成兩個部分,CPU處理第一部分的計算,GPU處理第二部分的計算,數(shù)據(jù)以流的方式在CHJ與GPU間傳輸,以實現(xiàn)兩個硬件并行工作;其中,CPU專門做初始化數(shù)據(jù)的計算,并把數(shù)據(jù)傳入GPU內(nèi)存,而GPU則從內(nèi)存中讀出積分圖像等數(shù)據(jù),并進行特征檢測與特征描述計算; 同時,由于GPU支持DMA異步傳輸?shù)奶攸c,和流水線相結(jié)合,進一步將數(shù)據(jù)傳輸部分的時間也重疊起來,即形成CPU計算、數(shù)據(jù)傳輸、以及GPU計算三個階段的流水線。4.根據(jù)權(quán)利要求3所述的基于GPU的圖像特征提取算法的加速方法,其特征在于:還利用CPU的剩余資源,讓CPU多余的核也獨立完成部分算法的處理。
【專利摘要】本發(fā)明屬于并行處理器技術(shù)領(lǐng)域,具體涉及一種基于GPU的圖像特征提取算法的加速方法。本發(fā)明主要對目前主流的圖像特征提取算法在GPU上進行了細(xì)粒度的并行實現(xiàn),同時根據(jù)GPU的特性進行了優(yōu)化加速,并且采用了異步流水線的協(xié)同工作機制來使CPU與GPU可以協(xié)同計算。測試結(jié)果表明,當(dāng)硬件配置為Intel?Q8300的CPU和GTX260的GPU時,算法速度為172.33幀/秒,是串行算法的67倍。而當(dāng)硬件配置為Intel?I7的CPU和GTX295的GPU時,速度高達340.47幀/秒,可以較好地滿足實時處理的需求。
【IPC分類】G06T1/20
【公開號】CN105550974
【申請?zhí)枴緾N201510915260
【發(fā)明人】張為華, 魯云萍
【申請人】復(fù)旦大學(xué)
【公開日】2016年5月4日
【申請日】2015年12月13日