国产精品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>

      由圖形處理單元支持的視頻解碼方法

      文檔序號:7719027閱讀:246來源:國知局
      專利名稱:由圖形處理單元支持的視頻解碼方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及一種用于向CPU提供圖形處理單元(GPU)支持以執(zhí)行最優(yōu)視頻解碼的 方法。
      背景技術(shù)
      目前,至少使用兩種不同的通用方法來實現(xiàn)處理單元通用中央處理單元(CPU) 以及專用圖形處理單元(GPU)。 GPU專門用于計算三維(3D)場景,以映射至用于顯示的二 維(2D)場景,并且GPU具有并行架構(gòu),該并行架構(gòu)使得高度地并行處理成為可能。因此GPU 具有高處理能力。然而,大多數(shù)普通編程應(yīng)用是針對CPU上的順序處理而優(yōu)化的。
      因此,需要使用GPU來加速視頻編碼和解碼。傳統(tǒng)上,為了從強大的GPU獲利,應(yīng) 當把計算任務(wù)(比如圖像或者視頻處理等等)重新表示為3D呈現(xiàn)(rendering)任務(wù),使 得可以將它們的數(shù)據(jù)組織為圖形數(shù)據(jù),并且應(yīng)當使用圖形API(應(yīng)用編程接口 )。這使得 GPGPU(GPU上的通用計算)困難并且使程序復(fù)雜。 為了簡化并且改善GPGPU的實現(xiàn),NVIDIA Corp.發(fā)布了針對GeForce 8800系列 以及其上GPU的"計算統(tǒng)一設(shè)備架構(gòu)(ComputeUnified Device Architecture) " (CUDA)。 CUDA是硬件和軟件架構(gòu),用于在作為并行數(shù)據(jù)計算設(shè)備的GPU上發(fā)出并且管理計算,而不 將它們映射至圖形API。 CUDA還改善了存儲器訪問效率。 —般地,每一個順序操作的程序以及并行程序的每一個順序操作的分支是所謂的 線程。線程對它們各自的輸入數(shù)據(jù)相當自治地進行操作并且提供輸出數(shù)據(jù)。從緩沖器中讀 取輸入數(shù)據(jù),并且將輸出數(shù)據(jù)寫入緩沖器中。GPU具有兩種基本類型的存儲器或者緩沖器 GPU上的紋理存儲通常與其它存儲器類型不同,從而能夠進行更有效率的訪問。在本文使用 的CUDA術(shù)語中,這兩種基本類型是所謂的全局存儲器和紋理存儲器。全局存儲器向所有線 程提供讀和寫訪問,但是相當慢,而紋理存儲器向線程提供只讀訪問,但是快速??梢詫?自全局存儲器的數(shù)據(jù)復(fù)制到紋理存儲器中。該結(jié)構(gòu)是針對典型的GPU任務(wù),比如紋理映射, 而優(yōu)化的。紋理是映射到3D對象表面的2D圖案。 CUDA提供多個多處理器以同時在不同的數(shù)據(jù)單元上進行相同的計算任務(wù)。CUDA 還提供通用DRAM存儲器尋址方法,給予程序員在DRAM中任意位置處進行讀和寫數(shù)據(jù)的靈 活性。此外,CUDA的特點在于具有非??焖俚耐ㄓ米x和寫訪問的并行數(shù)據(jù)高速緩存(片上 共享存儲器),以支持高效的數(shù)據(jù)共享。然而,DRAM和高速緩存在尺寸上受限并且對于很多 任務(wù)而言是不足夠的。此外,主機功能(即,當GPU作為CPU的協(xié)處理器工作時運行在CPU 上的功能)不能訪問共享存儲器。在這種情況下,在GPU獲得控制之前,不得不先由CPU來 管理程序和數(shù)據(jù)。 GPU可以對于多個數(shù)據(jù)層進行并行操作。通常,GPU具有四個數(shù)據(jù)層,這四個數(shù)據(jù) 層通常用于每像素的YRGB數(shù)據(jù)。例如,可以將輸入像素的四個8比特的元素作為4D輸入 向量進行存儲,然后獨立地并同時地處理它們。 視頻經(jīng)常根據(jù)MPEG-2標準來編碼,MPEG-2標準包括將圖像分割為宏塊(MB),并且順序地處理成行的MB。在圖1中示出了相應(yīng)的解碼過程,該過程主要包括可變長度解碼 101、逆掃描102、逆量化103、離散余弦逆變換(iDCT) 104以及運動補償(MC) 105。運動補償 使用在前解碼的圖像作為參考,因此,這些圖像存儲在幀存儲器106中。最后,將圖像的解 碼采樣輸出至顯示器。 —個問題是如何將例如視頻解碼等復(fù)雜、順序的任務(wù)映射至組合的CPU-GPU硬件 平臺上,特別是具有CUDA功能和上述存儲器結(jié)構(gòu)的平臺。盡管例如W02004/095708提供了 一種通用方法,但是依然難以將如此復(fù)雜過程的不同模塊分配給不同的硬件處理單元(CPU 和GPU),使得達到CPU和GPU工作負載之間的最優(yōu)平衡。理想地,CPU和GPU之間的時間成 本應(yīng)當幾乎相等,即CPU或者GPU都不應(yīng)當?shù)却齺碜粤硪粏卧慕Y(jié)果。

      發(fā)明內(nèi)容
      本發(fā)明至少解決了上述問題。本發(fā)明提供一種能夠在CPU和GPU平臺上實施的視 頻解碼系統(tǒng),其中單個解碼子任務(wù)具有如下結(jié)構(gòu)能夠以最優(yōu)方式來使用CPU的順序處理 能力、以及GPU的并行處理能力合存儲器結(jié)構(gòu)。有利地,在執(zhí)行本發(fā)明時,CPU和GPU的處 理負載幾乎相等。 根據(jù)本發(fā)明一方面,一種用于在包括主處理單元(CPU)和圖形處理單元(GPU)的 硬件架構(gòu)上對編碼視頻數(shù)據(jù)進行解碼的方法,其中,該圖形處理單元具有第一緩沖器(紋 理緩沖器)以及第二緩沖器(全局緩沖器),該方法包括下列步驟在主處理單元上對編碼 視頻的報頭和宏塊進行解碼,其中獲得解碼的圖像數(shù)據(jù);可選地對解碼的圖像數(shù)據(jù)執(zhí)行逆 量化(由于可以稍后在GPU上執(zhí)行該步驟,因此該步驟是可選的);將解碼的圖像數(shù)據(jù)或者 逆量化的圖像數(shù)據(jù)傳送至GPU,其中將數(shù)據(jù)存儲在GPU的第一 (全局)緩沖器中;然后在GPU
      上執(zhí)行下列步驟(如果之前還沒有在主處理單元上執(zhí)行逆量化)將傳送的數(shù)據(jù)進行逆量
      化,對逆量化的數(shù)據(jù)進行波形變換,執(zhí)行逆DCT,執(zhí)行運動補償,其中獲得重建的圖像數(shù)據(jù), 并且在GPU的第一 (全局)緩沖器中對重建的圖像數(shù)據(jù)進行緩沖,確定是否使用解碼的圖 像數(shù)據(jù)作為用于對至少一個其它圖像進行解碼的參考,如果使用解碼的圖像數(shù)據(jù)作為用于 對至少一個其它圖像進行解碼的參考,則從第一 (全局)緩沖器中將解碼的圖像數(shù)據(jù)復(fù)制 到第二 (紋理)緩沖器中,以及將重建的圖像數(shù)據(jù)從第一或者第二緩沖器向顯示器傳送。
      本發(fā)明的一個實施例涉及適合讓計算機執(zhí)行所述方法的軟件,并且具體地該計算 機包括協(xié)調(diào)執(zhí)行該方法的一個或者更多CPU以及一個或者更多GPU。 公開的解決方案包括與實施相關(guān)的幾個特殊問題,包括向CPU/GPU的模塊分配、 圖像存儲確定、以及殘差圖像的存儲確定??梢詫埐顖D像格式化為波形變換結(jié)果。
      圖像數(shù)據(jù)包括多個顏色空間格式(比如,4:4:4、4:2:2、4:2:0)之一的亮度和色度 分量(YUV)。此外,GPU可以典型地對于至少兩個(如上所述,通常是四個)數(shù)據(jù)層進行并 行操作。在本發(fā)明的一個實施例中,確定編碼圖像數(shù)據(jù)的顏色空間格式,并且根據(jù)確定的顏 色空間格式,對于第一顏色空間格式(4:4:4),在單個數(shù)據(jù)層中一并處理亮度數(shù)據(jù)(Y)和色 度數(shù)據(jù)(UV),而對于至少一個其它顏色空間格式(4:2:2、4:2:0),則在單獨的第一數(shù)據(jù)層 中處理亮度數(shù)據(jù)(Y),而在單獨的第二數(shù)據(jù)層中一并處理色度數(shù)據(jù)(UV)。在一個實施例中, 上述依賴于顏色空間格式的存儲和處理僅用于非殘差圖像,而對于殘差圖像來說,在單個 獨立的層中分別存儲并處理三個分量中每一個。
      從屬權(quán)利要求、下面的描述和附圖中披露了本發(fā)明的有利實施例。


      參照附圖來描述本發(fā)明的示例實施例,其中 圖1示出了簡化的常規(guī)MPEG-2視頻解碼過程; 圖2示出了基于CUDA的視頻解碼器的模塊分配; 圖3示出了基于CUDA的視頻解碼系統(tǒng)的示例架構(gòu); 圖4示出了使用基于CUDA的視頻解碼系統(tǒng)的示例視頻解碼過程; 圖5示出了使用基于CUDA的視頻解碼系統(tǒng)的另一個示例視頻解碼過程; 圖6示出了 GPU圖形流水線; 圖7示出了 CUDA中的線程分批(batching)的結(jié)構(gòu); 圖8示出了根據(jù)顏色空間格式的不同數(shù)據(jù)平面的使用; 圖9示出了用于線程的系數(shù)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu); 圖10示出了用于IQ和iDCT內(nèi)核(kernel)的輸入數(shù)據(jù)結(jié)構(gòu); 圖11示出了波形變換內(nèi)核的示例處理; 圖12示出了不同類型的運動補償內(nèi)核; 圖13示出了 MC的全局初始化過程; 圖14示出了 MC內(nèi)核的過程; 圖15示出了使用基于CUDA的視頻解碼系統(tǒng)的、改進的示例視頻解碼過程;以及 圖16示出了使用基于CUDA的視頻解碼系統(tǒng)的、改進的示例視頻解碼過程。
      具體實施例方式
      圖2示出了根據(jù)本發(fā)明一方面的基于CUDA的視頻解碼器中的基本模塊分配???變長度解碼101和逆掃描102在CPU上執(zhí)行。逆量化103可以在CPU或者GPU上執(zhí)行。離 散余弦逆變換(iDCT) 104a和運動補償(MC) 105a分配給GPU,這是特別有利的,因為它們是 計算密集型任務(wù)。在GPU內(nèi)的幀存儲器106a中存儲運動補償所需的在前解碼的參考圖像。 最后,將圖像的解碼采樣d[y][x]輸出至顯示器。注意,本文中"幀"代表可以在特定時刻 隔行掃描(interlaced)或逐行掃描(progressive)的圖像。
      通過根據(jù)本發(fā)明的解碼器框架來解決下列問題 1、將圖l所示的解碼過程中的不同處理步驟(S卩,模塊)分配給CPU或者GPU。該分 配最小化CPU和GPU之間的數(shù)據(jù)通信,平衡了 CPU和GPU之間的工作負載以最大化CPU-GPU 流水線效果,并且確保分配的模塊適合高效的CUDA實現(xiàn)。 2、確定在哪里存儲圖像數(shù)據(jù)、以及在哪里存儲殘差圖像(即,波形變換結(jié)果)。本
      發(fā)明最小化訪問工作量并且達到精確的采樣。 下面將描述系統(tǒng)流程圖,并且還將解釋幾個關(guān)鍵方面。 系統(tǒng)流程圖 圖3示出了基于CUDA的加速的視頻解碼系統(tǒng)202的示例架構(gòu),其接收編碼視頻比 特流,對接收的數(shù)據(jù)進行解碼,并且將解碼的數(shù)據(jù)傳送至顯示設(shè)備204(TV、計算機監(jiān)視器、 或者其它類似顯示設(shè)備)。注意,視頻解碼系統(tǒng)202還可以實現(xiàn)為顯示設(shè)備204的集成組件,或者反之亦然,顯示設(shè)備204可以是視頻解碼系統(tǒng)202的集成組件。
      可以在個人計算機、視頻游戲控制臺、或者配置為接收、解碼以及呈現(xiàn)視頻數(shù)據(jù)的 其它類似設(shè)備中實現(xiàn)視頻解碼系統(tǒng)202。視頻解碼系統(tǒng)202包括中央處理單元CPU 206、具 有CUDA功能的圖形處理單元GPU 208、用于存儲針對CPU的程序和數(shù)據(jù)的主機存儲器210、 以及用于存儲針對GPU的程序和數(shù)據(jù)的設(shè)備存儲器212??梢栽谝粋€器件(例如,芯片、板、 等等)中將主機存儲器210和CPU 206集成在一起,并且在通常情況下還可以將設(shè)備存儲 器212和GPU 208集成在一起。 主機存儲器210具有CPU緩沖器214,針對CPU程序所需的數(shù)據(jù),并且可由CPU訪 問;主機上內(nèi)核輸入數(shù)據(jù)緩沖器216,其存儲由CPU程序收集的并且GPU上的CUDA內(nèi)核執(zhí) 行所需的數(shù)據(jù);視頻解碼應(yīng)用218,其為運行在CPU上的解碼程序;可以駐留在主機存儲器 中的一個或者更多應(yīng)用220。注意,主機上圖像緩沖器234是主機存儲器中的可選塊,包含 設(shè)備圖像緩沖器226的副本。 設(shè)備存儲器212具有內(nèi)核程序222,其為運行在GPU上的解碼程序;設(shè)備上內(nèi)核 輸入數(shù)據(jù)緩沖器224 (設(shè)備緩沖器),其為主機上內(nèi)核輸入數(shù)據(jù)緩沖器216的GPU副本203 ; 圖像緩沖器226,其存儲包括參考圖像在內(nèi)的解碼的圖像;殘差圖像緩沖器228,其存儲解 碼的殘差圖像數(shù)據(jù)(即,波形變換結(jié)果)。用于其它應(yīng)用230的程序和數(shù)據(jù)也可以駐留在設(shè) 備存儲器中。注意,用于存儲用于顯示目的的圖像的顯示緩沖器232是可選模塊。備選地, 圖像緩沖器226可以用作顯示緩沖器。 圖4示出了在基于CUDA的加速的視頻解碼過程系統(tǒng)202上進行解碼的整體過程。 塊302-310代表由CPU 206執(zhí)行的處理,而塊312-326代表由GPU 208執(zhí)行的處理。
      在塊302,視頻解碼系統(tǒng)202接收編碼視頻比特流。所描述的實施方式示例地應(yīng)用 于根據(jù)MPEG-2逐行掃描視頻格式編碼的視頻比特流??梢耘渲脗溥x實施方式,對根據(jù)其它 格式編碼(比如MPEG-2隔行掃描、MPEG-4和H. 26x)的視頻比特流進行解碼。在塊304,處 理公共的解碼步驟,比如針對圖像的所有MB解碼多種報頭、執(zhí)行可變長度解碼等等。在塊 306,對從MB的可變長度解碼中獲得的波形變換系數(shù)執(zhí)行逆量化。在塊308,對解碼的圖像 數(shù)據(jù)進行緩沖,這些數(shù)據(jù)是GPU上的內(nèi)核執(zhí)行所需的,它們駐留在(與CPU相關(guān)的)主機緩 沖器216中,然后被復(fù)制203到(與GPU相關(guān)的)設(shè)備緩沖器224中。針對每一個圖像單 元(通常是MB或者塊)的此類數(shù)據(jù)可以包括位置數(shù)據(jù)或者坐標、逆量化的波形變換系數(shù)、 運動向量以及一些影響GPU上的程序執(zhí)行的標志。塊310從主機緩沖器216中將緩沖的數(shù) 據(jù)復(fù)制到設(shè)備緩沖器224中。 在塊312,以一些重建的圖像為基礎(chǔ)形成參考圖像。在一個優(yōu)選實施方式中,在 CUDA的全局存儲器中存儲重建的圖像,并且直接使用重建的圖像作為參考圖像。在另一個 優(yōu)選實施方式中,重建的圖像在全局存儲器中,而參考圖像在紋理存儲器中,并且在塊312
      中將來自全局存儲器中的數(shù)據(jù)復(fù)制到紋理存儲器中。下面給出關(guān)于確定在哪里存儲圖像的 進一步細節(jié)。 在塊314,在GPU上作為CUDA內(nèi)核來執(zhí)行波形變換(例如,逆DCT),以從CPU解碼 過程期間所收集的一些數(shù)據(jù)中獲得殘差圖像數(shù)據(jù)。下面描述該塊的更多細節(jié)。
      在塊316,在GPU上作為一個或者多個CUDA內(nèi)核來執(zhí)行運動補償(MC),以通過將 殘差圖像數(shù)據(jù)與參考圖像數(shù)據(jù)相加來重建圖像。下面描述該塊的更多細節(jié)。
      7
      在塊318,可以對重建的圖像進行緩沖,以用于可選的其它處理,比如可選地傳送 回主機存儲器320、可選地傳送至顯示緩沖器322、以及可選的面向顯示的處理324 (比如顏 色空間轉(zhuǎn)換、特殊效果創(chuàng)建等等)。最終,在塊326將圖像發(fā)送至顯示設(shè)備。
      圖5示出了用于在基于CUDA的GPU加速的視頻解碼系統(tǒng)202上進行解碼的整體 過程的另一變體。在該實施例中,逆量化也被卸載至GPU,這樣可以在塊315中將逆量化與 波形變換一起執(zhí)行。因此,在圖5中跳過了圖4中的逆量化塊306。
      下面,進一步解釋本發(fā)明的幾個關(guān)鍵構(gòu)思。
      對CPU/GPU的樽塊分配 從編程的角度來說,具有CUDA功能的GPU(本文中稱為設(shè)備)是能夠并行執(zhí)行數(shù) 量非常大的線程的計算設(shè)備。GPU作為主CPU(稱為主機)的協(xié)處理器來操作,運行應(yīng)用的 數(shù)據(jù)并行的、計算密集的部分。將該部分(稱為內(nèi)核)下載至該設(shè)備,并且在GPU上作為 很多不同的線程來執(zhí)行。將來自一個內(nèi)核的一批線程組織為線程塊網(wǎng)格(grid)。首先,由 能夠一起協(xié)作的多個線程來形成線程塊,其中這些線程通過一些共享存儲器來高效共享數(shù) 據(jù),并且將它們的執(zhí)行同步以協(xié)調(diào)存儲器訪問,從而能夠一起協(xié)作。線程塊內(nèi)的每一個線程 由該線程的線程ID來標識,該線程ID可以是2或者3個分量的數(shù)組索引。其次,可以將多 個線程塊分批地一起成為塊網(wǎng)格,在該網(wǎng)格中由2個分量的數(shù)組索引(塊ID)來標識每一 個塊。在圖7中示出了該線程分批(batching)組織。如果輸入和輸出數(shù)據(jù)組織良好,則線 程可以基于塊ID和線程ID,單獨地訪問不同的數(shù)據(jù)部分,從而可以實現(xiàn)對不同數(shù)據(jù)的并行 執(zhí)行。 波形變換(比如DCT、逆DCT等等)是數(shù)據(jù)并行的計算密集型模塊,從而適合CUDA 實現(xiàn)。為了最小化CPU-GPU數(shù)據(jù)通信,還將運動補償分配給GPU。因此,在GPU上分配針對 所有圖像的幀存儲存儲器并維護該幀存儲存儲器。最終,圖2示出了基本的模塊分配結(jié)果。 該分配達到了CPU-GPU工作負載的良好平衡(幾乎相等的時間成本)。數(shù)據(jù)通信非常低。 在一個實施例中,僅從CPU向GPU傳送非零波形系數(shù)(例如,DCT系數(shù))、運動向量以及塊地 址。 該基本分配的變體是可能的。在一個實施例中,可以將逆量化改變?yōu)樵贕PU上運 行,從而對CPU-GPU工作負載進行輕微調(diào)整。在一個實施例中,可以從GPU向CPU傳送解碼 的采樣或者圖像,例如用于CPU上的后處理等應(yīng)用。 這里提出的不同模塊向不同硬件平臺(CPU或者GPU)的分配至少具有下列優(yōu)點
      1 、最小化CPU和GPU之間的數(shù)據(jù)通信;
      2、平衡了 CPU和GPU的工作負載; 3、可以用CUDA高效地實現(xiàn)卸載至GPU的模塊,即,它們是數(shù)據(jù)并行的、計算密集型 模塊。 確定針對圖像的存儲 針對GPU上的圖像存儲,必須決定至少兩個問題如何確定用于存儲的存儲器空 間、以及如何確定用于Y、U、V分量的數(shù)據(jù)封裝(packing)格式。 對于第一個問題,可以在比如寄存器、局部存儲器、共享存儲器、全局存儲器、常數(shù) 存儲器以及紋理存儲器等不同空間處分配由CUDA訪問的GPU存儲器。它們在總的可用大 小、訪問許可(只讀/讀寫)、等待時間(latency)、訪問限制(例如從CPU或GPU可訪問)、同步支持等等方面相當不同。優(yōu)選解決方案是使用全局存儲器,而不是使用紋理存儲器,全 局存儲器支持線程中的讀寫操作并且可以處理大量的圖像數(shù)據(jù),而紋理存儲器對于線程來 說是只讀的。因此,這使得線程可以既執(zhí)行讀操作又執(zhí)行寫操作。然而,使用全局存儲器具 有兩個缺點第一,全局存儲器數(shù)據(jù)的讀操作比紋理數(shù)據(jù)的讀操作要慢很多,第二,必須在 用于對參考圖像進行采樣的線程中顯式地管理插值計算。這是復(fù)雜并且低效率的,而如果 使用紋理存儲器,這是可以自動地處理的。 本發(fā)明該方面是基于認識到下述事實當使用圖像作為對新圖像進行解碼的參考 時,運動補償模塊僅執(zhí)行讀操作,而僅當對圖像進行解碼時才需要寫操作。即,當對圖像進 行解碼時,僅由一個操作來訪問具體圖像的數(shù)據(jù),即要么是讀操作(當作為參考圖像使用 時),要么是寫操作(當作為正被解碼的結(jié)果圖像時)。從而,本發(fā)明的一個方面是使用全 局存儲器來存儲解碼的圖像,在對新圖像(如果將使用它作為參考圖像的話)進行解碼之 前將解碼的數(shù)據(jù)復(fù)制到紋理存儲器中,并且從紋理存儲器訪問參考圖像。 在一個實施例中,可以將所有圖像復(fù)制到紋理存儲器中,而另一個實施例包括下 述步驟確定解碼的圖像是否將作為參考圖像使用,僅當將使用它作為參考時才將它復(fù)制 到紋理存儲器中。根據(jù)視頻編碼,可以對作為解碼用的參考圖像的圖像進行標記,例如通過 標志進行標記,或者可以接收參考圖像的列表。注意,在主機功能中允許對紋理存儲器的寫 操作。"主機功能"是由CPU發(fā)起的功能,但是效果可以是在GPU上,例如從全局存儲器向 紋理存儲器復(fù)制數(shù)據(jù),或者從紋理存儲器向全局存儲器復(fù)制數(shù)據(jù)。在本文使用的CUDA術(shù)語 中,"主機"意味著CPU,并且"設(shè)備"意味著GPU。與GPU相關(guān)的其它主機功能是例如CPU-GPU 數(shù)據(jù)通信、GPU-GPU數(shù)據(jù)通信、內(nèi)核發(fā)起或者GPU能力查詢。"內(nèi)核"是在GPU上執(zhí)行的功能。 然而,CPU執(zhí)行"內(nèi)核發(fā)起",其中將代碼復(fù)制到GPU上,并且為內(nèi)核執(zhí)行準備GPU資源。
      該方案解決了全局存儲器訪問的上述兩個缺點(讀操作較慢,如果在用于對參考 圖像進行采樣的線程中管理插值計算,則效率很低)。從全局存儲器向紋理存儲器復(fù)制數(shù)據(jù) 的附加成本是可忽略的。 對于第二個問題,即如何確定針對MB的Y、 U、 V分量的數(shù)據(jù)封裝格式,提議的解決 方案是適應(yīng)性的,取決于所使用的色度格式。GPU通常對頂點進行操作;頂點是多邊形的邊 緣。每一個頂點不僅具有x、y、z坐標系形式的位置,還具有用于將紋理映射至頂點的三個 紋理坐標u、v、w。因此,GPU架構(gòu)提供了針對u、v以及w紋理坐標的、分離的所謂通道或者 平面。注意,必須將頂點的紋理坐標u、 v、 w與圖像的亮度/色度分量YUV區(qū)分開來。
      根據(jù)本發(fā)明一個方面,如圖8所示,根據(jù)使用的色度格式,在不同的架構(gòu)平面801、 802中存儲并且處理MB的YUV分量,或者將MB的YUV分量成組為單個3分量的平面803。 該單個平面方案讓實施清晰簡單,而3平面方案更有效率,這是由于可以通過單個存儲器 訪問來獲取三個分量。然而,對于通常使用的色度格式(4:2:0以及4:2:2)來說,需要對U、 V數(shù)據(jù)進行上采樣以達到與Y數(shù)據(jù)相同的分辨率,這是附加的處理步驟。這導(dǎo)致紋理獲取 (采樣)操作中的精確度的犧牲。 如圖8a)所示,為了對效率和精確兩者進行優(yōu)化,針對4:2:0和4:2:2顏色空間格 式420、422,使用2平面數(shù)據(jù)封裝格式801、802。更具體地,將Y數(shù)據(jù)組織為1分量平面801, 并將U和V數(shù)據(jù)封裝進2分量平面802 。對于4:4:4色度格式444,采用3分量方案803 ,如 圖8b)所示。
      石角靴趣差隨白勺剤諸 類似于上面描述的圖像存儲,對于如何確定殘差圖像(即,相應(yīng)的波形變換結(jié)果) 的存儲,出現(xiàn)兩個相似的問題。殘差圖像是以至少一個參考圖像為基礎(chǔ)的預(yù)測的剩余部分, 即,其原理上為預(yù)測誤差。在接收端,必須將參考圖像與殘差相加,以獲得重建的圖像。
      對于第一個問題,S卩如何確定使用哪個存儲器空間來存儲殘差圖像,情況和分析 類似于非殘差圖像的情況。有兩個選擇要么僅在全局存儲器中存儲波形變換結(jié)果(WTR) 并且從該全局存儲器中讀取該結(jié)果,要么首先在波形變換模塊內(nèi)部的全局存儲器中存儲 WTR,然后將WTR復(fù)制到紋理存儲器,然后從紋理存儲器中將WTR讀取至運動補償模塊(運 動補償執(zhí)行參考圖像數(shù)據(jù)和WTR的相加)。根據(jù)本發(fā)明的一個方面,選擇第一方案。其具有 可以節(jié)約從全局存儲器向紋理存儲器復(fù)制數(shù)據(jù)的附加成本(盡管該成本較低)這一優(yōu)點。 與上述非殘差圖像的情況的不同之處在于第一,當對WTR進行采樣時不需要插值操作;第 二,已經(jīng)發(fā)現(xiàn),運動補償模塊的瓶頸是圖像數(shù)據(jù)寫操作,而不是WTR的讀取。因此,在全局存 儲器中存儲WTR而不將它們復(fù)制到紋理存儲器是有好處的。 對于確定針對殘差的Y、U、 V分量的數(shù)據(jù)封裝格式的問題,對于這些分量,波形變 換的輸入數(shù)據(jù)是獨立的。參見圖8c),在一個實施例中,選擇三個1分量平面作為針對殘差 圖像的封裝格式。 本發(fā)明的一個具體優(yōu)點是其非常高效,同時提供高精確度級別。
      波形變換(WT) 下面,描述與波形變換塊相關(guān)的更多細節(jié)。波形變換是重要的并且是在數(shù)字 視頻處理中廣泛應(yīng)用的變換。它們是不同圖像和視頻編碼標準(比如JPEG、 JPEG2000、 MPEG-l、-2、-4、H.261、H.263、4等等)的關(guān)鍵組成部分。盡管存在大量的波形變換,波形變 換使用非常相似的計算公式。盡管在本公開內(nèi)容中僅示例地描述DCT (離散余弦變換,也稱 作"正向DCT")和逆DCT(iDCT),但是原理上可以將相同的討論應(yīng)用于其它的波形變換。
      在編碼器中使用DCT,其將一組圖像像素變換為系數(shù);系數(shù)的數(shù)目與輸入數(shù)據(jù)的 數(shù)目相同。然后在解碼器中使用逆DCT,用于將系數(shù)變換回像素值。最普通的情況是應(yīng)用 DCT/iDCT,以變換/重建8*8像素的2D圖像數(shù)據(jù),其中DCT公式為
      。,、C(") C(V) + +,, 、(2x + l)"7T (2y + l)V7T
      F ("'V) = T' T S g 力C。S C。S ~~TT~ 其中 8*8圖像數(shù)據(jù)是f (x, y) :x = 0, , 7和y = 0, , 7
      8氺8DCT系數(shù)是F(u, v) :u = 0, , 7和v = 0, , 7
      (1) CO)=
      是常數(shù)c
      i,"*o是常數(shù)。
      逆DCT公式為
      X X C(w)C(v)F(w, v) cos——^——cos ——
      (2)
      可以用具有相同形式的矩陣乘法來表示兩種變換(DCT和iDCT)。我們使用iDCT
      10作為例子 Pict = B*Coeff*BT (3) 所有矩陣是8*8維的,并且它們的元素為 c。^j =尸(,',7')力"^ & =歸/(;"咖(2:), 其中comt (_/')=
      0.5,乂-0 。
      令B = [b。 b! . b7],得到等價的矩陣表示:^'"=Zc。0,,r (4) 或者令Mi,j = bjbiT,得到泡-i;CoeK乂 (5) 由于DCT和iDCT如此重要,因此存在在不同的平臺上的不同的軟件/硬件實現(xiàn)。 現(xiàn)有的基于GPU的實現(xiàn)工是基于等式3或者JPEG ANN快速算法的。這兩種類型都可以達 到與優(yōu)化的CPU實施可比的性能,并且由于規(guī)則的存儲器訪問,第一種1具有比第二種高的 性能。另一種提議2是基于等式5的GPU實現(xiàn),獲得了高效的GPU解決方案。然而,依然具 有一些缺點存儲了用于計算的所有Mi,j矩陣,總共64*64個浮點值。這是對存儲器空間的 浪費,并且因此該方法效率不高。
      _ 卞ang B. , Shen G. , Li S. , Chen H. -Techniques for efficient DCT/iDCT implementation on generic GPU. In -Proceedings of IEEE International Symposium on Circuit and Systems(2005),pp.1126-1129 2Bo Han, Bingfeng Zhou, Efficient Video Decoding on GPUs by Point Based Rendering,In HWWS' 06,Proceedings of the ACM SIGGRAPH/Euro-graphics conference on Graphics Hardware(Vienna, 2006) 根據(jù)本發(fā)明的一個方面,波形變換(使用iDCT作為下面描述的例子)在GPU上作 為CUDA內(nèi)核進行運行。在上面描述了一些CUDA概念,比如內(nèi)核、線程、線程塊、以及網(wǎng)格。
      在圖3的系統(tǒng)202中,下列塊與iDCT任務(wù)相關(guān)主機上內(nèi)核輸入數(shù)據(jù)緩沖器216、 視頻解碼應(yīng)用218、內(nèi)核程序222、設(shè)備上內(nèi)核輸入數(shù)據(jù)緩沖器224以及殘差圖像緩沖器 228。 內(nèi)核程序222包括所有內(nèi)核。多個波形變換內(nèi)核可以用于不同的數(shù)據(jù)塊分辨率 以及不同的常數(shù)矩陣(即,等式3中的矩陣B)。例如對于8x8 iDCT來說,使用一個內(nèi)核 kernel」DC乙8x8就足夠了。將基于CUDA的iDCT內(nèi)核作為多個線程來執(zhí)行。線程分批如 下一個線程處理一行上的所有數(shù)據(jù)元素,一個線程塊處理固定數(shù)目(典型的,16或者8,記 錄為RESIDUAL_BL0CK_BASE_NUM)的8x8數(shù)據(jù)塊。線程ID是2維索引, 一個值代表在數(shù)據(jù)塊 內(nèi)部的垂直位置,并且另一個值代表不同的數(shù)據(jù)塊。塊ID是1維的,并且對于每RESIDUAL_ BL0CK_BASE_NUM個數(shù)據(jù)塊,該塊ID增加1。注意,該方案要求數(shù)據(jù)塊的總數(shù)為RESIDUAL_ BL0CK_BASE_NUM的整數(shù)倍。為了解決該問題,插入"偽"數(shù)據(jù)塊(例如空數(shù)據(jù)塊),如下所解釋的。 GPU上的iDCT執(zhí)行需要一些輸入數(shù)據(jù),這些輸入數(shù)據(jù)存儲在圖3的內(nèi)核輸入數(shù)據(jù) 緩沖器216和224中。盡管可以存儲所有系數(shù)(S卩,等式3的矩陣Coef f中的所有數(shù)據(jù)),但 是當大多數(shù)系數(shù)為零時,這種方案浪費太多存儲器和CPU/GPU通信帶寬。根據(jù)本發(fā)明一方 面,更好的方案是僅存儲非零系數(shù)。在一個實施例中,存儲非零系數(shù)值和它們的坐標(即, 該系數(shù)在等式3的矩陣Coeff中的位置)。該方案在存儲器使用和帶寬上更有效率。
      當僅存儲非零數(shù)據(jù)時,由于非零系數(shù)的數(shù)目對于不同數(shù)據(jù)塊來說是不同的,因此 每一個數(shù)據(jù)塊需要的存儲器大小是可變的。在圖9所示的實施例中,為了讓存儲器大小統(tǒng) 一,將系數(shù)數(shù)據(jù)存儲進兩個數(shù)據(jù)結(jié)構(gòu)(例如存儲區(qū))中第一公共數(shù)據(jù)結(jié)構(gòu)904、904a是針 對圖像中所有非零系數(shù)的大型的l維(ID)紋理,包括值和坐標;第二數(shù)據(jù)結(jié)構(gòu)902、902a是 針對每一個數(shù)據(jù)塊的統(tǒng)一大小的數(shù)據(jù)集合,包括ID紋理中的起始地址和非零系數(shù)的總數(shù) 目。 第一線程901獲得具有恒定的預(yù)定義大小和特定結(jié)構(gòu)的輸入數(shù)據(jù)902。輸入數(shù)據(jù) 902至少包括對ID紋理存儲器903中的特定數(shù)據(jù)范圍904進行標識的地址和長度值。第二 線程901a獲得具有相同大小和結(jié)構(gòu)的不同輸入數(shù)據(jù)902a,但是地址和長度值標識紋理存 儲器903中不同的范圍904a??梢詮募y理存儲器903中獲取用于處理的實際非零系數(shù)以 及它們的矩陣坐標。圖9b)示例地示出了系數(shù)和它們的坐標可以如何在1D數(shù)據(jù)結(jié)構(gòu)904、 904a中可進行格式化??梢钥吹剑缦禂?shù)i, j+1和i, j+2是零,因此不存儲它們。用于 坐標的比特的數(shù)目(例如,每個是3比特)從矩陣大小得到。本發(fā)明的該方面具有下述優(yōu) 點所有殘差圖像塊的線程輸入數(shù)據(jù)具有統(tǒng)一的存儲空間,從而可以在內(nèi)核中容易地訪問 它們。 在一個實施例中,iDCT輸入數(shù)據(jù)包括圖IO所示的數(shù)據(jù)元素。這些是大小獨立的 第一塊1802,其存儲圖像的所有非零系數(shù)(包括值和坐標);以及大小統(tǒng)一的第二塊1804, 其存儲針對每一個線程的輸入數(shù)據(jù),并與圖9的塊902、902a相對應(yīng)。在塊1802中,與圖9 的數(shù)據(jù)結(jié)構(gòu)904、904a相對應(yīng),將來自一個數(shù)據(jù)塊的系數(shù)和它們的坐標以連續(xù)地址存儲。大 小獨立的數(shù)據(jù)塊1802是針對完整圖像的一個數(shù)據(jù)列表,而塊1804具有分別針對每一個數(shù) 據(jù)塊的獨立的數(shù)據(jù)。注意,將塊1802分配為GPU上的CUDA紋理。 在一個實施例中,塊1804至少包括下列數(shù)據(jù)元素一個數(shù)據(jù)塊中非零系數(shù)的總數(shù) 1806、完整列表中非零系數(shù)的起始地址1808、殘差圖像中數(shù)據(jù)塊的目標位置1810(即,在哪 里寫入iDCT結(jié)果)、以及指示DCT類型的一比特標志1812 (即,幀DCT或者域DCT)。標志 1812影響殘差圖像中的間隔值,S卩,在殘差圖像中具有相同水平坐標的相鄰行上的兩個像 素之間的位置差異。 當在GPU上執(zhí)行逆量化(IQ)時,存在如圖10中的塊1814所示的附加輸入數(shù)據(jù)。塊 1814可以具有針對來自不同視頻標準的不同IQ操作的不同數(shù)據(jù)元素。例如,針對MPEG-2, 塊1814可以具有下列元素-量化器矩陣索引,指示哪個量化器矩陣將用于IQ。所有量化器矩陣是IQ過程中 使用的常量值;-量化器縮放因子,用于對除了幀內(nèi)DC (intra DC)值之外的所有系數(shù)執(zhí)行逆量化 算術(shù);以及
      12
      -乘法因子,用于幀內(nèi)DC IQ。如果在CPU上執(zhí)行幀內(nèi)DC IQ,則可以省略該值。
      為了節(jié)約存儲器,可以將多個值封裝進一個數(shù)據(jù)元素中。可以在CPU上的解碼步 驟304期間,至少將要作為波形變換線程的線程輸入數(shù)據(jù)而使用的那些數(shù)據(jù)收集到內(nèi)核數(shù) 據(jù)輸入緩沖器塊216中。然后通過圖4或者圖5的塊310中的特定CUDA API調(diào)用,將所有 數(shù)據(jù)復(fù)制203到GPU上的塊224中。在一個實施例中,可以創(chuàng)建一個或者更多"偽"數(shù)據(jù)塊, 以讓數(shù)據(jù)的總量為RESIDUAL_BLOCK_BASE_NUM的倍數(shù)。這些偽塊中的數(shù)據(jù)應(yīng)當使得相應(yīng)線 程進行無害的操作。例如,可以將目的地址設(shè)置在殘差圖像范圍之外,并且將非零系數(shù)的數(shù) 目設(shè)置為零。 對每一個圖像執(zhí)行iDCT。 iDCT需要全局初始化操作,對于整個序列來說,全局初 始化操作僅執(zhí)行一次。初始化包括下列步驟分配殘差圖像緩沖器,其中在全局存儲器中分 配殘差圖像數(shù)據(jù)(即,iDCT結(jié)果),并且可以分配附加存儲器以處理上述"偽"數(shù)據(jù)塊;以及 準備常數(shù)矩陣,其中,準備等式3中的常數(shù)矩陣B用于iDCT計算??梢郧袚Q至針對任意其 它波形變換的另一常數(shù)矩陣,而可以直接應(yīng)用相同的處理步驟。準備的步驟包括選擇恰當 的常數(shù)矩陣。 由于在MC和iDCT中都使用殘差圖像,因此還可以在下述運動補償中執(zhí)行分配殘 差圖像緩沖器的步驟。針對每一個圖像的iDCT是圖4中的塊314,當還執(zhí)行IQ時針對每一 個圖像的iDCT還可以是圖5中的塊315??梢匀鐖D11所示的下列步驟進一步將其內(nèi)核分 為在塊1002中,讀取統(tǒng)一大小的數(shù)據(jù); 在塊1004中,執(zhí)行用于iDCT計算的初始化步驟。由于等式4用于計算,因此將求 和結(jié)果初始化為零; 在塊1006、1008、1010以及1012中,執(zhí)行iDCT計算,其中順序地處理所有非零系 數(shù)。在讀取每一個系數(shù)之后1008,可以可選地執(zhí)行IQIOIO。然后用等式3中的矩陣B的合 適的常數(shù)系數(shù)乘以系數(shù)值,并且與求和結(jié)果相加1012。最后,在處理了所有非零系數(shù)之后, 將結(jié)果修剪(clip)至給定范圍1014,并且將結(jié)果輸出至殘差圖像存儲器1016。在塊1016, 如在下面"WT內(nèi)核設(shè)計"節(jié)所解釋的,在寫入之前封裝經(jīng)修剪的值。
      WT內(nèi)核任務(wù)規(guī)范 如等式2所示,對于iDCT來說,內(nèi)核任務(wù)主要是從系數(shù)計算圖像數(shù)據(jù)。然而,對 算法的選擇不是小事。在一個實施例中,使用等式4,帶來了比如US 2006/0056513或者 EP1641278A2中披露的已知方法更快和更有效率的實現(xiàn)。時間成本減少大約50%。還極大 的減少了對常數(shù)存儲器的需求,從64*64個浮點值減少至僅僅64個浮點值。
      WT數(shù)據(jù)組織 上面已經(jīng)描述并且在圖lO中詳細示出了用于在數(shù)據(jù)塊上執(zhí)行iDCT所需的數(shù)據(jù)。 一個實施例中的數(shù)據(jù)組織的特征在于,針對非零系數(shù)使用兩個數(shù)據(jù)結(jié)構(gòu)(塊802和804),并 且在CUDA紋理緩沖器中組織所有系數(shù)。然而,在一些情況下,例如對于具有極高比特率的 視頻序列來說,直接存儲所有系數(shù)(零和非零)是有利的。根據(jù)是在CPU還是GPU上執(zhí)行 逆量化(IQ),存在兩個版本的所需的輸入數(shù)據(jù)。可以將多個值封裝進一個數(shù)據(jù)元素,以節(jié)約 存儲器。 WT內(nèi)核設(shè)計
      如上所述,在一個實施例中,內(nèi)核設(shè)計的一些關(guān)鍵點是使用一個線程來處理一個 數(shù)據(jù)塊中一行上的所有數(shù)據(jù),使用"偽"數(shù)據(jù)塊,以及使用封裝的數(shù)據(jù)來用于寫入。將來自 一個線程的所有重建的殘差圖像數(shù)據(jù)封裝進一個結(jié)構(gòu)中,并且通過一次值分配操作寫入存 儲器中。這些構(gòu)思是彼此獨立的(即,這些構(gòu)思中的各個可以使用或者不使用)。第一個構(gòu) 思,即,使用一個線程來處理一個數(shù)據(jù)塊中一行上的所有數(shù)據(jù),是對于效率來說最關(guān)鍵的因 素。在示例的內(nèi)核實現(xiàn)中,RESIDUAL_BLOCK_BASE_NUM是8。還可以將該方案應(yīng)用于執(zhí) 行針對以例如MPEG-1、 MPEG-4、 H. 264等其它標準編碼的視頻序列的iDCT。本發(fā)明原理上 還可以用于在編碼器中使用的DCT操作,例如具有與等式3相似的公式的其它波形變換可 以使用本算法。等式3中的矩陣維度可以是除了 8以外的其他整數(shù)。
      運動補償(MC) 下面,描述與運動補償塊相關(guān)的更多細節(jié)。 運動補償(MC)是視頻解碼器中的基礎(chǔ)模塊。編碼視頻數(shù)據(jù)(通常被組織為方塊 (square block))包含運動向量,運動向量指示了相似塊在參考圖像中的位置;以及殘差 圖像數(shù)據(jù),殘差圖像數(shù)據(jù)對編碼塊和參考塊(或者一個或者更多參考塊的插值結(jié)果)的差 進行編碼。MC可以找到參考塊,執(zhí)行恰當?shù)牟蓸雍推骄?,并且加上殘差圖像數(shù)據(jù),以重建 圖像。當數(shù)據(jù)是幀內(nèi)編碼并且不存在參考時,MC可以使用殘差數(shù)據(jù)來用于圖像重建。在 MPEG-2中,針對逐行掃描序列的MC模塊是非常簡單的預(yù)測模式(即,使用參考圖像的模 式)始終是幀預(yù)測,即,將運動向量分配給針對Y分量(亮度)數(shù)據(jù)的完整16*16宏塊。
      然而,由于逐行掃描序列在實際應(yīng)用中非常普遍,因此該簡單的MC已經(jīng)具有非常 大的實際價值。此外,由于MC的所有基本操作對于逐行掃描和隔行掃描視頻是共享的,比 如半像素采樣、加上波形變換結(jié)果(即,殘差圖像數(shù)據(jù))、以及寫入解碼的圖像等,因此至隔 行掃描序列的擴展是非常容易的。此外,逐行掃描視頻已經(jīng)包括了 MPEG-2中所有的圖像編 碼類型(幀內(nèi)編碼、預(yù)測編碼以及雙向預(yù)測編碼)。
      在執(zhí)行運動補償時,分析和解決下列問題-指定運動補償?shù)木唧w子任務(wù),作為內(nèi)核。為了最優(yōu)化效率,內(nèi)核執(zhí)行高效構(gòu)建的、 數(shù)據(jù)并行的計算密集型任務(wù)。-組織用于內(nèi)核執(zhí)行的輸入和輸出數(shù)據(jù)??梢栽贑PU和GPU功能中容易地訪問數(shù)
      據(jù),同時最小化CPU和GPU之間的數(shù)據(jù)通信。-通過紋理獲取來對參考圖像進行采樣。 根據(jù)本發(fā)明一個方面,MC作為GPU上的一個或者更多CUDA內(nèi)核而運行。在圖3 中,下列塊與MC相關(guān)主機上內(nèi)核輸入數(shù)據(jù)緩沖器216、視頻解碼應(yīng)用218、內(nèi)核程序222、 設(shè)備上內(nèi)核輸入數(shù)據(jù)緩沖器224、圖像緩沖器226以及殘差圖像緩沖器228。
      內(nèi)核程序222包括所有內(nèi)核。圖12示出了針對CUDA執(zhí)行的所有MC內(nèi)核的可能 的實現(xiàn)。下面給出對MC內(nèi)核定義的更多解釋。 在圖12a)中,16xl6、8x16以及8x8是不同的圖像塊分辨率;參考的不同情況是幀 內(nèi)、前向、后向以及雙向。在分離的內(nèi)核中分別處理塊分辨率和參考的每一種組合。圖12b) 示出了另一種MC內(nèi)核選擇在"xxxx」nter"內(nèi)核426、428、430以及"xxxx」ntra"內(nèi)核 402、410、418中,將針對幀間和幀內(nèi)預(yù)測的三種參考情況,即前向、后向、雙向,合并并一起進行處理。圖12c)示出了 MC內(nèi)核的第三種選擇,其中在一個內(nèi)核432、434、436中將針對 幀間和幀預(yù)測的所有參考情況進行合并并且處理。具體地,對于第二和第三種情況來說,可 以將較大的塊分為較小的塊并作為較小的塊進行處理。 在CUDA中,將MC內(nèi)核作為多個線程加以執(zhí)行。內(nèi)核設(shè)計依賴于所使用的線程分
      批。在一個實施例中,使用一個線程處理一個圖像塊中一行上的所有像素,并且使用一個線
      程塊處理固定數(shù)目的圖像塊(典型地是16或者8,記錄為PICT_BLOCK_BASE_NUM)。 GPU上的MC執(zhí)行需要一些輸入數(shù)據(jù),這些輸入數(shù)據(jù)包括在圖3的內(nèi)核輸入數(shù)據(jù)緩
      沖器塊216和224中。在"MC數(shù)據(jù)組織"節(jié)中進一步解釋了與MC相關(guān)的數(shù)據(jù)元素。與上
      面對于波形變換所描述的類似,可以創(chuàng)建一個或者更多"偽"數(shù)據(jù)塊,以讓數(shù)據(jù)塊的總數(shù)為
      PICT_BLOCK_BASE_NUM的倍數(shù)。 對于每一個圖像執(zhí)行MC, MC需要全局初始化操作,對于整個序列,全局初始化操 作僅執(zhí)行一次。如圖13所示,初始化包括下列步驟分配殘差圖像緩沖器502、分配用于寫 入的圖像緩沖器504、以及分配用于讀取的圖像緩沖器506。 在分配殘差圖像緩沖器的塊502中,在全局存儲器中分配殘差圖像數(shù)據(jù)(S卩,波形 變換結(jié)果)。 在塊"分配用于寫入的圖像緩沖器"504中,在全局存儲器中分配用于寫入的圖像 數(shù)據(jù)(即重建的圖像)。分配附加存儲器,以用于處理"偽"圖像塊。 在"分配用于讀取的圖像緩沖器"的塊506中,將用于讀取的圖像數(shù)據(jù)(即,參考 圖像)分配作為紋理。啟用針對線性過濾和數(shù)據(jù)歸一化的標志。在下面的"通過紋理獲取 的圖像采樣"節(jié)中給出更多的解釋。 在圖4的MC模塊316中進行針對每一個圖像的MC。還可以根據(jù)圖14中所示的下 列步驟進一步劃分其內(nèi)核。這些步驟對于上述所有MC內(nèi)核都是可應(yīng)用的。
      在讀取殘差像素數(shù)據(jù)的塊602中,如下面"內(nèi)核設(shè)計"節(jié)中所進一步解釋的,使用 封裝的數(shù)據(jù)來用于讀取,以減少存儲器訪問的次數(shù)。 在讀取參考像素數(shù)據(jù)的塊604中,如在"通過紋理獲取的圖像采樣"節(jié)中所解釋 的,紋理獲取用于對參考圖像的訪問以及采樣。如果將多個參考類型合并到一個內(nèi)核中, 使用條件性檢查來執(zhí)行針對不同參考類型的不同操作。在將參考數(shù)據(jù)與殘差數(shù)據(jù)相加的塊 606中,將參考數(shù)據(jù)與殘差數(shù)據(jù)相加。如果參考類型是零參考圖像(S卩,幀內(nèi)MB),則殘差數(shù) 據(jù)直接給出結(jié)果。在修剪塊608中,將來自塊606的相加結(jié)果修剪至適當范圍,通常該范圍 是
      。更具體地,如果值小于0,則將該值設(shè)置為0 ;如果值大于255,則將該值設(shè)置為 255 ;否則不進行改變。在將修剪的數(shù)據(jù)寫入圖像緩沖器的塊610中,如下面"MC內(nèi)核設(shè)計" 節(jié)中所解釋的,將修剪的值封裝并且寫入用于寫入的圖像緩沖器中。 MC內(nèi)核任務(wù)規(guī)范 如圖13所示,每一個MC內(nèi)核的基本操作是找到參考塊,進行數(shù)據(jù)采樣,讀取殘差 圖像數(shù)據(jù),以及執(zhí)行加法。幾個因素讓該過程靈活。對于MPEG-2逐行掃描序列來說,這些 因素是-圖像塊的分辨率對于Y分量,始終為16x16,對于U和V分量,取決于序列的色 度格式,可以為16xl6、8xl6、或者8x8。-參考塊存在四種情況,比如零參考塊、一個前向參考塊、一個后向參考塊、以及兩個參考塊(雙向)。-參考上的采樣位置也有四種情況。水平和垂直坐標都可以位于整數(shù)或者半值 (兩個相鄰整數(shù)位置的中間)位置。 在一個實施例中,如果在一個內(nèi)核中處理不同情況,則針對每一個線程執(zhí)行條件 性檢查。由于維護了并行性,所以這比不同的線程進入不同的分支而言好得多。
      在一個實施例中,將較大塊分為幾個較小塊,使得它們的大小統(tǒng)一,并且對于不同 的分辨率使用不同數(shù)目的內(nèi)核。例如,可以將16x16塊劃分為四個8x8塊并進行處理,8x16 塊可以分為兩個8x8塊并進行處理。 取決于不同的情形,可以在一個內(nèi)核中處理或者不在一個內(nèi)核中處理參考的變 化 如果圖像分辨率高以及/或者比特率高,則對于不同的參考情況使用不同的內(nèi)核
      是有利的。在一個實施例中,對于4:4:4色度格式來說,總共存在4個內(nèi)核,分別與零、 一個
      前向、 一個后向以及兩個參考相對應(yīng)。對于4:2:0和4:2:2格式來說,存在8個內(nèi)核,4個用
      于Y分量數(shù)據(jù),4個用于UV分量數(shù)據(jù)。在一些圖像中,使用的參考類型少于四個(例如,在
      幀內(nèi)編碼圖像中所有圖像塊都是零參考類型)。因此,執(zhí)行的內(nèi)核少于理論值。 如果不滿足上述條件,則將一些參考類型合并進一個內(nèi)核并且使用針對不同類型
      的分支的條件性檢查是有利的。對于參考類型來說,可以存在不同的組合風(fēng)格。 MC數(shù)據(jù)組織 運動補償所需的數(shù)據(jù)包括-待運動補償?shù)膲K的位置(如左上像素坐標,或者到該點的常數(shù)偏移量)-參考類型,其為指示零、 一個前向、 一個后向、兩個參考的標志。-前向參考塊的位置(可以由運動向量或者絕對坐標等來代表)。-后向參考塊的位置(可以由運動向量或者絕對坐標等來代表)。 如果對于不同的參考類型定義了不同的內(nèi)核,則一些數(shù)據(jù)不是必需的。例如,如果
      由專用內(nèi)核來處理每一個參考類型,則不需要參考類型和未使用參考塊位置。 當在一個內(nèi)核中處理不同參考時,將具有相同參考類型的塊的數(shù)據(jù)封裝在一起,
      這最小化了進入不同分支的線程的出現(xiàn)次數(shù)。 在運行在CPU上的可變長度解碼過程期間收集這些數(shù)據(jù)。然后通過特定CUDA API 調(diào)用,將所有數(shù)據(jù)復(fù)制到GPU上。最后,內(nèi)核在GPU上以多線程方式運行讀取這些數(shù)據(jù),執(zhí) 行MC操作,并且將補償值寫入到重建的圖像。
      MC內(nèi)核設(shè)計 對于算法效率來說,內(nèi)核設(shè)計是關(guān)鍵的。由于對每一個像素執(zhí)行相同的計算,所以 簡單的實現(xiàn)會是在分離的線程中分別處理單個像素。然而,該解決方案在性能上非常糟糕。 主要問題在于MC是存儲器密集型的,而不是計算密集型的,因此不是正好適合CUDA實施。 下面的措施提高了效率-使用一個線程來處理一個圖像塊中一行上的所有像素。在一個實施例中,使用 一個線程塊來處理固定數(shù)目(典型地是16或8,記錄為PICT_BLOCK_BASE_NUM)的圖像塊。 以及針對線程ID使用2D索引, 一個值用于垂直位置,另一個值用于不同的圖像塊。
      -使用封裝的數(shù)據(jù)來用于讀取。在一個實施例中,將線程中所需的所有殘差圖像數(shù)據(jù)封裝進一個結(jié)構(gòu),并且通過一次值分配操作來讀取這些數(shù)據(jù)。-使用封裝的數(shù)據(jù)來用于寫入。在一個實施例中,將來自 一個線程的所有經(jīng)運動補
      償?shù)南袼胤庋b進一個結(jié)構(gòu),并且通過一次值分配操作寫入存儲器中。 _使用附加存儲器來處理"偽"圖像塊。 如前所述,在一個線程塊中處理PIC乙BLOCK—BASE—NUM個圖像塊。如果圖像塊的 總數(shù)不是PICT_BLOCK_BASE_NUM的倍數(shù),則與偽圖像塊相對應(yīng)的一些線程將進行非法操 作。簡單的解決方案是引入對塊ID和線程ID的條件性檢查。然而,這是低效率的。根據(jù) 本發(fā)明的一個方面,更好的解決方案是創(chuàng)建一些"偽"圖像塊,以讓總數(shù)成為PICT_BLOCK_ BASE—NUM的倍數(shù)。在這些偽塊中,相應(yīng)線程執(zhí)行無害的操作。例如,將目的地址設(shè)置在原始 圖像范圍外部,使得不干擾相關(guān)數(shù)據(jù),并且參考位置與塊位置相同。在該例子中,可以在圖 像數(shù)據(jù)分配階段分配很少的附加存儲器,以包含這些外部像素。 注意,上述措施是彼此獨立的,即它們中的各個是可以使用或者不使用的。對于效 率而言,第一個因素(使用一個線程來處理一個圖像塊中一行上的所有像素)是最關(guān)鍵的 因素。由此極大地增強了性能。
      通討紋理獲取的MC圖像采樣 在運動補償期間,將參考像素值加到殘差圖像數(shù)據(jù)上。通過紋理獲取來實現(xiàn)該任 務(wù)。將目標位置(整像素或者半像素)設(shè)置為紋理坐標,并且可以使用texfetch(CUDA API 調(diào)用)來獲得像素值。如果紋理坐標指示半像素位置,則自動執(zhí)行采樣(插值)。代碼類似 于下述 INT—TYPE pixel—val = (6) texfetch(tex_ref_picture, x_coord, y_coord)*RANGE+ROUND 圖15示出了與圖3類似的使用基于CUDA的視頻解碼系統(tǒng)的改進的示例視頻解碼
      過程。但是,來自多個內(nèi)核的任務(wù)被封裝進一個內(nèi)核。具體地,圖15所示的實施例不具有
      殘差圖像緩沖器。取而代之地,所有GPU任務(wù)(IQ、波形變換、以及MC)是一起執(zhí)行的,從而
      有利地,中間存儲不是必要的,并且不需要殘差圖像緩沖器的全局存儲空間。 圖16示出了與圖4類似的使用基于CUDA的視頻解碼系統(tǒng)的相應(yīng)的改進的示例視
      頻解碼過程。根據(jù)圖15所示的實施例,在單個內(nèi)核314a中執(zhí)行GPU任務(wù)(逆量化IQ、波形
      變換、以及MC)。從而可以節(jié)約用于殘差圖像緩沖器的全局存儲空間。 可以使用一個或者更多CPU以及一個或者更多基于CUDA的GPU來實施本發(fā)明。但 是,還可以基于GPU本地指令和編程語言之間的應(yīng)用程序接口 (API)來操作一個或者更多、 甚至所有的圖形處理單元(GPU)。還可以在將任務(wù)分配給一個或者更多GPU和CPU的軟件 中實施本發(fā)明。通常,這種軟件是在數(shù)據(jù)載體(比如光盤)上存儲并且分發(fā)的。根據(jù)本發(fā) 明的一個方面,一種計算機可讀介質(zhì)存儲了用于引起計算機執(zhí)行如方法權(quán)利要求之一所披 露的方法的指令。根據(jù)本發(fā)明的另一個方面,制造產(chǎn)品包括提供指令的機器可讀介質(zhì),當機 器執(zhí)行該指令時,該指令引起機器執(zhí)行包括如方法權(quán)利要求之一披露的方法在內(nèi)的操作。
      此外,還可以將本發(fā)明應(yīng)用于對其它視頻標準的視頻序列的解碼上,其它視頻標 準是比如MPEG-l、MPEG-4、 H. 264等等。 可以在視頻編解碼器中使用解碼器,該視頻編解碼器在TV質(zhì)量的數(shù)字視頻/音頻 應(yīng)用(比如數(shù)字電視(有線、衛(wèi)星以及地面廣播)、視頻點播、數(shù)字通用碟(DVD)、個人計算、
      17卡付費、測試和測量、等等)中廣泛使用。 將理解,這里僅通過示例描述了本發(fā)明,可以在不背離本發(fā)明范圍的情況下進行 細節(jié)上的修改。 可以獨立地或者以任意恰當組合的形式來提供說明書和(如果適合)權(quán)利要求以 及附圖中披露的每一個特征。如果恰當,可以將特征實現(xiàn)為硬件、軟件、或者二者的組合。如 果恰當,可以將連接實施為無線連接或者有線(但不一定是直接的或者專用的)連接。權(quán) 利要求中出現(xiàn)的附圖標記僅作為說明之用,而不應(yīng)當對權(quán)利要求的范圍具有限制影響。
      權(quán)利要求
      一種用于在包括CPU和GPU的硬件架構(gòu)上對編碼視頻數(shù)據(jù)進行解碼的方法,GPU具有作為全局緩沖器的第一緩沖器以及作為紋理緩沖器的第二緩沖器,所述方法包括下列步驟-在CPU上對編碼視頻的報頭和宏塊進行解碼(304),其中獲得解碼的圖像數(shù)據(jù);-可選地對解碼的圖像數(shù)據(jù)執(zhí)行逆量化(306);-將解碼的圖像數(shù)據(jù)或者逆量化的圖像數(shù)據(jù)傳送(310)至GPU的全局緩沖器;并且,所述方法還包括在GPU上執(zhí)行的下列步驟-如果還沒有在CPU上可選地執(zhí)行所述逆量化(306),則對所傳送的數(shù)據(jù)進行逆量化(315);-對逆量化的數(shù)據(jù)進行波形變換(314);-執(zhí)行運動補償(316),其中獲得重建的圖像數(shù)據(jù),并且其中使用一個線程來處理一個圖像塊中一行的所有像素,使用一個線程塊來處理固定數(shù)量的圖像塊;-在GPU的全局緩沖器中對重建的圖像數(shù)據(jù)進行緩沖(318);-確定是否使用解碼的圖像數(shù)據(jù)作為用于對至少一個其它圖像進行解碼的參考,如果是,則將解碼的圖像數(shù)據(jù)從全局緩沖器中復(fù)制到紋理緩沖器中;以及-從全局緩沖器或者紋理緩沖器向顯示器傳送重建的圖像數(shù)據(jù)。
      2. 根據(jù)權(quán)利要求1所述的方法,其中,以線程處理在GPU上執(zhí)行的逆量化(315)、波形 變換(314)以及運動補償(316)步驟,并且線程對紋理緩沖器進行只讀訪問,以及對全局緩 沖器進行讀寫訪問。
      3. 根據(jù)權(quán)利要求1或2所述的方法,其中,在執(zhí)行運動補償(316)的步驟中,從紋理緩 沖器中讀取來自在前圖像的參考數(shù)據(jù)。
      4. 根據(jù)權(quán)利要求1至3中任一項所述的方法,其中,圖像數(shù)據(jù)包括多個顏色空間格式 (444、422、420)之一的亮度和色度分量(YUV),并且GPU對于至少兩個并行數(shù)據(jù)層進行操 作,所述方法還包括下列步驟-確定圖像數(shù)據(jù)的顏色空間格式;_根據(jù)所確定的顏色空間格式,如果確定了第一顏色空間格式(444),則在單個數(shù)據(jù)層 (803)中一并存儲和處理亮度數(shù)據(jù)(Y)和色度數(shù)據(jù)(UV),如果確定了不同的顏色空間格式 (422、420),則在兩個不同的、分離的數(shù)據(jù)層(801、802)中存儲和處理亮度數(shù)據(jù)(Y)和色度 數(shù)據(jù)(UV)。
      5. 根據(jù)權(quán)利要求4所述的方法,其中,GPU對于至少三個并行數(shù)據(jù)層進行操作,并且其 中,在三個不同的、分離的數(shù)據(jù)層(804、805、806)中存儲和處理殘差圖像的亮度和色度數(shù) 據(jù)。
      6. 根據(jù)權(quán)利要求1至5中任一項所述的方法,其中,GPU使用CUDA架構(gòu)。
      7. 根據(jù)權(quán)利要求1至5中任一項所述的方法,其中,GPU以GPU本地指令和編程語言之 間的應(yīng)用編程接口 (API)為基礎(chǔ)來操作。
      8. 根據(jù)權(quán)利要求1至7中任一項所述的方法,其中,在執(zhí)行波形變換的步驟中,僅將非 零的系數(shù)連同相應(yīng)的系數(shù)矩陣索引一起存儲。
      9. 根據(jù)權(quán)利要求1至8中任一項所述的方法,其中,在一個或者更多線程中處理波形變 換步驟,所述線程獲得包括至少地址和長度值在內(nèi)的恒定長度的數(shù)據(jù)集合,作為輸入數(shù)據(jù),所述地址指向全局緩沖器中存儲針對所述線程的實際輸入數(shù)據(jù)的存儲位置,所述長度指示 與所述線程相關(guān)的存儲的輸入數(shù)據(jù)的量。
      10. 根據(jù)權(quán)利要求l至9中任一項所述的方法,其中,在公共線程(314a)中一并處理逆 量化、波形變換和運動補償步驟。
      11. 根據(jù)權(quán)利要求1至10中任一項所述的方法,還包括初始化波形變換塊的步驟,所述 初始化包括下列步驟-分配殘差圖像緩沖器,其中在全局存儲器中分配殘差圖像數(shù)據(jù);以及 -準備用于iDCT計算的常數(shù)矩陣。
      12. 根據(jù)權(quán)利要求11所述的方法,還包括下列步驟 -確定哪個常數(shù)矩陣適合所需的波形變換;_選擇所確定的常數(shù)矩陣;以及 -切換至所選的矩陣。
      13. 根據(jù)權(quán)利要求1至12中任一項所述的方法,還包括下列步驟 -確定當前殘差圖像的數(shù)據(jù)塊的數(shù)目;以及_添加偽數(shù)據(jù)塊,直到數(shù)據(jù)塊的數(shù)目是根據(jù)所使用的視頻編碼標準的參數(shù)RESIDUAL_ BL0CK_BASE_NUM的整數(shù)倍為止。
      14. 根據(jù)權(quán)利要求1至13中任一項所述的方法,其中,在運動補償(316)步驟中,線程 中所需的所有殘差圖像數(shù)據(jù)被封裝進一個結(jié)構(gòu)并且在一次值分配操作中被讀取。
      15. —種適于執(zhí)行根據(jù)權(quán)利要求1至14中任一項所述的方法的裝置。
      16. —種計算機可讀介質(zhì),其上存儲有用于引起計算機執(zhí)行如權(quán)利要求1至14中任一 項所述的方法的指令。
      全文摘要
      一種使用基于CUDA的GPU來加速比如視頻解碼等復(fù)雜、順序任務(wù)的方法,包括在CPU上對編碼視頻的報頭和宏塊進行解碼;執(zhí)行逆量化(在CPU或者GPU上);向GPU傳送圖像數(shù)據(jù),其中圖像數(shù)據(jù)存儲在全局緩沖器中;然后在GPU上執(zhí)行逆量化的數(shù)據(jù)的逆波形變換;執(zhí)行運動補償;在GPU全局緩沖器中對重建的圖像數(shù)據(jù)進行緩沖;確定是否將解碼的圖像數(shù)據(jù)作為用于解碼其它圖像的參考來使用;如果是,則從GPU全局緩沖器中將解碼的圖像數(shù)據(jù)復(fù)制到GPU紋理緩沖器中。優(yōu)點在于,最小化CPU和GPU之間的數(shù)據(jù)通信,平衡CPU和GPU的工作負載,并且由于卸載至GPU的模塊是數(shù)據(jù)并行、計算密集型的,因此可以高效實現(xiàn)這些模塊。
      文檔編號H04N7/50GK101754013SQ200910225048
      公開日2010年6月23日 申請日期2009年11月24日 優(yōu)先權(quán)日2008年11月28日
      發(fā)明者張輝, 朱立華, 王傳銘 申請人:湯姆森許可貿(mào)易公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1