基于DM642的X.264編碼器優化
(3)對全像素塊運動預測搜索的方式,X.264默認為HEX(正六邊形搜索半徑為2),在對比測試了DIA(菱形搜索,半徑為1)和UMH(可變半徑六邊形搜索)后,對比了速率和峰值信噪比后,發現在峰值信噪比相差很小的情況下DIA搜索速率最快,本文選擇DIA作為運動預測搜索方式。表4給出3種方式的對比結果:本文引用地址:http://www.104case.com/article/150348.htm
2.2 X.264代碼優化
X.264編碼器需要有效的利用DM642的特性,如軟件流水,芯片特性和指令集等,才能有效的提高X.264編碼器在DM642平臺的編碼效率。為了X.264能夠充分的利用起DM642的特性,需要結合DM642本身的特點對移植過后的X.264代碼進行優化,才能夠提高X.264在DM642上執行的效率。
TI公司的DSP開發軟件CCS提供了功能非常強大的編譯器,編譯工具可以對代碼進行各種優化,以提高代碼的執行速度,減小代碼尺寸。這些優化包括了簡化循環、軟件流水、語句和表達式的順序重排和分配變量到寄存器。利用CCS編譯器進行優化后,仍然不能滿足視頻壓縮的需求,需要繼續對DM642上的X.264編碼器進行優化。
(1)內聯函數。內聯函數是指用函數本身來代替函數調用這一過程。當調用內聯函數時,C/C++源代碼把此函數插入到調用點,而不采用傳統的跳轉。將函數設定為內聯函數后,可以去掉復雜的函數調用過程來提高函數的執行效率,而付出的代價是增加了代碼所占用的空間。使用關鍵字inline定義內聯函數,在X.264編碼器中的預測部分對其中一個頻繁調用的函數設置為內聯。代碼如下:
static inline inI clip_uint8(int a)
(2)restrict關鍵字。為了幫助編譯器確定存儲器相關性,可以使用關鍵字restrict來限定指針、引用或數組。使用restrict關鍵字是為了確保其限定的指針在聲明的范圍內,是指向特定對象的惟一指針。編譯器在讀取函數的指針,數據時,采取保守的辦法,認為它們是相關的。這時編譯出的代碼必須執行完前次寫操作,才能開始下次讀取操作。加入restrict關鍵字后,編譯器將認為指針和數組沒有相關性,能夠并行提取數據。
(3)軟件流水。軟件流水式編排循環指令是能夠使循環的多次迭代并行執行的技術。編譯器總是力爭使用軟件流水技術。軟件流水是DSP的關鍵技術,它利用的是算法中存在的指令并行性的特點,使一個循環的多次迭代同時進行。總地來說,當使用編譯器優化的情況下,代碼尺寸小,程序性能更優。x.264代碼含有很多循環操作,故提高循環體指令的并行度使循環能夠軟件流水是提高編碼效率的有效途徑之一。
(4)函數合并。函數調用的過程中,要執行一些額外的寄存器。在編碼過程中DCT、量化、zigzag、IDCT和反量化函數調用都非常頻繁,但代碼段都很短,部分代碼只包含一個循環操作或者賦值操作。反復的調用會花費大量運行周期在函數調用上。為減少不必要的操作,提高速度,將DCT變換、量化、反量化和反DCT變化的整個過程進行優化,將幾個函數合并到一個函數中。圖1所示為合并結構。
2.3 DM642的優化
(1)CACHE優化。DM642采用了兩級CACHE的存儲器結構,兩級CACHE主要用于對程序和數據的緩存。CPU直接和一級CACHE連接,一級CACHE包括L1P(程序)和L1D(數據),大小分別為16 KB,分別占用獨立的存儲;一級CACHE的存儲速度與CPU處理速度相同。一級CACHE與二級CACHE相連,稱為L2,大小為256 kB,可以對程序和數據進行統一存取,L2 CACHE作為L1CACHE和片外存儲器之間的一個橋梁,可以由設計人員自行配置大小,分為SRAM和CACHE。L2CACHE的速度為CPU的一半。經過試驗對比,將L2分為128 kBCACHE和128 kB SRAM。將部分調用比較頻繁的函數和數據常量放在L2SRAM中,以提高讀寫速度。
評論