超執行緒技術以及H.264編碼器中的並行運算分析

來源:互聯網
上載者:User
超執行緒技術以及H.264編碼器中的並行運算分析
 
[作者:同濟大學 王晗 林濤]
 
H.264是ITU-T和ISO共同制定的新一代視頻壓縮標準。同以往的標準相比,在計算精度和一些具體的演算法上都有很大的改進。這些改進使得H.264能夠提供更高的壓縮比和更低的位元速率。但是我們應該看到,效能的提升是以更大量的計算作為代價的。儘管我們可以使用MMX、SSE、SSE2等對PC上啟動並執行軟體編碼器進行最佳化,使效能提高2-3倍,但面對即時的視頻處理或其他一些情況時,編碼器還需要更快。隨著電腦硬體和軟體的不斷髮展,我們可以利用多處理器或Pentium 4類型的CPU中的超執行緒技術進行線程級的平行處理從而進一步提高編碼器的速度。

要發揮超執行緒處理器的優勢,我們還需要應用程式的支援。而OpenMP應用編程介面等技術實現的多任務、多線程和群集,正好為我們編寫多線程程式提供了便利。

一 超執行緒技術(Hyper-Threading Technology)

通常提高處理器效能的方法是提高主頻,加大緩衝容量。但是這兩個方法因為受工藝的影響在一定的時期有一定的限制。於是處理器廠商希望通過其他方法來提升效能,比如設計良好的擴充指令集、流水線操作、更精確的分支預測演算法等。

超執行緒技術也是一種提高處理器工作效率的方法。簡單的說,超執行緒功能把一顆處理器由內部分成了兩個"虛擬"的處理器,而且作業系統認為自己運行在多處理器狀態下。這是一種類似於多處理器並行工作的技術,但它只是在一個處理器裡面多加了一個架構指揮中心(AS),其實AS就是一些通用寄存器和指標等。兩個AS共用一套執行單元,緩衝等其他結構,使得在只增加大約5%左右的核心大小的情況下,通過兩個AS並行工作提高效率。

圖1更清晰地說明了具有超執行緒技術的單一處理器系統(a)和雙處理器系統(b)的區別。

可以看到,圖1(b)中的雙處理器各自獨享自己的寄存器,緩衝,算數邏輯單位等資源。而圖1(a)中超執行緒的做法是複製一顆處理器的架構指揮中心(Architectural State)變成兩個,使得作業系統認為是在與兩顆處理器溝通,但這兩個架構指揮中心共用該處理器的執行資源(Execution Resources),如運算邏輯單元等。架構指揮中心追蹤每個程式或線程的執行狀況。如此一來,作業系統把背景工作執行緒安排好以後,就指派給這兩個邏輯上的處理器執行,而這顆CPU的每個執行單元等於在同樣的時間內要服務兩個“指令處理中心”,從而減少空閑時間,提高了效率。

在圖1(a)使用HTT的處理器中,一個物理處理器被看成兩個邏輯處理器。這兩個邏輯處理器對作業系統來說和圖1(b)中的兩個處理器沒什麼不同。超執行緒技術讓單個CPU可以如同兩個CPU那樣平行處理資料指令。據Intel方面解釋,超執行緒技術能夠提高30%以上的效能。

二 OpenMP

要充分發揮超執行緒技術的優勢,我們還要有支援多線程的程式。

OpenMP是一個便攜的可擴充的標準,為程式員提供了一個簡單和靈活的介面,可以方便地為共用記憶體的多處理器平台增加並行機制。電腦硬體、軟體和工具製造商,例如Intel,DEC,Silicon Graphics,Kuch & Associates和IBM早在15年前就聯合定義了OpenMP標準。OpenMP在所有的架構上都支援使用C/C++和FORTRAN進行共用記憶體並行編程,包括基於Microsoft WindowsNT 和UNIX 作業系統的構架。OpenMP還使用編譯器指令和庫函數,協助並行應用程式員使用C/C++和FORTRAN建立多線程應用。

OpenMP是一組編譯指導語句,庫函數和環境變數的集合,它能明確的指示編譯器在程式的某個地方如何插入線程。

用OpenMP編寫的程式在運行時採用fork-join並存執行模式。程式開始是以一個單進程運行,稱為執行的主線程。主線程順序運行到第一個並行塊結構時就產生一個線程隊,原來的主線程成為線程隊的主線程。程式中被並行塊包圍起來的所有語句(包括塊內被調用的子程式)線上程隊中並存執行,一直到並行塊執行完後,線程隊中的線程中止,而主線程繼續執行。一個程式中可以定義任意數目的並行塊,因此,在一個程式的執行中可以分叉、合并若干次。

1. 指令格式

OpenMP指令是用一個特殊的標識符來標識的c/c++注釋。支援OpenMP C/C++的編譯器通過命令列參數啟用和編譯所有的OpenMP編譯指令。

#pragma omp directive-name [clause[ [,] clause]......] new-line

在C/C++中指令都要以‘#pragma omp’開始。

2. parallel for 結構

當OpenMP遇到parallel for ,就會產生一個線程組,再把for迴圈線上程組中分配後來並行的執行。OpenMP會來決定需要產生多少個線程,以及這些線程如何同步,何時終止。我們只需告訴OpenMP哪個迴圈需要多線程化。

下面一個簡單的例子:

#pragma omp parallel for

for (i=0; i < numPixels; i++)

{

pGrayScaleBitmap[i] = (unsigned BYTE)

(pRGBBitmap[i].red * 0.299 +

pRGBBitmap[i].green * 0.587 +pRGBBitmap[i].blue * 0.114);

}

3. parallel sections 結構

sections是一個跟迴圈無關的指示,負責任務分配。在sections內,包括若干個section.各個section內所包圍的程式片段,可由不同的線程並存執行。

#pragma omp parallel sections

{

#pragma omp section

{

TaskA();

}

#pragma omp section

{

TaskB();

}

#pragma omp section

{

TaskC();

}

}

上面例子中,所有的section線上程組中進行分配,一個section只被線程組中的一個線程執行一次,但和其他section是同步執行的。

4. 運行庫函數

這些庫函數可以用來控制或者查詢並存執行的環境。下面列出幾個較常用的與執行環境有關的運行庫函數。

OMP_SET_NUM_THREADS (整型變數)設定該程式所使用的線程總數

OMP_GET_NUM_THREADS取得該程式所使用的線程總數

OMP_GET_THREAD_NUM 取得當前線程的線程號

OMP_GET_NUM_PROCS 取得系統擁有的可用的處理器數

OMP_SET_NESTED (標量邏輯運算式) 如果該標量邏輯運算式為真,則允許嵌套迴圈的多級並行方式

5. 環境變數

最重要的環境變數是設定該OpenMP執行時所需的線程總數,即OMP_NUM_THREADS。

可以這樣設定該環境變數:set OMP_NUM_THREADS =4。但庫函數omp_set_num_threads()的調用會設定一個新的線程數覆蓋掉原來的環境變數值。

三 H.264中的並行運算分析

同以往的編碼方法類似,H.264仍然是基於運動補償加變換編碼的混合編碼方式,繼續沿用了以前的優秀技術,但H.264又引入了許多先進、實用的視頻編碼技術,集中到幾個方面:多模式的運動估計,幀內預測,多幀預測,統一VLC,4×4二維整數變換,高達1/8像素精度的運動估計,多幀參考等技術。H.264效能的改進是以增加複雜性為代價而獲得的。而單一處理器的計算能力還不能滿足視頻編碼的各種不同需求,這使得採用並行方式編碼H.264視頻成為一個趨勢。

2所示,在H.264中一個視頻序列是由許多的圖片組(GOP)組成的,每個GOP又包含很多幀,每幀又可分成幾個相互獨立的slice,slice又能進一步分解成許多作為運動估計和熵編碼基本單元的宏塊,宏塊又可以再被分成更小的塊。所有這些都有可能進行不同層級的並行運算。

1. Frame-Level並行

幀之間進行並行運算需要平行處理的幀之間是相互獨立的。在H.264中的幀分為三種類型:I、P、B。一般情況下,I幀不需要參考幀,P幀以他前面的P做參考幀,B幀以它前後的P做參考幀。

通常我們編一個幀序列使用的GOP的結構是:IBBPBBPBBPBBP......P幀做B和後面的P的參考,B不作參考幀。3,編碼器首先編完第0幀I幀,編第3(P)幀,編完第3幀P幀,它前面的第1、2兩個B幀和後面的第6幀P就可以同時進行編碼了。可見P幀成了重要點,加快P幀的編碼速度就可以為後面更多的幀做好準備,從而減少線程空閑。

2. Slice-Level並行

在H.264編碼時,編碼器會把一幅映像劃分為有限數目的slice,各個slice在標準中具有相對獨立的文法結構,同一幅映像的不同slice之間不存在參考關係。可見slice也可作為並行編碼的基本調度單位在多線程中並行運算。但是不同的slice的劃分對位元速率會有明顯的影響。

圖4給出了一幅映像被劃分為不同數目的slice時位元速率和信噪比的關係。由圖可以看出,要達到相同的編碼品質,位元速率會隨著劃分的slice數目的增加而大幅上升。這是因為slice的劃分會打斷幀中宏塊的相關性,當宏塊不能利用和另一個slice中的宏塊間的相關性來壓縮時,壓縮的效率就會降低。

劃分的slice的數目太少會降低平行處理的效率,但數目太多又會降低壓縮的效率,這就需要在應用時根據不同的情況採取不同的折中的辦法。

3. Macroblock-Level並行

H.264中,一個宏塊編碼時要用到與之相鄰的左、左上、上、右上位置的宏塊,5。

* 幀內預測:當前塊內的象素的預測值要通過左、左上、上、右上方向的宏塊計算得到。

* 運動向量預測:和上面一樣,當前塊的運動向量也是通過與之相鄰的左、左上、上、右上方向的塊的運動向量得到。

* 環路濾波:為了使當前塊的邊緣減小失真,要用與之相鄰的左邊塊和上面塊來濾波。

因為各宏塊間的這種依靠關係,必須等待相鄰的塊已經編碼完成後才能對當前塊進行編碼,這裡就受到處理順序的約束。左上的宏塊要先處理,其他的塊才能編碼。但是從圖6我們也能看到宏塊1和2處理完後,塊2右邊的塊和左下方的塊都可以進行處理了。

我們假設在一幀中水平和垂直方向上宏塊的個數分別是w和h,MB(i)表示一幀中以光柵掃描順序的第i個宏塊。考慮幀內各塊間的從屬性,我們可以看到MB(i)和MB(i+w-2)能夠同時處理。

有了MB(1)、MB(2)、MB(3)和MB(w+1),MB(w+2)就能進行處理,同時MB(4)也能很好的處理。總的來說,宏塊處理的時序安排中數字所示:{MB(1)},{MB(2)}, {MB(3),MB(w+1)},{MB(4), MB(w+2)},{MB(5), MB(w+3), MB (2w+1)},……,{MB((h-1)*w), MB(h*w-2)},{MB(h*w-1)}, 和 {MB(h*w)}。

四 小結

利用目前被廣泛使用的具有超執行緒技術的Intel P4 2.4GHz處理器進行實驗,很容易看到一段程式在使用OpenMP做並行化處理後和處理前相比,運行時CPU利用率大大提高,由50%提高到95%左右,已耗用時間大大縮短。H.264作為一個新的視頻壓縮標準,效能提高的同時帶來了計算量的大幅增加。但由上面的分析我們可以看到,整個處理過程中有相當多的地方能夠進行並行運算。利用OpenMP對H.264編碼器進行平行處理最佳化,再加上具有超執行緒技術的處理器的支援,必將會大大提高編碼器的效能。

摘自《現代電視技術》

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.