一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法
【專利摘要】本發(fā)明公開(kāi)一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,包括步驟:在可編程并行處理器中建立線程組,線程組包括線程;將N×N的當(dāng)前幀宏塊分割成多個(gè)當(dāng)前幀子塊,每個(gè)當(dāng)前幀子塊與線程建立一一對(duì)應(yīng)的映射關(guān)系;將當(dāng)前幀宏塊加載到可編程并行處理器的共享內(nèi)存;對(duì)當(dāng)前幀宏塊進(jìn)行搜索時(shí),直接通過(guò)線程調(diào)用共享內(nèi)存的當(dāng)前幀子塊數(shù)據(jù);所述N為自然數(shù)。本發(fā)明將每個(gè)當(dāng)前幀宏塊的處理映射到一個(gè)GPU線程組中,從而能夠很方便的將該宏塊的數(shù)據(jù)加載進(jìn)GPU的片內(nèi)共享內(nèi)存,實(shí)現(xiàn)線程組內(nèi)共享當(dāng)前宏塊數(shù)據(jù)。這樣,在此宏塊對(duì)應(yīng)的整個(gè)搜索區(qū)域的處理過(guò)程中,不必再重復(fù)從顯存中加載該數(shù)據(jù),從而節(jié)約了寶貴的片外訪存帶寬。
【專利說(shuō)明】一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及圖像壓縮領(lǐng)域,更具體的說(shuō),涉及一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法。
【背景技術(shù)】
[0002]在基于運(yùn)動(dòng)補(bǔ)償?shù)囊曨l編碼系統(tǒng)中,運(yùn)動(dòng)估計(jì)是計(jì)算量最大、訪存帶寬要求最高的環(huán)節(jié)。它往往通過(guò)在參考幀中尋找相對(duì)于當(dāng)前宏塊的最優(yōu)匹配塊,來(lái)降低視頻數(shù)據(jù)的時(shí)間域相關(guān)性,從而達(dá)到壓縮的目的。由于幀尺寸大、搜索范圍大、參考幀數(shù)量多等原因,高質(zhì)量視頻編碼系統(tǒng)中的運(yùn)動(dòng)搜索需要極大的訪存帶寬。
[0003]圖形處理器(GPU)是一種新興的并行計(jì)算設(shè)備,相對(duì)于普通多核CPU計(jì)算的有限并行能力而言,其大規(guī)模數(shù)據(jù)并行的特點(diǎn),有助于解決高質(zhì)量視頻編碼算法,尤其是整像素運(yùn)動(dòng)估計(jì)的全搜索算法的巨大計(jì)算量問(wèn)題。相對(duì)于CPU,其優(yōu)勢(shì)在于單位時(shí)間理論計(jì)算能力,而劣勢(shì)在于其片外訪存帶寬的瓶頸。
[0004]以H.264的整像素運(yùn)動(dòng)估計(jì)為例,對(duì)當(dāng)前幀的每一個(gè)16x16大小的宏塊(MB),在其參考幀內(nèi)都有對(duì)應(yīng)的運(yùn)動(dòng)估計(jì)搜索范圍,每一個(gè)搜索位置都對(duì)應(yīng)于宏塊的一個(gè)運(yùn)動(dòng)向量(motion vector,以下簡(jiǎn)稱MV)。而每一個(gè)宏塊又可以分為16x8,8x16,8x8,8x4,4x8,4x4大小的子塊。僅以一個(gè)4x4子塊的整像素全搜索為例,假設(shè)參考幀數(shù)僅為1,對(duì)一幅長(zhǎng)為width,寬為heigtht,搜索寬度為search_range的視頻幀,需要搜索的位置N =width/4*height/4*search_range2。以1080P高清視頻,搜索寬度為32的典型情況為例,一幀視頻的全搜索量將達(dá)132710400之多!
[0005]由于全搜索算法的本質(zhì)是基于宏塊的,因此非常適合GPU的并行實(shí)現(xiàn)。但是算法需要對(duì)參考幀進(jìn)行大量反復(fù)的讀取,由于GPU的訪存帶寬有限,算法未經(jīng)優(yōu)化將很難達(dá)到較高的效率。
【發(fā)明內(nèi)容】
[0006]本發(fā)明所要解決的技術(shù)問(wèn)題是提供一種能降低可編程并行處理器訪存數(shù)據(jù)量的基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法。
[0007]本發(fā)明的目的是通過(guò)以下技術(shù)方案來(lái)實(shí)現(xiàn)的:
[0008]一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,包括步驟:
[0009]在可編程并行處理器中建立線程組,線程組包括線程;
[0010]將NXN的當(dāng)前幀宏塊分割成多個(gè)當(dāng)前幀子塊,每個(gè)當(dāng)前幀子塊與線程建立--
對(duì)應(yīng)的映射關(guān)系;
[0011]每個(gè)線程將對(duì)應(yīng)的當(dāng)前幀子塊加載到可編程并行處理器的共享內(nèi)存;
[0012]所述N為自然數(shù)。
[0013]進(jìn)一步的,所述全搜索運(yùn)動(dòng)估計(jì)方法還包括參考幀的讀取步驟:
[0014]每個(gè)當(dāng)前幀宏塊在參考幀中都有一個(gè)對(duì)應(yīng)的對(duì)位宏塊(co-located MB),以對(duì)位宏塊為中心,建立MXM的搜索塊,所述M為大于N的自然數(shù);
[0015]將搜索塊分割成多個(gè)搜索子塊,搜索子塊與線程建立一一對(duì)應(yīng)的映射關(guān)系;
[0016]每個(gè)線程將對(duì)應(yīng)的搜索子塊加載到可編程并行處理器的共享內(nèi)存。通過(guò)線程來(lái)均分讀取MXM的搜索塊的數(shù)據(jù),每個(gè)線程獨(dú)立并列運(yùn)行,互不影響,讀取數(shù)據(jù)的速度和效果都有顯著提升。
[0017]進(jìn)一步的,所述全搜索運(yùn)動(dòng)估計(jì)方法還包括宏塊的全搜索運(yùn)算步驟:
[0018]所述對(duì)位宏塊在搜索塊中有多種二維位移量,每種位移量形成一個(gè)參考宏塊,所有參考宏塊的集合形成一個(gè)搜索范圍;所述每個(gè)線程至少對(duì)一個(gè)參考宏塊進(jìn)行搜索運(yùn)算,得出局部最優(yōu)結(jié)果;每個(gè)線程對(duì)應(yīng)的參考宏塊的集合構(gòu)成一個(gè)搜索片區(qū),
[0019]匯總所有線程的局部最優(yōu)結(jié)果,然后計(jì)算當(dāng)前幀宏塊在整個(gè)搜索塊內(nèi)的最優(yōu)的搜索結(jié)果。完成當(dāng)前幀宏塊及其對(duì)應(yīng)的參考幀搜索塊數(shù)據(jù)載入,進(jìn)入搜索階段。
[0020]此時(shí)需要將對(duì)位宏塊在搜索塊的范圍內(nèi)進(jìn)行位移,對(duì)位宏塊每一種的移位都會(huì)產(chǎn)生一個(gè)新宏塊數(shù)據(jù)(設(shè)為參考宏塊),采用排列組合的方式,每個(gè)對(duì)位宏塊可以在搜索塊中組合出(M-N)x(M-N)個(gè)不同的參考宏塊,當(dāng)前幀宏塊需要跟每個(gè)參考宏塊進(jìn)行對(duì)比,計(jì)算殘差(SAD)值,最終得到最優(yōu)代價(jià)和運(yùn)動(dòng)矢量W。為了提升運(yùn)算效率,可以將所有的參考宏塊的搜索運(yùn)算均攤到每個(gè)線程,每個(gè)線程讀取整個(gè)當(dāng)前幀宏塊數(shù)據(jù),然后分別跟其負(fù)責(zé)的參考宏塊進(jìn)行一一對(duì)比,最終得到局部最優(yōu)結(jié)果,這樣每個(gè)線程之間并行運(yùn)算,互不影響,大幅提升了運(yùn)算效率。
[0021]進(jìn)一步的,可編程并行處理器包括第一運(yùn)算內(nèi)核和第二運(yùn)算內(nèi)核,在可編程并行處理器中啟動(dòng)第一運(yùn)算內(nèi)核,第一運(yùn)算內(nèi)核包括多個(gè)線程,每個(gè)線程從共享內(nèi)存中讀取當(dāng)前幀宏塊和搜索塊數(shù)據(jù);在其搜索片區(qū)中計(jì)算所述局部最優(yōu)結(jié)果,
[0022]將每個(gè)線程的局部最優(yōu)結(jié)果存儲(chǔ)到外部存儲(chǔ)器,然后在可編程并行處理器中啟動(dòng)第二運(yùn)算內(nèi)核,第二運(yùn)算內(nèi)核從外部存儲(chǔ)器讀取每個(gè)局部最優(yōu)結(jié)果,計(jì)算出當(dāng)前幀宏塊在整個(gè)搜索塊內(nèi)的最優(yōu)的搜索結(jié)果。寄存器是各自線程自己能看到,而共享內(nèi)存、外部存儲(chǔ)器則能夠被所有的線程訪問(wèn),由于共享內(nèi)存不占用外部的訪存帶寬,因此將整個(gè)宏塊的當(dāng)前幀宏塊存儲(chǔ)到共享內(nèi)存。
[0023]進(jìn)一步的,每個(gè)線程遍歷所有可能的模式進(jìn)行全搜索,每次計(jì)算得到的搜索結(jié)果存儲(chǔ)對(duì)應(yīng)的寄存器中,所述搜索結(jié)果包括運(yùn)動(dòng)向量和編碼代價(jià);
[0024]如果計(jì)算的編碼代價(jià)小于寄存器的編碼代價(jià),用當(dāng)前計(jì)算的編碼代價(jià)替換寄存器的編碼代價(jià),
[0025]每個(gè)線程完成其搜索片區(qū)的搜索運(yùn)算后,寄存器存儲(chǔ)的運(yùn)動(dòng)向量和編碼代價(jià)為局部最優(yōu)結(jié)果。總的來(lái)說(shuō),訪存帶寬水平:寄存器明顯大于共享內(nèi)存,共享內(nèi)存遠(yuǎn)大于外部存儲(chǔ)器,線程每次的結(jié)果存在寄存器中,最后完成遍歷時(shí)才從寄存器寫(xiě)外部存儲(chǔ)器,這樣省訪存帶寬。
[0026]第一運(yùn)算內(nèi)核在線程組加載了對(duì)應(yīng)的當(dāng)前幀宏塊及參考幀的搜索塊數(shù)據(jù)后,對(duì)每一個(gè)線程,首先依次遍歷其所負(fù)責(zé)的2x2搜索片區(qū)(即4個(gè)參考宏塊數(shù)據(jù)),依次求得每個(gè)4x4子塊的SAD值,寫(xiě)入臨時(shí)寄存器中,并不占用片外的全局內(nèi)存。求得4x4子塊的SAD值后,同樣通過(guò)累加得出8x4,4x8,16x8,8x16,16x16等各種其他模式的SAD值,同樣存在臨時(shí)寄存器中。繼續(xù)在遍歷過(guò)程中,對(duì)每一種模式分別更新其最佳的運(yùn)動(dòng)向量(MV)和編碼代價(jià)(初始化為無(wú)窮大,每當(dāng)當(dāng)前搜索位置計(jì)算所得之代價(jià)小于目前已知的最佳代價(jià),就更新它)。這樣當(dāng)遍歷完畢,每一個(gè)線程都將得出其2x2搜索范圍內(nèi)的最佳MV和編碼代價(jià),這些數(shù)據(jù)將作為中間數(shù)據(jù)寫(xiě)入于片外全局內(nèi)存中。該數(shù)據(jù)的組織可視為一個(gè)二維數(shù)組,其元素尺寸與原始視頻幀相同,每個(gè)元素則包含了其對(duì)應(yīng)的當(dāng)前幀像素所在宏塊的局部最佳MV和相應(yīng)的搜索代價(jià)。
[0027]第二運(yùn)算內(nèi)核設(shè)計(jì)為每個(gè)線程負(fù)責(zé)一個(gè)宏塊的進(jìn)一步處理,即每個(gè)線程可視為進(jìn)行中間數(shù)據(jù)中16x16元素的讀入,然后通過(guò)遍歷該區(qū)域的數(shù)據(jù),依次比較各局部最優(yōu)的結(jié)果,最終得到當(dāng)前宏塊在整個(gè)32x32搜索區(qū)域中全局最優(yōu)的MV及其編碼代價(jià)。此后便可以進(jìn)行最佳模式的選擇,以及細(xì)化的分像素運(yùn)動(dòng)估計(jì)。
[0028]進(jìn)一步的,相鄰兩個(gè)搜索塊重疊,形成重疊區(qū),非重疊部分形成增量區(qū);
[0029]對(duì)于每一行的當(dāng)前幀宏塊,每個(gè)線程組先從紋理內(nèi)存讀取第一個(gè)當(dāng)前幀對(duì)應(yīng)的搜索塊數(shù)據(jù);
[0030]后續(xù)當(dāng)前幀宏塊僅從紋理內(nèi)存讀取搜索塊的增量區(qū)數(shù)據(jù);同時(shí)將該增量區(qū)對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)到共享內(nèi)存,作為下一個(gè)當(dāng)前幀宏塊搜索的重疊區(qū)數(shù)據(jù)。假設(shè)參考幀中的搜索塊(SW)是一個(gè)以相應(yīng)當(dāng)前巾貞位置為中心的寬度為S_width高度為S_height的矩形,一行宏塊數(shù)量為MBh,一列宏塊數(shù)量為MBV。相鄰的搜索塊是重疊的,不再相互獨(dú)立。兩個(gè)相鄰搜索塊的重疊的搜索區(qū)域大小為S_heightX (S_width_MB_width),其中MB_width是當(dāng)前宏塊的寬度,
[0031]現(xiàn)有技術(shù)載入搜索窗數(shù)據(jù)所需的片外訪存帶寬為:
[0032]Bff_normal = MBhX (S_height X S_width) XMBv
[0033]采用本技術(shù)方案進(jìn)行數(shù)據(jù)重用優(yōu)化后的訪存帶寬為:
[0034]Bff_proposed = (S_height X S_width+ (MBh-1) X S_height XMB_width) XMBv
[0035]以宏塊大小為16xl6,VGA分辨率(即MBh為40,MBV為30),搜索塊為48x48的情況為例,本優(yōu)化的訪存帶寬節(jié)省率將達(dá)到近三倍:
[0036]Bff_proposed/Bff_normal = (48 X 48+39 X 48 X 16) / (40 X 48 X 48) = 1/2.86
[0037]不難看出,對(duì)于高分辨率的視頻幀,隨著水平方向宏塊數(shù)的增多,此優(yōu)化比率將更高。因此,在高清視頻日益占主流的今天,該優(yōu)化的價(jià)值不言而喻。
[0038]進(jìn)一步的,可編程并行處理器包括第一運(yùn)算內(nèi)核和第二運(yùn)算內(nèi)核,在可編程并行處理器中啟動(dòng)第一運(yùn)算內(nèi)核,第一運(yùn)算內(nèi)核同時(shí)運(yùn)行一列宏塊數(shù)量對(duì)應(yīng)的線程組。
[0039]進(jìn)一步的,所述當(dāng)前幀和參考幀先預(yù)存到紋理內(nèi)存,所述線程從紋理內(nèi)存中讀取當(dāng)前幀和參考幀數(shù)據(jù),然后存儲(chǔ)到可編程并行處理器中的共享內(nèi)存。對(duì)當(dāng)前幀宏塊進(jìn)行搜索時(shí),直接通過(guò)共享內(nèi)存讀取參考幀對(duì)應(yīng)的宏塊數(shù)據(jù)。與普通的一維全局內(nèi)存訪問(wèn)方式不同,可編程并行處理器(以下以GPU為例進(jìn)行說(shuō)明)片內(nèi)的共享內(nèi)存,即其內(nèi)部的存儲(chǔ)空間對(duì)二維空間的局域訪問(wèn)有優(yōu)化,因此當(dāng)相鄰的GPU線程訪問(wèn)二維空間中相近的區(qū)域時(shí),其訪存效率較高。針對(duì)這一特點(diǎn),本技術(shù)方案首先將當(dāng)前幀宏塊和參考幀加載為紋理內(nèi)存,而不是以普通的全局內(nèi)存形式存在于片外,這樣只要當(dāng)前線程所需的數(shù)據(jù)已經(jīng)在片內(nèi)的紋理高速緩存中,就可以節(jié)約寶貴的訪存帶寬。此外,由于共享內(nèi)存具有內(nèi)建的邊界處理機(jī)制,不必占用計(jì)算資源來(lái)對(duì)邊界進(jìn)行特殊處理,方便了算法實(shí)現(xiàn)。
[0040]紋理內(nèi)存其實(shí)就是物理上的外部?jī)?nèi)存,對(duì)應(yīng)GPU而言,即為獨(dú)立于GPU芯片存在于顯卡上的顯存芯片,兩者之間通過(guò)芯片級(jí)數(shù)據(jù)總線連接,通信速度會(huì)慢于GPU芯片的計(jì)算單元跟共享存儲(chǔ)器在芯片內(nèi)直接通信,跟普通方式訪問(wèn)外部存儲(chǔ)器的方式有所不同,就是當(dāng)數(shù)據(jù)是按紋理內(nèi)存方式存在外存時(shí),GPU運(yùn)算核心讀取它時(shí)會(huì)把處理器芯片內(nèi)的紋理緩存(texture cache)用起來(lái),因此產(chǎn)生(2D空間相關(guān)性)訪存優(yōu)化效果。
[0041]進(jìn)一步的,所述可編程并行處理器為GPU。
[0042]進(jìn)一步的,每個(gè)線程組的線程數(shù)量等于對(duì)應(yīng)當(dāng)前幀宏塊的像素?cái)?shù)量,每個(gè)當(dāng)前幀子塊代表一個(gè)像素的數(shù)據(jù)。
[0043]經(jīng)研究,現(xiàn)有技術(shù)每一次對(duì)當(dāng)前幀宏塊與對(duì)位宏塊求SAD值,都要重新加載當(dāng)前幀宏塊數(shù)據(jù),這就浪費(fèi)了訪存帶寬。本發(fā)明將每個(gè)當(dāng)前幀宏塊的處理映射到一個(gè)GPU線程組中,從而能夠很方便的將該宏塊的數(shù)據(jù)加載進(jìn)GPU的片內(nèi)共享內(nèi)存,實(shí)現(xiàn)線程組內(nèi)共享當(dāng)前宏塊數(shù)據(jù)。這樣,在此宏塊對(duì)應(yīng)的整個(gè)搜索區(qū)域的處理過(guò)程中,不必再重復(fù)從顯存中加載該數(shù)據(jù),從而節(jié)約了寶貴的片外訪存帶寬。另外,通過(guò)線程來(lái)均分讀取當(dāng)前幀宏塊的數(shù)據(jù),每個(gè)線程獨(dú)立并列運(yùn)行,互不影響,讀取數(shù)據(jù)的速度和效果都有顯著提升。
【專利附圖】
【附圖說(shuō)明】
[0044]圖1是本發(fā)明基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法的方法示意圖;
[0045]圖2是本發(fā)明實(shí)施例的兩個(gè)相鄰搜索位置的搜索塊重疊的示意圖;
[0046]圖3是本發(fā)明實(shí)施例的參考幀搜索塊的數(shù)據(jù)重用原理示意圖; [0047]圖4是本發(fā)明實(shí)施例的壓縮中間數(shù)據(jù)的方法示意圖。
【具體實(shí)施方式】
[0048]一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,包括步驟:
[0049]在可編程并行處理器中建立線程組,線程組包括線程;
[0050]將NXN的當(dāng)前幀宏塊分割成多個(gè)當(dāng)前幀子塊,每個(gè)當(dāng)前幀子塊與線程建立--
對(duì)應(yīng)的映射關(guān)系;
[0051]每個(gè)線程將對(duì)應(yīng)的當(dāng)前幀子塊加載到可編程并行處理器的共享內(nèi)存;
[0052]所述N為自然數(shù)。
[0053]經(jīng)研究,現(xiàn)有技術(shù)每一次對(duì)當(dāng)前幀宏塊與對(duì)位宏塊求SAD值,都要重新加載當(dāng)前幀宏塊數(shù)據(jù),這就浪費(fèi)了訪存帶寬。本發(fā)明將每個(gè)當(dāng)前幀宏塊的處理映射到一個(gè)GPU線程組中,從而能夠很方便的將該宏塊的數(shù)據(jù)加載進(jìn)GPU的片內(nèi)共享內(nèi)存,實(shí)現(xiàn)線程組內(nèi)共享當(dāng)前宏塊數(shù)據(jù)。這樣,在此宏塊對(duì)應(yīng)的整個(gè)搜索區(qū)域的處理過(guò)程中,不必再重復(fù)從顯存中加載該數(shù)據(jù),從而節(jié)約了寶貴的片外訪存帶寬。另外,通過(guò)線程來(lái)均分讀取當(dāng)前幀宏塊的數(shù)據(jù),每個(gè)線程獨(dú)立并列運(yùn)行,互不影響,讀取數(shù)據(jù)的速度和效果都有顯著提升。
[0054]下面選擇GPU作為可編程并行處理器,每個(gè)當(dāng)前幀子塊代表一個(gè)像素的數(shù)據(jù)為例,結(jié)合附圖和較佳的實(shí)施例對(duì)本發(fā)明作進(jìn)一步說(shuō)明。
[0055]一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,包括步驟:
[0056]在GPU中建立線程組,線程組包括線程;
[0057]將當(dāng)前幀的宏塊分割成多當(dāng)前幀宏塊,每個(gè)當(dāng)前幀子塊與線程建立--對(duì)應(yīng)的映
射關(guān)系,每個(gè)線程組的線程數(shù)量等于對(duì)應(yīng)當(dāng)前幀宏塊的像素?cái)?shù)量,每個(gè)當(dāng)前幀子塊代表一個(gè)像素的數(shù)據(jù);
[0058]每個(gè)當(dāng)前巾貞宏塊在參考巾貞中都有一個(gè)對(duì)應(yīng)的對(duì)位宏塊,以對(duì)位宏塊為中心,建立MXM的搜索塊,所述M為大于N的自然數(shù);將搜索塊分割成多個(gè)搜索子塊,搜索子塊與線程
建立一一對(duì)應(yīng)的映射關(guān)系;
[0059]每個(gè)線程將當(dāng)前幀子塊及其對(duì)應(yīng)的搜索子塊加載到可編程并行處理器的共享內(nèi)存中;
[0060]對(duì)當(dāng)前幀宏塊進(jìn)行搜索時(shí),直接通過(guò)線程調(diào)用共享內(nèi)存的當(dāng)前幀宏塊和搜索塊數(shù)據(jù);
[0061 ] 當(dāng)前幀和參考幀先預(yù)存到紋理內(nèi)存,線程從紋理內(nèi)存中讀取當(dāng)前幀和參考幀數(shù)據(jù),然后存儲(chǔ)到可編程并行處理器中的共享內(nèi)存。
[0062]考慮一幅長(zhǎng)為width,寬為heigtht,搜索寬度為search_range的視頻巾貞,其當(dāng)前中貞宏塊數(shù)為width/16*height/16,每個(gè)當(dāng)前巾貞宏塊需要搜索search_range2次,因此訪存量為width/16*height/16*search_range2*16*16.以1080P高清視頻,單參考巾貞,搜索寬度為32的典型情況為例,一幀視頻的訪存量將達(dá)2123366400之多,十分巨大。如圖2所示,當(dāng)前宏塊在同一參考幀內(nèi)的水平方向相鄰的兩個(gè)搜索位置對(duì)應(yīng)的搜索塊分別為SA1、SA2,兩者有明顯的重疊(實(shí)際上僅有少部分獨(dú)立),假如GPU上兩個(gè)并行的線程分別處理它們時(shí),顯然載入數(shù)據(jù)的重復(fù)性極高。因此本實(shí)施方式首先將參考幀加載為紋理內(nèi)存,而不是以普通的全局內(nèi)存形式存在于片外,紋理內(nèi)存具有內(nèi)建的邊界處理機(jī)制,不必占用計(jì)算資源來(lái)對(duì)邊界進(jìn)行特殊處理,方便了算法實(shí)現(xiàn)。最后將參考幀的數(shù)據(jù)從紋理內(nèi)存讀取到可編程并行處理器的共享內(nèi)存中,當(dāng)前幀跟參考幀比對(duì)時(shí),統(tǒng)一從共享內(nèi)存中讀取參考幀的數(shù)據(jù),無(wú)須頻繁訪問(wèn)片外的紋理內(nèi)存,節(jié)約寶貴的訪存帶寬。
[0063]紋理內(nèi)存其實(shí)就是物理上的外部?jī)?nèi)存,對(duì)應(yīng)GPU而言,即為獨(dú)立于GPU芯片存在于顯卡上的顯存芯片,兩者之間通過(guò)芯片級(jí)數(shù)據(jù)總線連接,通信速度會(huì)慢于GPU芯片的計(jì)算單元跟共享存儲(chǔ)器在芯片內(nèi)直接通信,跟普通方式訪問(wèn)外部存儲(chǔ)器的方式有所不同,就是當(dāng)數(shù)據(jù)是按紋理內(nèi)存方式存在外存時(shí),GPU運(yùn)算核心讀取它時(shí)會(huì)把處理器芯片內(nèi)的紋理緩存(texture cache)用起來(lái),因此產(chǎn)生(2D空間相關(guān)性)訪存優(yōu)化效果。
[0064]進(jìn)一步的,本發(fā)明還可以用于解決參考幀的重復(fù)讀取問(wèn)題。
[0065]鑒于參考幀中搜索所需加載的像素區(qū)域大于對(duì)位宏塊,因此,搜索塊在參考幀中會(huì)發(fā)生重疊,相鄰兩個(gè)搜索塊重疊,形成重疊區(qū),非重疊部分形成增量區(qū)。當(dāng)前幀宏塊的大小和對(duì)位宏塊相等,因此,搜索塊包括的像素?cái)?shù)量也大于當(dāng)前幀宏塊,每個(gè)線程要讀取多個(gè)像素。
[0066]對(duì)于每一行的當(dāng)前幀宏塊,每個(gè)線程組先從紋理內(nèi)存讀取第一個(gè)當(dāng)前幀對(duì)應(yīng)的搜索塊數(shù)據(jù);
[0067]后續(xù)當(dāng)前幀宏塊僅從紋理內(nèi)存讀取搜索塊的增量區(qū)數(shù)據(jù);同時(shí)將該增量區(qū)對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)到共享內(nèi)存,作為下一個(gè)當(dāng)前幀宏塊搜索的重疊區(qū)數(shù)據(jù)。在可編程并行處理器中啟動(dòng)第一運(yùn)算內(nèi)核,第一運(yùn)算內(nèi)核同時(shí)運(yùn)行一列宏塊數(shù)量對(duì)應(yīng)的線程組。
[0068]每個(gè)GPU線程各自讀取一個(gè)矩形區(qū)域的像素。如圖3所示,以當(dāng)前宏塊尺寸16x16,搜索區(qū)域32x32為例,則參考幀搜索塊SW為48x48(SW_widthXSW_height),因此每個(gè)線程需要讀取大小為3x3像素的矩形區(qū)域。[0069]令某一 GPU線程對(duì)應(yīng)的像素在當(dāng)前幀中的全局坐標(biāo)為(X,y),而在宏塊中的局部坐標(biāo)為(i,j),則該線程所需讀取的紋理內(nèi)存中的像素為:
[0070]P{(X - 16+i*3+m, y - 16+j*3+n), m=0,1,2,3;n=0,1,2,3}
[0071]假設(shè)參考幀中的搜索塊(SW)是一個(gè)以相應(yīng)當(dāng)前幀位置為中心的寬度為S_width高度為SJieight的矩形,一行宏塊數(shù)量為MBh,一列宏塊數(shù)量為MBV。相鄰的搜索塊是重疊的,不再相互獨(dú)立。兩個(gè)相鄰搜索塊的重疊的搜索區(qū)域大小為S_heightX (S_width_MB_width),其中MB_width是當(dāng)前宏塊的寬度,
[0072]現(xiàn)有技術(shù)載入搜索塊數(shù)據(jù)所需的片外訪存帶寬為:
[0073]Bff_normal = MBhX (S_height X S_width) XMBv
[0074]采用本技術(shù)方案進(jìn)行數(shù)據(jù)重用優(yōu)化后的訪存帶寬為:
[0075]Bff_proposed = (S_height X S_width+ (MBh-1) X S_height XMB_width) XMBv
[0076]以宏塊大小為16xl6,VGA分辨率(即MBh為40,MBV為30),搜索塊為48x48的情況為例,本優(yōu)化的訪存帶寬節(jié)省率將達(dá)到近三倍:
[0077]Bff_proposed/Bff_normal = (48X48+39X48X16)/(40X48X48) = 1/2.86
[0078]不難看出,對(duì)于高分辨率的視頻幀,隨著水平方向宏塊數(shù)的增多,此優(yōu)化比率將更高。因此,在高清視頻日益占主流的今天,該優(yōu)化的價(jià)值不言而喻。
[0079]本發(fā)明還進(jìn)一步解決了中間數(shù)據(jù)的反復(fù)讀取問(wèn)題。
[0080]步驟1:計(jì)算局部最優(yōu)結(jié)果。
[0081]當(dāng)前幀宏塊在其相應(yīng)的參考幀中都有對(duì)應(yīng)的對(duì)位宏塊,以對(duì)位宏塊為中心,建立范圍大于并完全覆蓋該對(duì)位宏塊的搜索塊;
[0082]所述對(duì)位宏塊在搜索塊中有多種二維位移量,每種位移量形成一個(gè)參考宏塊,所有參考宏塊的集合形成一個(gè)搜索范圍;
[0083]在可編程并行處理器中啟動(dòng)第一運(yùn)算內(nèi)核,第一運(yùn)算內(nèi)核包括多個(gè)線程,每個(gè)線程從所述共享內(nèi)存中讀取相應(yīng)的當(dāng)前幀宏塊和搜索塊數(shù)據(jù),
[0084]每個(gè)線程至少對(duì)一個(gè)參考宏塊進(jìn)行搜索運(yùn)算,每個(gè)線程對(duì)應(yīng)的參考宏塊的集合構(gòu)成一個(gè)搜索片區(qū),每次計(jì)算得到的搜索結(jié)果存儲(chǔ)對(duì)應(yīng)的寄存器中,所述搜索結(jié)果包括運(yùn)動(dòng)向量和編碼代價(jià);
[0085]如果計(jì)算的編碼代價(jià)小于寄存器的編碼代價(jià),用當(dāng)前計(jì)算的編碼代價(jià)替換寄存器的編碼代價(jià),每個(gè)線程完成其搜索片區(qū)的搜索運(yùn)算后,寄存器存儲(chǔ)的運(yùn)動(dòng)向量和編碼代價(jià)為局部最優(yōu)結(jié)果;
[0086]將局部最優(yōu)結(jié)果存儲(chǔ)到該線程對(duì)應(yīng)的寄存器中;
[0087]當(dāng)?shù)谝贿\(yùn)算內(nèi)核完成整個(gè)搜索塊的搜索后,將每個(gè)線程的局部最優(yōu)結(jié)果存儲(chǔ)到外部存儲(chǔ)器,
[0088]若當(dāng)前幀宏塊對(duì)應(yīng)的對(duì)位宏塊大小為16x16,搜索范圍為32x32,則搜索塊的大小為32+16=48 (x48),則16x16線程組中平均每線程的當(dāng)前幀子塊為Ixl (當(dāng)前幀)和3x3 (搜索塊),而搜索片區(qū)為2x2 (4個(gè)參考宏塊)。
[0089]步驟2:計(jì)算整個(gè)當(dāng)前幀宏塊的最優(yōu)的搜索結(jié)果。
[0090]第二運(yùn)算內(nèi)核從外部存儲(chǔ)器讀取所有局部最優(yōu)結(jié)果,計(jì)算出整個(gè)當(dāng)前幀宏塊的最優(yōu)的搜索結(jié)果。[0091]總的來(lái)說(shuō),訪存帶寬水平:寄存器明顯大于共享內(nèi)存,共享內(nèi)存遠(yuǎn)大于外部存儲(chǔ)器,線程每次的結(jié)果存在寄存器中,最后完成遍歷時(shí)才從寄存器寫(xiě)外部存儲(chǔ)器,這樣省訪存帶寬。
[0092]寄存器是各自線程自己能看到,而共享內(nèi)存、外部存儲(chǔ)器則能夠被所有的線程訪問(wèn),由于共享內(nèi)存不占用外部的訪存帶寬,因此將整個(gè)宏塊的當(dāng)前幀宏塊存儲(chǔ)到共享內(nèi)存。
[0093]參見(jiàn)圖4,第一運(yùn)算內(nèi)核在線程組加載了當(dāng)前幀宏塊及其對(duì)應(yīng)的搜索塊,對(duì)每一個(gè)線程,首先依次遍歷其所負(fù)責(zé)的2x2搜索區(qū)域,依次求得每個(gè)4x4子塊的SAD值,寫(xiě)入臨時(shí)寄存器中,并不占用片外的全局內(nèi)存。
[0094]求得4x4子塊的SAD值后,同樣通過(guò)累加得出8x4,4x8,16x8,8x16,16x16等各種其他模式的SAD值,同樣存在臨時(shí)寄存器中。
[0095]繼續(xù)在遍歷過(guò)程中,對(duì)每一種模式分別更新其最佳的運(yùn)動(dòng)向量(MV)和編碼代價(jià)(初始化為無(wú)窮大,每當(dāng)當(dāng)前搜索位置計(jì)算所得之代價(jià)小于目前已知的最佳代價(jià),就更新它)。這樣當(dāng)遍歷完畢,每一個(gè)線程都將得出其2x2搜索范圍內(nèi)的最佳MV和編碼代價(jià),這些數(shù)據(jù)將作為中間數(shù)據(jù)寫(xiě)入于片外全局內(nèi)存中。該數(shù)據(jù)的組織可視為一個(gè)二維數(shù)組,其元素尺寸與原始視頻幀相同,每個(gè)元素則包含了其對(duì)應(yīng)的當(dāng)前幀像素所在宏塊的局部最佳MV和相應(yīng)的搜索代價(jià)。
[0096]第二運(yùn)算內(nèi)核設(shè)計(jì)為每個(gè)線程負(fù)責(zé)一個(gè)宏塊的進(jìn)一步處理,即每個(gè)線程可視為進(jìn)行中間數(shù)據(jù)中16x16元素的讀入,然后通過(guò)遍歷該區(qū)域的數(shù)據(jù),依次比較各局部最優(yōu)的結(jié)果,最終得到當(dāng)前宏塊在整個(gè)32x32搜索范圍中全局最優(yōu)的MV及其編碼代價(jià)。此后便可以進(jìn)行最佳模式的選擇,以及細(xì)化的分像素運(yùn)動(dòng)估計(jì)。
[0097]本發(fā)明不局限于GPU,還可以采用其他可編程并行處理器。
[0098]以上內(nèi)容是結(jié)合具體的優(yōu)選實(shí)施方式對(duì)本發(fā)明所作的進(jìn)一步詳細(xì)說(shuō)明,不能認(rèn)定本發(fā)明的具體實(shí)施只局限于這些說(shuō)明。對(duì)于本發(fā)明所屬【技術(shù)領(lǐng)域】的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干簡(jiǎn)單推演或替換,都應(yīng)當(dāng)視為屬于本發(fā)明的保護(hù)范圍。
【權(quán)利要求】
1.一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,其特征在于,包括步驟: 在可編程并行處理器中建立線程組,線程組包括線程; 將NXN的當(dāng)前幀宏塊分割成多個(gè)當(dāng)前幀子塊,每個(gè)當(dāng)前幀子塊與線程建立一一對(duì)應(yīng)的映射關(guān)系; 每個(gè)線程將對(duì)應(yīng)的當(dāng)前幀子塊加載到可編程并行處理器的共享內(nèi)存; 所述N為自然數(shù)。
2.如權(quán)利要求1所述的一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,其特征在于,所述全搜索運(yùn)動(dòng)估計(jì)方法還包括參考幀的讀取步驟: 每個(gè)當(dāng)前幀宏塊在參考幀中都有一個(gè)對(duì)應(yīng)的對(duì)位宏塊,以對(duì)位宏塊為中心,建立MXM的搜索塊,所述M為大于N的自然數(shù); 將搜索塊分割成多個(gè)搜索子塊,搜索子塊與線程建立一一對(duì)應(yīng)的映射關(guān)系; 每個(gè)線程將對(duì)應(yīng)的搜索子塊加載到可編程并行處理器的共享內(nèi)存。
3.如權(quán)利要求2所述的一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,其特征在于,所述全搜索運(yùn)動(dòng)估計(jì)方法還包括宏塊的全搜索運(yùn)算步驟: 所述對(duì)位宏塊在搜索塊中有多種二維位移量,每種位移量形成一個(gè)參考宏塊,所有參考宏塊的集合形成一個(gè)搜索范圍;所述每個(gè)線程至少對(duì)一個(gè)參考宏塊進(jìn)行搜索運(yùn)算,得出局部最優(yōu)結(jié)果;其對(duì)應(yīng)的參考宏塊的集合構(gòu)成一個(gè)搜索片區(qū),` 匯總所有線程的局部最優(yōu)結(jié)果,然后計(jì)算當(dāng)前幀宏塊在整個(gè)搜索塊內(nèi)的最優(yōu)的搜索結(jié)果O
4.如權(quán)利要求3所述的一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,其特征在于, 可編程并行處理器包括第一運(yùn)算內(nèi)核和第二運(yùn)算內(nèi)核,在可編程并行處理器中啟動(dòng)第一運(yùn)算內(nèi)核,第一運(yùn)算內(nèi)核包括多個(gè)線程,每個(gè)線程從共享內(nèi)存中讀取當(dāng)前幀宏塊和搜索塊數(shù)據(jù);在其搜索片區(qū)中計(jì)算所述局部最優(yōu)結(jié)果, 將每個(gè)線程的局部最優(yōu)結(jié)果存儲(chǔ)到外部存儲(chǔ)器,然后在可編程并行處理器中啟動(dòng)第二運(yùn)算內(nèi)核,第二運(yùn)算內(nèi)核從外部存儲(chǔ)器讀取每個(gè)局部最優(yōu)結(jié)果,計(jì)算出當(dāng)前幀宏塊在整個(gè)搜索塊內(nèi)的最優(yōu)的搜索結(jié)果。
5.如權(quán)利要求4所述的一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,其特征在于, 每個(gè)線程遍歷所有可能的模式進(jìn)行全搜索,每次計(jì)算得到的搜索結(jié)果存儲(chǔ)對(duì)應(yīng)的寄存器中,所述搜索結(jié)果包括運(yùn)動(dòng)向量和編碼代價(jià); 如果計(jì)算的編碼代價(jià)小于寄存器的編碼代價(jià),用當(dāng)前計(jì)算的編碼代價(jià)替換寄存器的編碼代價(jià), 每個(gè)線程完成其搜索片區(qū)的搜索運(yùn)算后,寄存器存儲(chǔ)的運(yùn)動(dòng)向量和編碼代價(jià)為局部最優(yōu)結(jié)果。
6.如權(quán)利要求2所述的一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,其特征在于,相鄰兩個(gè)搜索塊重疊,形成重疊區(qū),非重疊部分形成增量區(qū); 對(duì)于每一行的當(dāng)前幀宏塊,每個(gè)線程組先從紋理內(nèi)存讀取第一個(gè)當(dāng)前幀對(duì)應(yīng)的搜索塊數(shù)據(jù);后續(xù)當(dāng)前幀宏塊僅從紋理內(nèi)存讀取搜索塊的增量區(qū)數(shù)據(jù);同時(shí)將該增量區(qū)對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)到共享內(nèi)存,作為下一個(gè)當(dāng)前幀宏塊搜索的重疊區(qū)數(shù)據(jù)。
7.如權(quán)利要求6所述的一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,其特征在于, 可編程并行處理器包括第一運(yùn)算內(nèi)核和第二運(yùn)算內(nèi)核,在可編程并行處理器中啟動(dòng)第一運(yùn)算內(nèi)核,第一運(yùn)算內(nèi)核同時(shí)運(yùn)行一列宏塊數(shù)量對(duì)應(yīng)的線程組。
8.如權(quán)利要求2所述的一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,其特征在于,所述當(dāng)前幀和參考幀先預(yù)存到紋理內(nèi)存,所述線程從紋理內(nèi)存中讀取當(dāng)前幀和參考幀數(shù)據(jù),然后存儲(chǔ)到可編程并行處理器中的共享內(nèi)存。
9.如權(quán)利要求1所述的一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,其特征在于,所述可編程并行處理器為GPU。
10.如權(quán)利要求1所述的一種基于可編程并行處理器的全搜索運(yùn)動(dòng)估計(jì)方法,其特征在于,每個(gè)線程組的線程數(shù)量等于對(duì)應(yīng)當(dāng)前幀宏塊的像素?cái)?shù)量,每個(gè)當(dāng)前幀子塊代表一個(gè)像素的數(shù)據(jù) 。
【文檔編號(hào)】H04N19/527GK103873874SQ201410056657
【公開(kāi)日】2014年6月18日 申請(qǐng)日期:2014年2月19日 優(yōu)先權(quán)日:2014年2月19日
【發(fā)明者】隆剛, 金明, 史方 申請(qǐng)人:同觀科技(深圳)有限公司