專利名稱:一種運(yùn)動(dòng)估計(jì)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及圖像處理領(lǐng)域,具體涉及視頻編碼的運(yùn)動(dòng)估計(jì)方法。
背景技術(shù):
圖形處理器(GPU,Graphic Processing Unit)的處理速度在最近幾年得到了快速 的發(fā)展,其計(jì)算能力以每年2. 8倍的速度增長,高于CPU (Central Processing Unit,中央 處理器)的發(fā)展速度。GPU在并行數(shù)值處理能力上要遠(yuǎn)高于CPU。為了合理的利用GPU的 通用計(jì)算資源,統(tǒng)一計(jì)算設(shè)備架構(gòu)(CUDA,Compute Unified Device Architecture)應(yīng)運(yùn)而 生。CUDA是一種由Nvidia公司(英偉達(dá)公司)推出的通用并行計(jì)算架構(gòu),該架構(gòu)使GPU能 夠更有效的解決復(fù)雜計(jì)算問題?,F(xiàn)有的主流視頻壓縮算法都是基于運(yùn)動(dòng)估計(jì)塊匹配的,如H. 264/AVC.H. 263.AVS, VC-I等。其中,H. ^4/AVC標(biāo)準(zhǔn)是由ITU-T和IS0/IEC聯(lián)合開發(fā)的,定位于覆蓋整個(gè)視頻應(yīng) 用領(lǐng)域,包括低碼率的無線應(yīng)用、標(biāo)準(zhǔn)清晰度和高清晰度的電視廣播應(yīng)用、Internet上的視 頻流應(yīng)用,傳輸高清晰度的DVD視頻以及應(yīng)用于數(shù)碼相機(jī)的高質(zhì)量視頻應(yīng)用等;H. 263是國 際電聯(lián)ITU-T的一個(gè)標(biāo)準(zhǔn)草案,是為低碼流通信而設(shè)計(jì)的;AVS是我國具備自主知識產(chǎn)權(quán)的 第二代信源編碼標(biāo)準(zhǔn),是《信息技術(shù)先進(jìn)音視頻編碼》系列標(biāo)準(zhǔn)的簡稱,其包括系統(tǒng)、視頻、 音頻、數(shù)字版權(quán)管理等四個(gè)主要技術(shù)標(biāo)準(zhǔn)和符合性測試等支撐標(biāo)準(zhǔn);VC-I是由美國微軟公 司提出并開發(fā)的一種視頻編碼標(biāo)準(zhǔn)。在現(xiàn)有的視頻編碼方法中,大都采用以宏塊為單位的運(yùn)動(dòng)估計(jì)(ME,Motion Estimation)來實(shí)現(xiàn)幀間壓縮。其主要功能是,對當(dāng)前幀圖像中的一個(gè)被編碼像素塊在參 考幀圖像中的一個(gè)指定窗口中搜索與之相差最小的像素塊最為最佳匹配。運(yùn)動(dòng)估計(jì)中需要 得到兩個(gè)值一個(gè)是運(yùn)動(dòng)矢量(MV,Motion Vector),被編碼的像素塊相對于參考幀中最佳 匹配像素塊的偏移;另一個(gè)是被編碼像素塊與匹配像素塊的殘差絕對值之和SAD (Sum of Absolute Difference).這部分的計(jì)算占了整個(gè)編碼過程計(jì)算量的很大比重。在編碼算法中運(yùn)動(dòng)估計(jì)對編碼質(zhì)量和編碼器實(shí)現(xiàn)效率有著重要的影響。如H. 264 編碼算法中采用了 1/4像素精度的運(yùn)動(dòng)估計(jì)算法,以提高編碼效率。這必然導(dǎo)致編碼復(fù)雜 度的增加。運(yùn)動(dòng)估計(jì)的計(jì)算復(fù)雜度占到H.沈4的編碼器計(jì)算復(fù)雜度的30%以上。考慮到運(yùn) 動(dòng)估計(jì)在視頻編碼中的重要性,高效的運(yùn)動(dòng)估計(jì)算法實(shí)現(xiàn)成為視頻編碼器實(shí)現(xiàn)中的最關(guān)鍵 的部分。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是提供一種基于CUDA的高效的運(yùn)動(dòng)估計(jì)方法,以提 升運(yùn)動(dòng)估計(jì)的運(yùn)算效率。本發(fā)明解決上述技術(shù)問題的技術(shù)方案如下 一種運(yùn)動(dòng)估計(jì)方法,基于CUDA并行計(jì)算架構(gòu),包括 步驟1 利用CUDA流,將圖像數(shù)據(jù)從內(nèi)存復(fù)制到顯存;
3步驟2 對復(fù)制到顯存的圖像數(shù)據(jù)進(jìn)行七種分塊模式的SAD計(jì)算; 步驟3 對步驟2中得到的七種分塊模式的SAD值分別取優(yōu)。本發(fā)明的有益效果是采用CUDA并行計(jì)算架構(gòu),對圖像數(shù)據(jù)進(jìn)行并行處理,有效 的提升了整個(gè)運(yùn)動(dòng)估計(jì)的運(yùn)算效率。在上述技術(shù)方案的基礎(chǔ)上,本發(fā)明還可以做如下改進(jìn)。進(jìn)一步,步驟1中,利用不同的CUDA流從內(nèi)存向顯存復(fù)制同一圖像數(shù)據(jù)的不同部 分。采用上述進(jìn)一步方案的有益效果是,通過利用CUDA流,采用異步操作能夠提高數(shù) 據(jù)從內(nèi)存?zhèn)鬏數(shù)斤@存的效率,相對傳統(tǒng)非異步復(fù)制數(shù)據(jù)的效率提高了近30%。進(jìn)一步,步驟2中,所述七種分塊模式分別為4x4、4x8、8x4、8x8、8xl6、16x8和 16x16,其中,所述4x8、8x4、8x8、8xl6、16x8和16x16分塊模式SAD值的計(jì)算均通過4x4分 塊模式的SAD值合并而成。采用上述進(jìn)一步方案的有益效果是,通過所述4x4分塊模式的SAD值合并計(jì)算出 4x8,8x4,8x8,8x16,16x8和16x16分塊模式的SAD值,可以減少過多的計(jì)算過程,提高計(jì)算效率。進(jìn)一步,步驟3中,采用并行歸約的方式對每種分塊模式的SAD值進(jìn)行取優(yōu)。采用上述進(jìn)一步方案的有益效果是,采用并行歸約進(jìn)行取優(yōu)可以提升最優(yōu)SAD值 選取的計(jì)算速度,提高計(jì)算效率。
圖1為本發(fā)明提供的運(yùn)動(dòng)估計(jì)方法流程圖2為利用多CUDA流將圖像數(shù)據(jù)從CPU內(nèi)存GPU顯存的示意圖; 圖3為針對運(yùn)動(dòng)估計(jì)方法的SAD值合并示意圖; 圖4為最優(yōu)SAD值選取計(jì)算中采用的并行歸約方式的示意圖。
具體實(shí)施例方式以下結(jié)合附圖對本發(fā)明的原理和特征進(jìn)行描述,所舉實(shí)例只用于解釋本發(fā)明,并 非用于限定本發(fā)明的范圍。以下實(shí)施例提供了一種基于CUDA的全新的高效的運(yùn)動(dòng)估計(jì)算法的GPU實(shí)現(xiàn)方法 (運(yùn)動(dòng)估計(jì)方法),參照圖1,主要包括如下的三個(gè)步驟
1.基于CUDA流處理的數(shù)據(jù)準(zhǔn)備;
2.高效的針對ME算法的SAD計(jì)算優(yōu)化;
3.基于歸約的高效的分塊模式SAD值的合并。此方法從數(shù)據(jù)準(zhǔn)備、SAD計(jì)算和合并等方面均針對運(yùn)動(dòng)估計(jì)算法進(jìn)行專門優(yōu)化設(shè) 計(jì),從而有效的提升了整個(gè)運(yùn)動(dòng)估計(jì)的運(yùn)算效率,也構(gòu)成了本發(fā)明的高效的基于CUDA的運(yùn) 動(dòng)估計(jì)方法?;贑UDA流處理的數(shù)據(jù)準(zhǔn)備
GPU在處理有規(guī)律的并行數(shù)據(jù)上有很大速度的提升,但是從主機(jī)內(nèi)存復(fù)制數(shù)據(jù)到顯存 上的速度卻比較消耗時(shí)間。為了讓GPU以最高的效率進(jìn)行處理,在從主機(jī)內(nèi)存到GPU顯存的數(shù)據(jù)準(zhǔn)備上采用了 CUDA流處理的方法。 每個(gè)CUDA流是按順序執(zhí)行的一系列操作,而不同的CUDA流之間是亂序執(zhí)行的。通 過對CUDA流的并行管理,可以實(shí)現(xiàn)不同CUDA流有序的并發(fā)執(zhí)行。不同的CUDA流對應(yīng)不同數(shù)據(jù)塊位置的起始點(diǎn),采用異步操作能夠提高數(shù)據(jù)從主 機(jī)內(nèi)存?zhèn)鬏數(shù)紾PU顯存的效率。如圖2所示,流1處理圖像的上半部分,流2處理圖像的下 半部分,兩個(gè)部分在多CUDA流中進(jìn)行異步的并行操作,從而很大的提高了效率。具體實(shí)施時(shí),先在程序中聲明一個(gè)⑶DA流的結(jié)構(gòu)數(shù)組 cudaStream—t cpystream[2]
然后對其進(jìn)行初始化,如下 for( int i = 0 ; i < 2 ; ++i ) cudaStreamCreate(&scpystream[i]);
CUDA流初始化后就可對其進(jìn)行復(fù)制操作,復(fù)制過程按照圖2分布所示用流1復(fù)制上 半部分,用流2復(fù)制下半部分,操作如下
for( int i = 0 ; i < 2 ; ++i )
{
cudaMemcpyAsyc( HostBuf + i * size / sizeof (float),
DevBuf + I * size,size , cudamemcpydevicetohost,&stream[i]);
ι
上面多CUDA流復(fù)制數(shù)據(jù)的操作,相對傳統(tǒng)非異步復(fù)制數(shù)據(jù)的效率提高了近30%。高效的針對運(yùn)動(dòng)估計(jì)方法的SAD計(jì)算的優(yōu)化
將主機(jī)上的內(nèi)存數(shù)據(jù)傳輸?shù)紾PU上之后,需要對4x4分塊模式的SAD值進(jìn)行計(jì)算。運(yùn)動(dòng) 估計(jì)要求實(shí)現(xiàn)七種不同分塊模式的3々0值,分別是414、418、814、818、8116、1618和16x16。 由于每個(gè)分塊模式SAD值的計(jì)算都可以通過4x4分塊模式的SAD值合并進(jìn)行計(jì)算。為了減 少了過多的計(jì)算過程,在求出4x4分塊模式的SAD值后,可以通過合并得到其余6種不同分 塊模式的SAD值??紤]到每個(gè)源圖上的4x4塊都有一個(gè)16x16的搜索范圍,這里線程塊的 最大線程數(shù)設(shè)為16x16,這樣線程塊里每個(gè)線程就可以對應(yīng)于16x16搜索范圍的一個(gè)點(diǎn)來 進(jìn)行并行的計(jì)算,從而省去很多定位的工作。合并的過程參照圖3所示,圖3中每個(gè)字母對應(yīng)一個(gè)4x4的塊,故整體為16x16。先 將虹8的塊合并出來,一共有8個(gè)塊,分別是AE、IM、BF、JN、CG、K0、DH、LP。然后再求8x4 的塊,一共有8個(gè)塊,分別是AB、⑶、EF、GH、IJ、KL、麗、0P。求完8x4的塊后,將其求得的 值再次合并成8x8的4個(gè)塊,分別是ABEF、⑶GH、IJMN, KL0P。8x8的塊求出后,再根據(jù)8x8 的四個(gè)塊求出16x8、8xl6和16x16的塊。其中,16x8的塊為ABCDEFGH禾口 IJKLMN0P, 8x16的 塊為ABEFIJMN和CDGHKL0P,16x16的塊為ABCDEFGHIJKLMNOP。上面的一對字母合并代表著 兩個(gè)4x4塊的合并。由于最大的子塊是16x16,所以線程塊分為圖像的寬/16,圖像的高/16。由于一 個(gè)源圖上的4x4塊都有一個(gè)16x16的搜索范圍,所以16個(gè)塊就是一個(gè)64x64的矩陣,為了 達(dá)到合并矩陣的最佳效果,將64x64的矩陣塊讀入GPU的共享內(nèi)存中?;贑UDA的設(shè)計(jì)架 構(gòu),6虹64的矩陣塊正好能夠使CUDA的并行度達(dá)到最佳,從而可以讓GPU在進(jìn)行合并計(jì)算時(shí) 發(fā)揮最大的效率。
基于并行歸約的高效的分塊模式SAD值合并
上述計(jì)算完成后,需將計(jì)算得來的七個(gè)分塊模式SAD值分別取優(yōu)。這里將每個(gè)矩陣塊 放在單獨(dú)的GPU內(nèi)核中,通過七個(gè)流進(jìn)行并行計(jì)算,充分利用GPU的運(yùn)算資源,減小計(jì)算的 等待時(shí)間,以提高計(jì)算效率。每個(gè)塊的計(jì)算過程是通過并行歸約的方式進(jìn)行的,如圖4所
7J\ ο并行歸約存儲(chǔ)空間大小必須為2的整數(shù)次方,否則將出現(xiàn)比對不均的情況,這會(huì) 加大GPU處理的負(fù)擔(dān)。GPU物理結(jié)構(gòu)中每個(gè)純線程塊最優(yōu)上限是256字節(jié)的共享內(nèi)存,如果 超出上限,該部分將被分配到其它塊上,而其它塊也會(huì)繼續(xù)向后傳遞分配,導(dǎo)致GPU核心計(jì) 算部分的速處理度下降,從而影響性能。因此,這里選用256字節(jié)的共享內(nèi)存為并行歸約計(jì) 算時(shí)的存儲(chǔ)空間大小。如圖4所示,第一次循環(huán)將相鄰兩個(gè)數(shù)相加,并將值保存在“被加數(shù)”的索引位置 上;第二輪循環(huán),由于相鄰兩個(gè)數(shù)已加過,這時(shí)增大加數(shù)索引,如圖4所示,這里為1、3相加, 5、7相加,9、11相加;后面以此類推,最后索引1的位置就是加后的總和。這種操作充分利 用了 CUDA并行的優(yōu)點(diǎn),從而提升了在GPU中加法的速度。上述運(yùn)動(dòng)估計(jì)方法充分利用了 CUDA的特性,有效的提升了運(yùn)動(dòng)估計(jì)算法的運(yùn)算 效率,同時(shí)保證了運(yùn)動(dòng)估計(jì)算法的效果。上述運(yùn)動(dòng)估計(jì)方法能夠有效地應(yīng)用于基于塊運(yùn)動(dòng) 估計(jì)的視頻編碼算法系統(tǒng)中,為系統(tǒng)提供高效的運(yùn)動(dòng)估計(jì)算法實(shí)現(xiàn)。該方法從CPU到GUP 實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)姆椒ǔ浞掷昧?CUDA的流特性,高效地完成了運(yùn)動(dòng)估計(jì)所需的數(shù)據(jù)傳輸 需求;利用基于CUDA線程結(jié)構(gòu)進(jìn)行有效的塊合并,實(shí)現(xiàn)了全部分塊模式SAD值的高效運(yùn)算; 基于并行歸約的最優(yōu)分塊模式SAD值的選擇,有效地減少了最優(yōu)分塊模式SAD值選擇所需 的時(shí)間。 以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和 原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種運(yùn)動(dòng)估計(jì)方法,基于CUDA并行計(jì)算架構(gòu),其特征在于,包括 步驟1 利用CUDA流,將圖像數(shù)據(jù)從內(nèi)存復(fù)制到顯存;步驟2 對復(fù)制到顯存的圖像數(shù)據(jù)進(jìn)行七種分塊模式的SAD計(jì)算; 步驟3 對步驟2中得到的七種分塊模式的SAD值分別取優(yōu)。
2.根據(jù)權(quán)利要求1所述的運(yùn)動(dòng)估計(jì)方法,其特征在于步驟1中,利用不同的CUDA流, 并采用異步操作從內(nèi)存向顯存復(fù)制同一圖像數(shù)據(jù)的不同部分。
3.根據(jù)權(quán)利要求1所述的運(yùn)動(dòng)估計(jì)方法,其特征在于步驟2中,所述七種分塊模式分 別為 4x4、4x8、8x4、8x8、8xl6、16x8 和 16x16,其中,所述 4x8、8x4、8x8、8xl6、16x8 和 16x16 分塊模式的SAD值均通過4x4分塊模式的SAD值合并而成。
4.根據(jù)權(quán)利要求1所述的運(yùn)動(dòng)估計(jì)方法,其特征在于步驟3中,采用并行歸約的方式 對每種分塊模式的SAD值進(jìn)行取優(yōu)。
全文摘要
本發(fā)明涉及一種運(yùn)動(dòng)估計(jì)方法,包括步驟1利用CUDA流,將用于ME算法的圖像數(shù)據(jù)從內(nèi)存復(fù)制到顯存;步驟2基于CUDA并行計(jì)算架構(gòu),對復(fù)制到顯存的數(shù)據(jù)進(jìn)行七種分塊模式的SAD計(jì)算;步驟3基于CUDA并行計(jì)算架構(gòu),對步驟2中得到的七種分塊模式的SAD值分別取優(yōu)。本發(fā)明采用CUDA并行計(jì)算架構(gòu),對圖像數(shù)據(jù)進(jìn)行并行處理,有效的提升了整個(gè)運(yùn)動(dòng)估計(jì)的運(yùn)算效率。
文檔編號H04N7/26GK102143365SQ20111012317
公開日2011年8月3日 申請日期2011年5月13日 優(yōu)先權(quán)日2011年5月13日
發(fā)明者張浩佚, 武宇文, 王彤 申請人:萬輝視訊(北京)科技有限公司