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