一種基于gpu的并行sao算法
【專利摘要】本發(fā)明提出一種基于GPU的并行SAO算法,利用GPU的大量線程進(jìn)行像素級并行統(tǒng)計(jì)、LCU塊級并行相對失真計(jì)算和像素級并行修正,從而獲得顯著的時(shí)間減幅。標(biāo)準(zhǔn)的SAO算法非常不利于并行化。首先,參數(shù)融合機(jī)制使SAO塊參數(shù)具有不確定的數(shù)據(jù)依賴性;其次,區(qū)域像素相關(guān)性導(dǎo)致統(tǒng)計(jì)時(shí)存在大量線程間的數(shù)據(jù)同步等待。針對上述兩項(xiàng)阻礙SAO并行化的挑戰(zhàn),本發(fā)明結(jié)合GPU的硬件特性,設(shè)計(jì)了兩種基于不同線程映射方法的像素級并行統(tǒng)計(jì)算法和一種塊級并行相對失真計(jì)算算法。通過大量的實(shí)驗(yàn)分析,本發(fā)明設(shè)計(jì)并實(shí)現(xiàn)的并行SAO(簡稱cuSAO)相比AVS2標(biāo)準(zhǔn)參考軟件的串行SAO(簡稱rdSAO)在耗時(shí)上獲得顯著的減幅,而且不失精確性,平均耗時(shí)減幅高達(dá)70%,最多可達(dá)90%以上。
【專利說明】
一種基于GPU的并行SAO算法
技術(shù)領(lǐng)域
[0001] 本發(fā)明涉視頻編碼技術(shù)領(lǐng)域,更具體地,涉及一種基于GPU的并行SA0算法。
【背景技術(shù)】
[0002] 如今,視頻應(yīng)用已經(jīng)深入到各個(gè)領(lǐng)域,視頻編碼技術(shù)也面臨著越來越多的挑戰(zhàn)。 2010年4月VCEG和MPEG再次聯(lián)手,組建JCT-VC工作組開始制定新一代視頻編碼標(biāo)準(zhǔn)H. 265/ HEVC,隨后不久,我國的AVS工作組也開始籌備我國自主研制的新一代視頻編碼標(biāo)準(zhǔn)AVS2。
[0003] 無論是國際標(biāo)準(zhǔn)H.265/HEVC還是我國的AVS2標(biāo)準(zhǔn),核心目標(biāo)都是在上一代視頻編 碼標(biāo)準(zhǔn)的基礎(chǔ)上,將壓縮效率提高一倍,即在保證相同視頻圖像質(zhì)量的前提下,視頻流的碼 率再減少50%。然而,更高的壓縮比與重建視頻圖像的主客觀質(zhì)量是矛盾。為了緩和該矛 盾,SA0(Sample Adaptive Offset,像素自適應(yīng)偏移)技術(shù)被H. 265/HEVC和AVS2兩大標(biāo)準(zhǔn)不 約而同地加入到各自的編解碼框架里,成為改善視頻主客觀質(zhì)量的新型關(guān)鍵技術(shù)。
[0004] SA0技術(shù),又稱像素自適應(yīng)偏移,能在僅提高少量碼率的情況下大幅改善視頻圖像 的主客觀質(zhì)量。SA0技術(shù)的核心思想是:依據(jù)某種分類模式,對圖像像素做有限的分類,在編 碼時(shí)為有限個(gè)類別的像素尋找修正值并將其編入碼流,而在解碼時(shí)像素根據(jù)分類模式自適 應(yīng)地使用相應(yīng)的值進(jìn)行修正。
[0005] 然而在決策最優(yōu)的分類模式以及修正值時(shí),標(biāo)準(zhǔn)的SA0技術(shù)依賴于對全圖像素的 統(tǒng)計(jì)數(shù)據(jù),這是一個(gè)非常繁瑣的過程。國內(nèi)外不少專家學(xué)者在對SA0技術(shù)做加速優(yōu)化時(shí),都 是通過回避使用基于像素統(tǒng)計(jì)的分類方法,使用新的決策方式獲得速度上的提升。雖然避 開基于像素統(tǒng)計(jì)分類方法的SA0模塊能獲得很大程度的時(shí)間減幅,但這些方法都是對精確 性有所妥協(xié)的。
【發(fā)明內(nèi)容】
[0006] 本發(fā)明為克服上述現(xiàn)有技術(shù)所述的至少一種缺陷,提供一種高效率、高精確度的 基于GHJ的并行SA0算法。
[0007] 為解決上述技術(shù)問題,本發(fā)明的技術(shù)方案如下:
[0008] 一種基于GPU的并行SA0算法,所述算法按照以下步驟依次處理視頻序列的各幀:
[0009] S1:在GPU進(jìn)行像素級并行統(tǒng)計(jì),一個(gè)線程負(fù)責(zé)一個(gè)或多個(gè)像素在某種分類模式下 的統(tǒng)計(jì);
[0010] S2:在GPU進(jìn)行IXU(最大編碼單兀)塊級并行計(jì)算相對失真;
[0011] S3:在CPU進(jìn)行IXU塊級串行決策最終SA0 (像素自適應(yīng)偏移)參數(shù);
[0012] S4:在GPU進(jìn)行像素級并行修正。
[0013] 在一種優(yōu)選的方案中,步驟S1中,像素級并行統(tǒng)計(jì)的具體方法為:一個(gè)線程負(fù)責(zé)一 個(gè)或多個(gè)像素在某種分類模式下的統(tǒng)計(jì),時(shí)間復(fù)雜度可達(dá)0(1),線程與像素的映射方法為 以下三種映射方法的任意一種,其中效果最好的為聚簇型線程映射方法:
[0014] (1)對齊型線程映射方法:每一個(gè)線程負(fù)責(zé)圖像分量中一個(gè)像素的統(tǒng)計(jì)工作;
[0015] (2)跳躍型線程映射方法:1個(gè)線程塊映射1個(gè)IXU塊,1個(gè)LCU塊包含64 X 64個(gè)像素, 1個(gè)線程塊包含16 X 16個(gè)線程。
[0016] 跳躍型線程映射相比對齊型線程映射的一個(gè)改進(jìn)點(diǎn)是:使用更少的線程,每個(gè)線 程負(fù)責(zé)更多的像素統(tǒng)計(jì)。使用這種線程布局的理由是:第一,線程塊內(nèi)256個(gè)(16X16)線程 可以充分利用硬件性能;第二,每個(gè)LCU塊可以獲得一塊共享內(nèi)存,仍然可以利用共享內(nèi)存 作為高速緩存,對數(shù)據(jù)進(jìn)行分層匯聚。
[0017] (3)聚簇型線程映射方法:每一個(gè)線程負(fù)責(zé)的像素區(qū)域是方形聚簇的,即每個(gè)線程 負(fù)責(zé)一塊像素。
[0018] 所述聚簇型線程映射方法中,使用一個(gè)線程塊映射一個(gè)編碼單元塊,每個(gè)線程塊 的線程數(shù)量可以調(diào)整,但最佳數(shù)量為256,每個(gè)線程負(fù)責(zé)的像素區(qū)域是方形聚簇的,這樣使 用的線程更少,可減少未調(diào)度線程的等待時(shí)間,也減少了線程間數(shù)據(jù)同步的等待時(shí)間,同 時(shí),由于每個(gè)編碼單元塊獲得一個(gè)線程塊的映射,即分配到獨(dú)立的共享內(nèi)存,可將共享內(nèi)存 充當(dāng)數(shù)據(jù)同步時(shí)的高速緩存,從而再度加速。
[0019] 聚簇型線程映射的好處是:第一,只要將一個(gè)LCU塊橫豎方向各分裂16次,即分成 256個(gè)小塊,每個(gè)小塊的像素由1個(gè)線程負(fù)責(zé),即可達(dá)到單線程塊256線程,充分利用硬件資 源;第二,在區(qū)域像素雷同現(xiàn)象的前提下,每個(gè)小塊內(nèi)的像素是高度一致,由單個(gè)線程負(fù)責(zé) 可以避開競爭寫同一變量的問題,從而減少因?yàn)閿?shù)據(jù)同步而等待的時(shí)間;第三,線程數(shù)量相 比對齊型線程映射減少,可以縮短未被調(diào)度線程的等待時(shí)間;第四,依然是1個(gè)線程塊映射1 個(gè)LCU塊的線程布局,仍然可以使用共享內(nèi)存充當(dāng)高速緩存。
[0020] 在一種優(yōu)選的方案中,步驟S2中,LCU塊級并行計(jì)算相對失真的具體方法為:對于 邊緣模式(E0,Edge Offset),無論沿哪個(gè)方向進(jìn)行像素比較,像素都被歸為5類,其中一類 無意義,對應(yīng)的修正值為0;對于每個(gè)LCU塊,可以使用4 X 5個(gè)線程分別計(jì)算4種邊緣分類模 式下,每類像素的在各個(gè)候選修正值下的相對失真,并將最小相對失真以及對應(yīng)的修正值 存放在線程塊的共享內(nèi)存中,再分配一線程從中選出相對失真最小的邊緣模式。
[0021] 在一種優(yōu)選的方案中,步驟S2中,LCU塊級并行計(jì)算相對失真的具體方法為:對于 邊帶模式(BO,BAND Off set),像素被分為32類;因此,每個(gè)LCU塊用1個(gè)線程塊映射,每個(gè)線 程塊包含32個(gè)線程,分別計(jì)算個(gè)邊帶各個(gè)候選修正值下的相對失真,并將最小相對失真和 取得該值下的修正值暫存于共享內(nèi)存中;然后,分配29個(gè)線程分別計(jì)算29個(gè)連續(xù)四邊帶的 相對失真,再從中選出邊帶模式下最優(yōu)的起始邊帶索引和4個(gè)最優(yōu)偏移值。
[0022] 與現(xiàn)有技術(shù)相比,本發(fā)明技術(shù)方案的有益效果是:
[0023]本發(fā)明提出一種基于GPU的并行SA0算法,利用GPU的大量線程進(jìn)行像素級并行統(tǒng) 計(jì)、塊級并行相對失真計(jì)算和像素級并行修正,從而獲得顯著的時(shí)間減幅。標(biāo)準(zhǔn)的SA0算法 非常不利于并行化。首先,參數(shù)融合機(jī)制使SA0塊參數(shù)具有不確定的數(shù)據(jù)依賴性;其次,區(qū)域 像素相關(guān)性導(dǎo)致統(tǒng)計(jì)時(shí)存在大量線程間的數(shù)據(jù)同步等待。針對上述兩項(xiàng)阻礙SA0并行化的 挑戰(zhàn),本發(fā)明結(jié)合GHJ的硬件特性,設(shè)計(jì)了兩種基于不同線程映射方法的像素級并行統(tǒng)計(jì)算 法和一種塊級并行相對失真計(jì)算算法。通過大量的實(shí)驗(yàn)分析,本發(fā)明設(shè)計(jì)并實(shí)現(xiàn)的并行SA0 (簡稱cuSAO)相比AVS2標(biāo)準(zhǔn)參考軟件的串行SA0(簡稱rdSAO)在耗時(shí)上獲得顯著的減幅,而 且不失精確性,平均耗時(shí)減幅高達(dá)70 %,最多可達(dá)90 %以上。
【附圖說明】
[0024] 圖1為本發(fā)明基于GPU的并行SA0算法的算法框架圖。
[0025] 圖2為跳躍型線程映射方法的示意圖。
[0026] 圖3為聚簇型線程映射方法的示意圖。
[0027]圖4為E0塊級并行相對失真計(jì)算算法。
[0028]圖5為B0塊級并行相對失真計(jì)算算法。
[0029] 圖6為IXU塊級串行決策最優(yōu)SA0參數(shù)算法。
[0030] 圖7為像素級并行SA0處理算法。
【具體實(shí)施方式】
[0031] 附圖僅用于示例性說明,不能理解為對本專利的限制;
[0032]下面結(jié)合附圖和實(shí)施例對本發(fā)明的技術(shù)方案做進(jìn)一步的說明。
[0033] 實(shí)施例1
[0034]如圖1所示,一種基于GPU的并行SA0算法,所述算法按照以下步驟依次處理視頻序 列的各幀:
[0035] S1:在GPU進(jìn)行像素級并行統(tǒng)計(jì),一個(gè)線程負(fù)責(zé)一個(gè)或多個(gè)像素在某種分類模式下 的統(tǒng)計(jì);
[0036] S2:在GPU進(jìn)行IXU塊級并行計(jì)算相對失真;
[0037] S3:在CPU進(jìn)行IXU塊級串行決策最終SA0參數(shù);
[0038] S4:在GPU進(jìn)行像素級并行修正。
[0039] 在具體實(shí)施過程中,步驟S1中,像素級并行統(tǒng)計(jì)的具體方法為:一個(gè)線程負(fù)責(zé)一個(gè) 或多個(gè)像素在某種分類模式下的統(tǒng)計(jì),時(shí)間復(fù)雜度可達(dá)0(1),線程與像素的映射方法為以 下三種映射方法的任意一種:
[0040] (1)對齊型線程映射方法:每一個(gè)線程負(fù)責(zé)圖像分量中一個(gè)像素的統(tǒng)計(jì)工作;
[0041 ] (2)跳躍型線程映射方法:如圖2所示,1個(gè)線程塊映射1個(gè)LCU塊,1個(gè)LCU塊包含64 X 64個(gè)像素,1個(gè)線程塊包含16X16個(gè)線程。跳躍型線程映射相比對齊型線程映射的一個(gè)改 進(jìn)點(diǎn)是:使用更少的線程,每個(gè)線程負(fù)責(zé)更多的像素統(tǒng)計(jì)。使用這種線程布局的理由是:第 一,線程塊內(nèi)256個(gè)(16X16)線程可以充分利用硬件性能;第二,每個(gè)LCU塊可以獲得一塊共 享內(nèi)存,仍然可以利用共享內(nèi)存作為高速緩存,對數(shù)據(jù)進(jìn)行分層匯聚。
[0042] (3)聚簇型線程映射方法:如圖3所示,每一個(gè)線程負(fù)責(zé)的像素是聚簇的,即每個(gè)線 程負(fù)責(zé)一塊像素。
[0043] 所述聚簇型線程映射方法中,使用一個(gè)線程塊映射一個(gè)編碼單元塊,每個(gè)線程塊 的線程數(shù)量可以調(diào)整,但最佳數(shù)量為256,每個(gè)線程負(fù)責(zé)的像素區(qū)域是方形聚簇的,這樣使 用的線程更少,可減少未調(diào)度線程的等待時(shí)間,也減少了線程間數(shù)據(jù)同步的等待時(shí)間,同 時(shí),由于每個(gè)編碼單元塊獲得一個(gè)線程塊的映射,即分配到獨(dú)立的共享內(nèi)存,可將共享內(nèi)存 充當(dāng)數(shù)據(jù)同步時(shí)的高速緩存,從而再度加速。
[0044] 聚簇型線程映射的好處是:第一,只要將一個(gè)LCU塊橫豎方向各分裂16次,即分成 256個(gè)小塊,每個(gè)小塊的像素由1個(gè)線程負(fù)責(zé),即可達(dá)到單線程塊256線程,充分利用硬件資 源;第二,在區(qū)域像素雷同現(xiàn)象的前提下,每個(gè)小塊內(nèi)的像素是高度一致,由單個(gè)線程負(fù)責(zé) 可以避開競爭寫同一變量的問題,從而減少因?yàn)閿?shù)據(jù)同步而等待的時(shí)間;第三,線程數(shù)量相 比對齊型線程映射減少,可以縮短未被調(diào)度線程的等待時(shí)間;第四,依然是1個(gè)線程塊映射1 個(gè)LCU塊的線程布局,仍然可以使用共享內(nèi)存充當(dāng)高速緩存。
[0045] 在具體實(shí)施過程中,步驟S2中,LCU塊級并行計(jì)算相對失真的具體方法為:
[0046] 如圖4所示,對于E0模式(邊緣模式),無論沿哪個(gè)方向進(jìn)行像素比較,像素都被歸 為5類,其中一類無意義,對應(yīng)的修正值為0;對于每個(gè)LCU塊,可以使用4X5個(gè)線程分別計(jì)算 4種邊緣分類模式下,每類像素的在各個(gè)候選修正值下的相對失真,并將最小相對失真以及 對應(yīng)的修正值存放在線程塊的共享內(nèi)存中,再分配一線程從中選出相對失真最小的邊緣模 式。
[0047]如圖5所示,對于B0模式(邊帶模式),像素被分為32類;因此,每個(gè)LCU塊用1個(gè)線程 塊映射,每個(gè)線程塊包含32個(gè)線程,分別計(jì)算個(gè)邊帶各個(gè)候選修正值下的相對失真,并將最 小相對失真和取得該值下的修正值暫存于共享內(nèi)存中;然后,分配29個(gè)線程分別計(jì)算29個(gè) 連續(xù)四邊帶的相對失真,再從中選出邊帶模式下最優(yōu)的起始邊帶索引和4個(gè)最優(yōu)偏移值。 [0048]如圖6所示,在具體實(shí)施過程中,步驟S3中,LCU塊級串行決策最終SA0參數(shù)的具體 方法包括以下步驟:
[0049] S31:遍歷編碼單元塊CTB,選出E0,B0模式下的最小AJ(相對率失真),其中CTB指 最大編碼單元塊為LCU的一個(gè)分量;
[0050] S32:取上鄰塊的ACTUAL_TYPE,0FFSET(偏移值,或修正值),計(jì)算當(dāng)前CTB在參數(shù)融 合下的A J,其中ACTUAL_TYPE用于保持參數(shù)傳遞性,即在鄰塊的MODE (模式)也為MERGE (參 數(shù)融合)時(shí),可以直接從ACTUAL_TYPE得到鄰塊的SA0參數(shù)信息。
[0051 ] S33:取左鄰塊的ACTUAL_TYPE,OFFSET,計(jì)算當(dāng)前CTB在參數(shù)融合下的A J;
[0052] S34:比較得出最小A J,判斷取最小A J時(shí)是否為N0_SA0(不進(jìn)行SA0處理),若是, 貝IJ0FFSET全為0,ACTUAL_TYPE為N0_SA0,并跳轉(zhuǎn)到步驟S31;若否,則跳轉(zhuǎn)到步驟S35;
[0053] S35:判斷取最小A J時(shí)是否為鄰塊參數(shù);
[0054] 若是,則使用鄰塊的OFFSET,寫MODE為MERGE,TYPE為具體merge哪個(gè)鄰塊,ACTUAL_ TYPE為鄰塊的ACTUAL_TYPE,返回步驟S31;
[0055] 若否,則使用新OFFSET,寫MODE為E0或B0, TYPE為具體模式,ACTUAL_TYPE做相應(yīng)記 錄,返回步驟S31;
[0056]各字段取值如表1所示。
[0057]表 1
[0059]當(dāng)然,上述的SA0參數(shù)表格含有大量的非碼流數(shù)據(jù),ACTUAL_TYPE數(shù)據(jù)只是用于輔 助塊級串行SAO參數(shù)決策算法,在實(shí)際寫碼流時(shí),一個(gè)LCU塊最多只寫入6個(gè)數(shù)據(jù),即MODE, TYPE,OFFSET [ 4 ],如果MODE=MERGE,那么連OFFSET也無須寫入碼流。
[0060] 如圖7所示,在具體實(shí)施過程中,步驟S4中,像素級并行修正的具體方法包括以下 步驟:
[0061] S41:計(jì)算每個(gè)線程的下標(biāo),將線程下標(biāo)轉(zhuǎn)化為像素下標(biāo),計(jì)算對應(yīng)的LCU索引; [0062] S42:讀取當(dāng)前像素所屬CTB的SA0參數(shù)的ACTUAL_TYPE信息,判斷是否做SA0,若是, 則跳轉(zhuǎn)到步驟S43;若否,則當(dāng)前像素的線程任務(wù)結(jié)束;
[0063] S43:判斷是否為邊緣模式;
[0064]若是,則依據(jù)邊緣模式方向計(jì)算相鄰像素的坐標(biāo),當(dāng)前像素與鄰像素比較,對其歸 類,讀取該類的修正值并修正,當(dāng)前像素的線程任務(wù)結(jié)束;
[0065]若否,為邊帶模式,則計(jì)算當(dāng)前像素所屬邊帶,讀取像素所屬邊帶的修正值并修 正,當(dāng)前像素的線程任務(wù)結(jié)束。
[0066] 相同或相似的標(biāo)號對應(yīng)相同或相似的部件;
[0067] 附圖中描述位置關(guān)系的用語僅用于示例性說明,不能理解為對本專利的限制;
[0068] 顯然,本發(fā)明的上述實(shí)施例僅僅是為清楚地說明本發(fā)明所作的舉例,而并非是對 本發(fā)明的實(shí)施方式的限定。對于所屬領(lǐng)域的普通技術(shù)人員來說,在上述說明的基礎(chǔ)上還可 以做出其它不同形式的變化或變動(dòng)。這里無需也無法對所有的實(shí)施方式予以窮舉。凡在本 發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明權(quán)利要求 的保護(hù)范圍之內(nèi)。
【主權(quán)項(xiàng)】
1. 一種基于GPU的并行SAO算法,其特征在于,所述算法按照以下步驟依次處理視頻序 列的各幀: Sl:在GPU進(jìn)行像素級并行統(tǒng)計(jì),一個(gè)線程負(fù)責(zé)一個(gè)或多個(gè)像素在某種分類模式下的統(tǒng) 計(jì); S2:在GRJ進(jìn)行LCU塊級并行計(jì)算相對失真; S3:在CRJ進(jìn)行IXU塊級串行決策最終SAO參數(shù); S4:在GPU進(jìn)行像素級并行修正。2. 根據(jù)權(quán)利要求1所述的基于GPU的并行SAO算法,其特征在于,步驟Sl中,像素級并行 統(tǒng)計(jì)的具體方法為:一個(gè)線程負(fù)責(zé)一個(gè)或多個(gè)像素在某種分類模式下的統(tǒng)計(jì),時(shí)間復(fù)雜度 可達(dá)0 (1 ),線程與像素的映射方法為以下三種映射方法的任意一種,其中聚簇型線程映射 方法效果最佳: (1) 對齊型線程映射方法:每一個(gè)線程負(fù)責(zé)圖像分量中一個(gè)像素的統(tǒng)計(jì)工作; (2) 跳躍型線程映射方法:1個(gè)線程塊映射1個(gè)LCU塊,1個(gè)LCU塊包含64 X 64個(gè)像素,1個(gè) 線程塊包含16 X 16個(gè)線程; (3) 聚簇型線程映射方法:每一個(gè)線程負(fù)責(zé)的像素區(qū)域是方形聚簇的,即每個(gè)線程負(fù)責(zé) 一塊像素。3. 根據(jù)權(quán)利要求2所述的基于GPU的并行SAO算法,其特征在于,所述聚簇型線程映射方 法中,使用一個(gè)線程塊映射一個(gè)編碼單元塊,每個(gè)線程塊的線程數(shù)量可以調(diào)整,每個(gè)線程負(fù) 責(zé)的像素區(qū)域是方形聚簇的。4. 根據(jù)權(quán)利要求2所述的基于GPU的并行SAO算法,其特征在于,步驟S2中,LCU塊級并行 計(jì)算相對失真的具體方法為:對于邊緣模式,無論沿哪個(gè)方向進(jìn)行像素比較,像素都被歸為 5類,其中一類無意義,對應(yīng)的修正值為0;對于每個(gè)LCU塊,可以使用4X5個(gè)線程分別計(jì)算4 種邊緣分類模式下,每類像素的在各個(gè)候選修正值下的相對失真,并將最小相對失真以及 對應(yīng)的修正值存放在線程塊的共享內(nèi)存中,再分配一線程從中選出相對失真最小的邊緣模 式。5. 根據(jù)權(quán)利要求2所述的基于GPU的并行SAO算法,其特征在于,步驟S2中,LCU塊級并行 計(jì)算相對失真的具體方法為:對于邊帶模式,像素被分為32類;因此,每個(gè)LCU塊用1個(gè)線程 塊映射,每個(gè)線程塊包含32個(gè)線程,分別計(jì)算個(gè)邊帶各個(gè)候選修正值下的相對失真,并將最 小相對失真和取得該值下的修正值暫存于共享內(nèi)存中;然后,分配29個(gè)線程分別計(jì)算29個(gè) 連續(xù)四邊帶的相對失真,再從中選出邊帶模式下最優(yōu)的起始邊帶索引和4個(gè)最優(yōu)偏移值。
【文檔編號】H04N19/42GK105959695SQ201610281623
【公開日】2016年9月21日
【申請日】2016年4月28日
【發(fā)明人】紀(jì)慶革, 林潤陽, 朱婷, 梁凡
【申請人】中山大學(xué)