基于TMS320DM642 的X264 視頻編碼器的優化
示例中, 除了數據搬移中必需的數據存放源地址和目的地址之外,還定義了變量Ping_Pong 和DAT_ID。其中Ping_Pong 是一個標志變量,用來表示當前存放搬移數據的目的存儲區是Ping 存儲區還是Pong 存儲區,DAT_ID 是正在進行的EDMA 搬移的句柄變量。在進入正式的編碼循環體以前,EDMA 會事先把一個要編碼的宏塊像素值搬移到Ping 存儲區(假設Ping_Pong=0 表示Ping存儲區)。進入循環體以后,首先進行目標存儲區的交替(Ping_Pong=1-Ping_Pong,此時Ping_Pong=1,表示 Pong 存儲區),接著等待前一次搬移是否完成(DAT_wait(DAT_ID)),如果前一次搬移完成,就可以立即開始下一次搬移,同時CPU 立即進行對本次搬移數據的處理。以后的操作類似,直至所有的宏塊都完成編碼,結束循環體。
3.3 循環體的優化
在X264 視頻編碼器中,循環體出現的頻率比較高,而且往往循環體是在整個編碼器中比較占用時間的部分。尤其是當出現循環體嵌套,或者循環體內部存在邏輯判斷語句或者函數調用時,編譯器一般不會對該循環進行優化。針對這些問題, 比較常用的方法有嵌套循環體內部循環展開,用條件操作符代替邏輯判斷語句,使用內聯函數,使用MUST_ITERATE 偽指令操作符[11-12],將大循環體拆成幾個小循環體。筆者使用的循環體優化的例子代碼為:本文引用地址:http://www.104case.com/article/166324.htm
在上面示例中,偽指令MUST_ITERATE 主要是告訴編碼器,本次循環總共要執行396 次,這樣編譯器就可以進行軟件流水來優化這個循環。
3.4 編譯器優化選項
在完成上述的手工優化后,接下來通過設置編譯器選項來使用編譯器優化,本文采用的編譯器優化選項有:-pm(在程序級別進行優化),-o3(對文件級別進行最強的優化),-op3(速度最重要),-ml3(缺省情況下將全部數據和函數作為far 型)。
3.5 DSP 匯編優化
假如使用上述優化策略對編碼工程進行優化后,編碼器的速度還不能達到應用要求,就需要編寫手工匯編程序。編寫手工匯編程序之前, 首先要用CCS 的profile工具對編碼工程進行剖析, 找出比較耗時或頻繁調用的函數部分,把這些部分改寫成匯編函數。
DSP 采用的是哈佛體系結構, 將數據和程序分開存放。大體上來說,編寫匯編語言函數主要步驟為:把操作數從內存中取出來放到CPU 的寄存器中, 然后在CPU內部用不同的運算單元對寄存器里的操作數進行運算,最后把運算的結果存到內存中。其中,函數參數傳遞、函數返回值寄存器、條件寄存器、棧指針寄存器的保存都必須按照規定使用相應的寄存器,否則會出現錯誤。
在編寫匯編語言的過程中要考慮下方面:1) 充分理解待編寫的函數的邏輯功能。只有真正理解了函數實現的功能和具體的數據流程圖, 才能使匯編語言的構架比較高效;2) 數據結構的選擇和安排。由于DM642 允許數據打包處理,即一條指令可以同時對幾個字節進行操作,這對于圖像和視頻處理非常有益, 所以能夠打包處理的就盡可能打包處理;3) 寄存器的分配和指令的先后順序。DM642 的CPU 有2 套完全對稱的運算單元和寄存器。只要把操作數分別存、取到隸屬于不同套的寄存器里面,采用不同的運算單元,合理安排指令的先后順序,保證在資源不沖突的條件下盡量在一個周期內安排更多的指令,實現指令運行的高效性、并行性。
評論