国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種基于CUDA的H.264并行編碼器的實(shí)現(xiàn)方法與流程

      文檔序號(hào):11181027閱讀:1256來(lái)源:國(guó)知局
      一種基于CUDA的H.264并行編碼器的實(shí)現(xiàn)方法與流程

      【技術(shù)領(lǐng)域】

      本發(fā)明屬于視頻編碼領(lǐng)域,尤其涉及一種基于cuda的h.264并行編碼器的實(shí)現(xiàn)方法。



      背景技術(shù):

      現(xiàn)在,h.264/avc作為當(dāng)今最流行的視頻編碼標(biāo)準(zhǔn),以其高圖像質(zhì)量和高壓縮比的性能而受到廣泛歡迎,但是提高了圖像質(zhì)量和編碼效率,同時(shí)也大大增加了h.264的計(jì)算復(fù)雜度,而現(xiàn)有的基于通用處理器的串行結(jié)構(gòu)編碼器無(wú)法達(dá)到高清實(shí)時(shí)編碼的性能,而專(zhuān)用硬件的開(kāi)發(fā)成本高,周期長(zhǎng),通用性差,不適合大規(guī)模使用,所以亟需為h.264編碼器尋找一種高效的實(shí)現(xiàn)方法。



      技術(shù)實(shí)現(xiàn)要素:

      為了解決現(xiàn)有技術(shù)中的上述問(wèn)題,本發(fā)明提出了一種基于cuda的h.264并行編碼器的實(shí)現(xiàn)方法。

      本發(fā)明采用的技術(shù)方案具體如下:

      一種基于cuda的h.264并行編碼器的實(shí)現(xiàn)方法,該方法包括以下步驟:

      (1)對(duì)h.264編碼器結(jié)構(gòu)進(jìn)行調(diào)整,包括對(duì)編碼器功能模塊進(jìn)行幀級(jí)分隔,以及對(duì)該編碼器在cpu和gpu上的任務(wù)進(jìn)行劃分;

      (2)所述編碼器的各個(gè)功能模塊在cuda上并行化運(yùn)行,即在模塊級(jí)對(duì)h.264編碼器的功能模塊分別進(jìn)行幀間預(yù)測(cè)、幀內(nèi)預(yù)測(cè)編碼、熵編碼、去塊濾波4個(gè)過(guò)程。

      進(jìn)一步地,功能模塊的幀級(jí)分隔包括如下步驟:

      (1.1)按照編碼器核心函數(shù)的功能,將核心函數(shù)中的各個(gè)功能函數(shù)分隔成獨(dú)立的循環(huán)體,使每個(gè)功能函數(shù)在幀一級(jí)進(jìn)行獨(dú)立循環(huán);

      (1.2)將編碼器中的大型數(shù)據(jù)結(jié)構(gòu)按照其生命周期劃分成多個(gè)簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu),并且根據(jù)其實(shí)際的生命周期進(jìn)行本地化。

      進(jìn)一步地,所述步驟1.2具體包括:

      將所述大型數(shù)據(jù)結(jié)構(gòu)分成局部變量、偽全局變量和真全局變量三種類(lèi)型;

      (a)如果所述大型數(shù)據(jù)結(jié)構(gòu)是局部變量,則其不作變化;

      (b)如果所述大型數(shù)據(jù)結(jié)構(gòu)是偽全局變量,則通過(guò)重命名的方法,將該偽全局變量按照其實(shí)際生命周期劃分成不同的變量;

      (c)如果所述大型數(shù)據(jù)結(jié)構(gòu)是真全局變量,則考察該真全局變量的數(shù)據(jù)結(jié)構(gòu)中,是否有部分變量是偽全局變量或局部變量,如果有,則將這些變量從該真全局變量中分離出去,對(duì)分離出去的偽全局變量再進(jìn)行如上述步驟b的處理。

      進(jìn)一步地,cpu和gpu的任務(wù)劃分包括:

      (2.1)由cpu完成視頻文件的輸入并對(duì)視頻文件進(jìn)行預(yù)處理;

      (2.2)cpu將視頻文件中的原始幀和參考幀傳送給gpu,由gpu進(jìn)行后續(xù)的編碼操作;

      (2.3)gpu進(jìn)行幀間預(yù)測(cè);

      (2.4)gpu執(zhí)行幀內(nèi)預(yù)測(cè)編碼;

      (2.5)gpu進(jìn)行并行化熵編碼;

      (2.6)gpu進(jìn)行去塊濾波。

      進(jìn)一步地,所述幀間預(yù)測(cè)采用多分辨率多窗口(mrmw)算法。

      進(jìn)一步地,在幀內(nèi)預(yù)測(cè)編碼過(guò)程中,采用一次讀取多次處理的方式加載數(shù)據(jù),即每個(gè)線程塊向?qū)?yīng)的共享存儲(chǔ)器中加載處理多個(gè)宏塊需要的數(shù)據(jù),cuda的kernel函數(shù)內(nèi)部通過(guò)一層循環(huán)對(duì)這些數(shù)據(jù)進(jìn)行預(yù)測(cè)編碼,當(dāng)此次讀取的數(shù)據(jù)處理結(jié)束之后將重建數(shù)據(jù)寫(xiě)回,然后再加載新的數(shù)據(jù)進(jìn)行處理;相應(yīng)的kernel的組織為兩重循環(huán)結(jié)構(gòu),外層循環(huán)控制變量對(duì)應(yīng)加載的次數(shù),內(nèi)存循環(huán)控制變量對(duì)應(yīng)每次加載的數(shù)據(jù)需處理的次數(shù)。

      進(jìn)一步地,kernel內(nèi)部以宏塊為單位進(jìn)行處理,所述宏塊包括多個(gè)子宏塊,幀內(nèi)預(yù)測(cè)編碼包括三個(gè)階段:

      第一階段:每個(gè)子宏塊交由幀內(nèi)預(yù)測(cè)線程塊中的一個(gè)線程進(jìn)行幀內(nèi)預(yù)測(cè)處理;

      第二階段:由dct線程塊中的一個(gè)線程對(duì)一個(gè)子宏塊中的一行或一列像素進(jìn)行dct處理;

      第三階段:由量化線程塊中的一個(gè)線程對(duì)一個(gè)像素進(jìn)行量化處理。

      進(jìn)一步地,在并行化熵編碼過(guò)程中,每個(gè)cuda線程塊處理8個(gè)連續(xù)的宏塊,每一個(gè)線程處理一個(gè)子宏塊的熵編碼。

      進(jìn)一步地,所述去塊濾波以幀為單位,包括邊界強(qiáng)度的計(jì)算和濾波。

      進(jìn)一步地,所述預(yù)處理包括對(duì)視頻分量yuv的分離以及編碼器基本參數(shù)設(shè)置。

      本方法的有益效果為:提高了h.264編碼器的執(zhí)行效率,在不降低編碼性能的前提下降低編碼的計(jì)算復(fù)雜度,提高編碼速度。

      【附圖說(shuō)明】

      此處所說(shuō)明的附圖是用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,但并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定,在附圖中:

      圖1是本發(fā)明對(duì)核心函數(shù)的循環(huán)體分割示意圖。

      圖2是本發(fā)明數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單化和局部化的示意圖。

      圖3是本發(fā)明cpu-gpu上的任務(wù)劃分圖。

      圖4是本發(fā)明幀間預(yù)測(cè)編碼存儲(chǔ)模型。

      圖5是本發(fā)明cavlc編碼階段cuda并行模型。

      圖6是去塊濾波函數(shù)分離示意圖。

      【具體實(shí)施方式】

      下面將結(jié)合附圖以及具體實(shí)施例來(lái)詳細(xì)說(shuō)明本發(fā)明,其中的示意性實(shí)施例以及說(shuō)明僅用來(lái)解釋本發(fā)明,但并不作為對(duì)本發(fā)明的限定。

      本發(fā)明基于h.264的串行程序x264,基于對(duì)此程序的分析,根據(jù)cuda架構(gòu)提出了并行h.264編碼器框架并且在cuda上實(shí)現(xiàn)并行h.264編碼器的方法。該方法包括以下兩個(gè)方面:

      (1)總體結(jié)構(gòu)優(yōu)化

      總體結(jié)構(gòu)優(yōu)化是對(duì)h.264編碼器結(jié)構(gòu)進(jìn)行調(diào)整,對(duì)基于cuda的h.264并行編碼器的框架進(jìn)行設(shè)計(jì),該調(diào)整和設(shè)計(jì)主要包括兩個(gè)方面:對(duì)編碼器功能模塊進(jìn)行幀級(jí)分隔;以及對(duì)cpu和gpu進(jìn)行任務(wù)劃分。

      (2)各個(gè)功能模塊在cuda上的并行化,即在模塊級(jí)對(duì)h.264編碼器的功能模塊分別進(jìn)行幀間預(yù)測(cè)、幀內(nèi)預(yù)測(cè)編碼、熵編碼、去塊濾波4個(gè)過(guò)程,從并行模型設(shè)計(jì)和存儲(chǔ)模型等方面實(shí)現(xiàn)編碼器在cuda上的并行化。

      下面對(duì)該方法的這兩個(gè)方面進(jìn)行詳細(xì)說(shuō)明。

      功能模塊的幀級(jí)分隔:

      功能模塊的幀級(jí)分隔的具體步驟如下:

      (1.1)松散函數(shù)耦合度

      在h.264編碼器中,其核心函數(shù)(main函數(shù))是一個(gè)大的循環(huán)體,如圖1上方所示,a為main函數(shù),其包括下方的d1’,…,d5,d6,…,d7,e1,e2,e3,e4,e5所有的函數(shù)作為一個(gè)整個(gè)的大的循環(huán)體,main函數(shù)的每一次循環(huán)都執(zhí)行一遍所有的函數(shù),這種方式循環(huán)體路徑長(zhǎng),如果直接進(jìn)行并行程序的開(kāi)發(fā),函數(shù)負(fù)載太重。

      因此本發(fā)明按照核心函數(shù)的功能,將核心函數(shù)的整個(gè)循環(huán)分割成多個(gè)相對(duì)獨(dú)立的循環(huán)體,如圖1下方所示,每個(gè)函數(shù)在幀一級(jí)進(jìn)行獨(dú)立循環(huán),將d1’,…,d5,d6,…,d7,e1,e2,e3,e4,e5每個(gè)都分割成獨(dú)立的循環(huán)體,例如d1’函數(shù)是個(gè)循環(huán)體,d5函數(shù)是個(gè)循環(huán)體,d7函數(shù)是個(gè)循環(huán)體,e1函數(shù)是個(gè)循環(huán)體等等。這樣,每個(gè)函數(shù)獨(dú)立集中處理一個(gè)任務(wù),獨(dú)立循環(huán),在每個(gè)循環(huán)體執(zhí)行的過(guò)程中,指令的局域性更好,失效次數(shù)低。

      (1.2)將h.264編碼器中的數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單化和局部化

      參見(jiàn)圖2,為了減少數(shù)據(jù)傳輸?shù)臅r(shí)間,本發(fā)明將編碼器中的大型數(shù)據(jù)結(jié)構(gòu)按照其生命周期劃分成多個(gè)簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu),并且根據(jù)其實(shí)際的生命周期進(jìn)行本地化。具體地,所述大型數(shù)據(jù)結(jié)構(gòu)可以分成局部變量、偽全局變量和真全局變量三種類(lèi)型。

      對(duì)于局部變量,例如圖2中函數(shù)0中的本地變量a,不作變化。

      對(duì)于偽全局變量b,即雖然是全局變量,但是該變量的作用范圍可以拆分成多個(gè)實(shí)際生命周期,則通過(guò)重命名的方法,將該偽全局變量按照其實(shí)際生命周期分為不同的變量。如圖2所示,對(duì)于偽全局變量b,其在函數(shù)0和函數(shù)1之間的變量值沒(méi)有關(guān)系,可以拆分成2個(gè)生命周期,因此將函數(shù)1中的該偽全局變量重命名為b0,而函數(shù)2中沒(méi)有使用到該變量b,則函數(shù)2中就可以不再定義該變量b。

      對(duì)于真全局變量c,則需要考察該真全局變量的數(shù)據(jù)結(jié)構(gòu)中,是否有部分變量是偽全局變量或局部變量,如果有,則將這些變量從c中分離出去,分離出去的偽全局變量再進(jìn)行如上處理。如果圖2所示,真全局變量c可以拆分成一個(gè)偽全局變量和一個(gè)局部變量,則限制該偽全局變量的作用范圍在函數(shù)0和函數(shù)1,限制局部變量c0的作用范圍只在函數(shù)2.

      cpu和gpu的任務(wù)劃分

      參考圖3,其示出了本發(fā)明h.264編碼器各個(gè)功能模塊在cpu和gpu上的任務(wù)劃分以及cpu-gpu之間的數(shù)據(jù)流動(dòng)情況。

      (2.1)首先由cpu完成視頻文件的輸入并對(duì)視頻文件進(jìn)行預(yù)處理,包括對(duì)視頻分量yuv的分離,以及編碼器基本參數(shù)設(shè)置等。

      (2.2)cpu將原始幀和參考幀傳送給gpu,由gpu進(jìn)行后續(xù)的編碼操作。

      gpu以幀為單位,通過(guò)執(zhí)行四個(gè)模塊對(duì)幀進(jìn)行處理,基本流程是:對(duì)一幀的幀間預(yù)測(cè)結(jié)束之后,再進(jìn)行相應(yīng)的幀內(nèi)預(yù)測(cè)編碼,然后對(duì)得到的變量化系數(shù)進(jìn)行熵編碼,以此類(lèi)推,直至整幀的熵編碼和去塊濾波結(jié)束之后再將結(jié)果數(shù)據(jù)傳回cpu。

      (2.3)gpu執(zhí)行幀間預(yù)測(cè)。

      幀間預(yù)測(cè)是h.264編碼器中計(jì)算需求最大的部分,傳統(tǒng)幀間預(yù)測(cè)所需的計(jì)算量約占整個(gè)編碼器的70%,雖然圖像質(zhì)量較好但復(fù)雜。本發(fā)明采用現(xiàn)有技術(shù)中的多分辨率多窗口(mrmw)算法進(jìn)行幀間預(yù)測(cè)。由于本發(fā)明對(duì)功能模塊進(jìn)行了幀級(jí)分隔,使用mrmw算法相對(duì)于現(xiàn)有技術(shù)可以大幅度減少幀間預(yù)測(cè)的時(shí)間。

      (2.4)gpu執(zhí)行幀內(nèi)預(yù)測(cè)編碼。

      幀內(nèi)預(yù)測(cè)并行度并不高,cuda每個(gè)線程塊能夠同時(shí)處理最大的數(shù)據(jù)量為1個(gè)宏塊(256像素),對(duì)于共享存儲(chǔ)器的壓力并不大,而相鄰宏塊之間存在生產(chǎn)者-消費(fèi)者之間的關(guān)系,為了減少為全局存儲(chǔ)中相關(guān)數(shù)據(jù)的訪問(wèn)次數(shù),本發(fā)明采用一次讀取多次處理的方式加載數(shù)據(jù)。即每個(gè)線程塊向?qū)?yīng)的共享存儲(chǔ)器中加載處理多個(gè)宏塊需要的數(shù)據(jù),cuda的kernel函數(shù)內(nèi)部通過(guò)一層循環(huán)對(duì)這些數(shù)據(jù)進(jìn)行預(yù)測(cè)編碼,當(dāng)此次讀取的數(shù)據(jù)處理結(jié)束之后將重建數(shù)據(jù)寫(xiě)回,然后再加載新的數(shù)據(jù)進(jìn)行處理。相應(yīng)的kernel的組織為兩重循環(huán)結(jié)構(gòu),外層循環(huán)控制變量對(duì)應(yīng)加載的次數(shù),內(nèi)存循環(huán)控制變量對(duì)應(yīng)每次加載的數(shù)據(jù)需處理的次數(shù)。

      參見(jiàn)附圖4,其示出了幀內(nèi)預(yù)測(cè)編碼的存儲(chǔ)模型。圖4左上部分由多個(gè)宏塊(mb)組成的一個(gè)圖像幀,每次讀取幀數(shù)據(jù)時(shí),都從原始圖像幀中讀取一個(gè)strip,并存儲(chǔ)到共享存儲(chǔ)器中(如圖4右上所示),kernel內(nèi)部以宏塊為單位對(duì)該strip進(jìn)行處理。

      圖4中部和下部示出了kernel對(duì)一個(gè)宏塊的處理過(guò)程。圖4的左中部分示出了一個(gè)4*4的宏塊,其包括子宏塊0到子宏塊15,每個(gè)子宏塊包括4*4個(gè)像素,其幀內(nèi)預(yù)測(cè)編碼包括三個(gè)階段:

      第一階段:如圖4左中和左下部分,每個(gè)子宏塊交由幀內(nèi)預(yù)測(cè)線程塊(predictionthreadblock)中的一個(gè)線程進(jìn)行幀內(nèi)預(yù)測(cè)處理,共需要16個(gè)線程(線程0至線程15)。

      第二階段:如圖4的正中和正下部分,由dct線程塊中的一個(gè)線程對(duì)一個(gè)子宏塊中的一行或一列像素進(jìn)行dct處理,共需64個(gè)線程(線程0至線程63)。

      第三階段:如圖4的右中和右下部分,由量化線程塊(quantthreadblock)中的一個(gè)線程對(duì)一個(gè)像素進(jìn)行量化處理(以行優(yōu)先的方式),共需256個(gè)線程(線程0值線程255)。

      (2.5)gpu進(jìn)行并行化熵編碼。

      參考附圖5,其為cavlc編碼階段cuda并行模型,示出了亮度交流分量熵編碼階段數(shù)據(jù)與線程的映射關(guān)系。其中每個(gè)cuda線程塊處理8個(gè)連續(xù)的宏塊,即線程塊b0處理第0行中的mb0到mb7,線程塊b14處理mb112到mb119,以此類(lèi)推。線程塊內(nèi)連續(xù)的16個(gè)線程分別處理一個(gè)宏塊中16個(gè)子宏塊。圖5中共有1200個(gè)線程塊,每個(gè)線程塊包含128個(gè)線程,線程數(shù)達(dá)到了130560個(gè),每一個(gè)線程處理一個(gè)子宏塊的熵編碼,從而實(shí)現(xiàn)了130560個(gè)線程并行熵編碼。雖然熵編碼是一個(gè)分支密集型的組件,但是經(jīng)過(guò)功能模塊的幀級(jí)分隔,將各種分量分離,已經(jīng)消除了一些分支路徑,通過(guò)大量線程實(shí)現(xiàn)大規(guī)模的數(shù)據(jù)并行足以彌補(bǔ)分支操作帶來(lái)的影響。

      (2.6)gpu進(jìn)行去塊濾波,如圖6所示,所述去塊濾波以幀為單位,包括邊界強(qiáng)度的計(jì)算和濾波。

      通過(guò)上述過(guò)程,本發(fā)明從系統(tǒng)和模塊級(jí)兩個(gè)方面實(shí)現(xiàn)了h.264在cuda上的并行化過(guò)程,在不降低編碼性能的前提下降低編碼的計(jì)算復(fù)雜度,提高編碼速度。

      以上所述僅是本發(fā)明的較佳實(shí)施方式,故凡依本發(fā)明專(zhuān)利申請(qǐng)范圍所述的構(gòu)造、特征及原理所做的等效變化或修飾,均包括于本發(fā)明專(zhuān)利申請(qǐng)范圍內(nèi)。

      當(dāng)前第1頁(yè)1 2 
      網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
      • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1