基于DSP的視頻算法系統的優化策略
近年來,對數字視頻產品的需求增長迅速。數字視頻產品的主流應用包括視頻通信、視頻監控與工業自動化,最熱門的則為娛樂應用,如 DVD、HDTV、衛星電視、標清(SD)或高清(HD)機頂盒、數碼相機與HD攝像機、高端顯示器(LCD、等離子顯示器、DLP)以及個人攝像機等。這些應用對高質量的視頻編解碼算法及其標準提出更高要求。目前的主流壓縮標準主要有MPEG2、MPEG4和H.264/AVC,而針對這些編解碼標準有各種各樣的實現方案。本文主要討論基于TI公司C64系列DSP的視頻解碼算法在系統優化過程中需要考慮的若干因素。
TI的C64系列DSP以其強大的處理能力被廣泛用于視頻處理領域,但由于使用者對C64系列DSP的結構、指令的理解程度不一樣,造成算法的實現效果有許多差異。具體體現在實現算法時所占用的CPU資源上,例如實現H.264 MP@D1解碼時所占用CPU的資源將有所差異;或者體現在所包含的算法工具子集上,例如實現H.264 MP@D1解碼時使用CAVLC而不是CABAC。
造成這些差異的主要原因有:算法關鍵模塊的優化;算法系統集成時內存的管理;算法系統集成時EDMA的資源分配管理。本文將從這三方面探討算法優化集成過程中需要考慮的因素。
算法關鍵模塊的優化
一般而言,針對目前主流視頻解壓縮標準都有非常消耗DSP CPU資源的模塊,如H.264/AVC、MPEG4、AVS等編碼中的運動矢量搜索就非常占用資源,而且這些模塊在整個系統實現過程中還被頻繁調用,因此我們應首先找出這些模塊。TI的CCS提供了工程剖析工具(Profile),可以很快找到整個工程中占用DSP CPU資源最多的模塊,然后對這些模塊進行優化。
對這些關鍵算法模塊的優化可以分三步進行。如圖1所示,先認真分析這部分代碼,并進行相應的調整,例如盡量減少有判斷跳轉的代碼,特別是在for循環中,因為判斷跳轉會打斷軟件流水。可以用查表或者用_cmpgtu4、_cmpeq4等Intrinsics來代替比較判斷指令,從而巧妙地替代判斷跳轉語句。同時還可以采用TI的CCS中所提供的#pragma,為編譯器提供盡量多的信息。這些信息包括for循環的次數信息、數據對齊信息等。如果經過這部分優化后還無法滿足系統要求,則對這部分模塊使用線性匯編來實現。
線性匯編是介于C和匯編之間的一種語言實現形式,可以控制指令的使用,而不必特別關心寄存器和功能單元(S、D、M、L)的分配和使用。使用線性匯編一般會比使用C語言具有更高的執行效率。如果線性匯編無法滿足要求,則使用匯編實現。為編寫高并行、深軟件流水的匯編,需要經過創建相關圖、時序表(Scheduling table)等步驟,由于篇幅所限,這里就不再討論。
當運動搜索中需要計算1616宏塊的SAD值時,在不同方式下消耗的DSP CPU的周期數:使用C+Intrinsics需要83個周期,使用線性匯編需要74個周期,而使用匯編只需要57個周期。由此可見,匯編實現所消耗的CPU周期數最少,但前提是要充分了解DSP CPU的結構、指令以及算法模塊的結構,以編寫出高并行、深軟件流水的匯編,否則所寫出的匯編有可能還沒有線性匯編或者C的效率高。一個行之有效的方法是,充分利用TI所提供的算法庫中的函數,因為算法庫中的函數都是已經充分優化過的算法模塊,而且大都提供對應的C、線性匯編和匯編源代碼,并有文檔進行API介紹。
![]() |
圖1:基于TI DSP的視頻算法關鍵模塊的優化步驟(左);圖2:基于TI DSP的視頻算法的優化集成過程(右)。 |
算法系統集成時內存的管理
由于在基于DSP的嵌入式系統開發中,存儲資源特別是片內高速存儲資源有限。在算法系統集成時內存的管理對于整個系統的優化非常重要,它一方面將影響數據的讀取、搬移速度;另一方面還將影響緩存的命中率。下面從程序和數據兩方面進行分析。
程序區:最大原則是將經常調度使用的算法模塊放片內。為達到這一目標,TI的CCS中提供了#pragma CODE_SECTION,可以把需要單獨控制存放的函數段從.text段中獨立出來,從而在.cmd文件中對這些函數段進行單獨物理地址映射。還可以使用動態控制的方式,將需要運行的代碼段先調度到片內內存中。例如,H.264/AVC中CAVLC和CABAC兩個算法模塊具有互斥性,可以將這兩個算法模塊放在片外,且對應于片內同一塊運行區,在運行其中某一個算法模塊之前,先將其調入片內,從而充分利用片內有限的高速存儲區。
對于程序區的管理,考慮到一級程序緩存(L1 P)的命中率,最好將具有先后執行順序的函數按地址先后順序配置在程序空間中,同時將代碼量比較大的處理函數拆分成小函數。
數據區:在視頻標準編解碼中,由于數據塊都很大,比如一幀D1 4:2:0的圖像有622KB,而且在編解碼中都需要3~5幀甚至更多的緩沖幀,所以數據基本上無法在片內存放。因此,在系統的內存優化管理中,需要用到C64系列DSP的二級緩存(對TMS320DM642來說,用于視頻編解碼的二級緩存采用64KB的情況比較多)。此外,最好將放在片外、被緩存所映射的視頻緩沖區的數據以128字節對齊,這是因為C64系列DSP的二級緩存的每行大小為128字節,以128字節對齊有利于緩存的刷新和一致性維護。
系統使用EDMA的情況以及需占用EDMA物理總線的時間。 |
算法系統集成時EDMA的資源分配管理
由于在視頻處理中,經常有塊數據的搬移,而且C64系列DSP提供了EDMA,邏輯上有64個通道,因此對EDMA的配置使用對優化系統是非常重要的。可以使用下述步驟充分配置系統的EDMA資源。
1. 統計系統中需要使用EDMA的各種情況及其需要占用EDMA物理總線的大概時間,如表所示。該表給出的數據適合以下條件:視頻通過視頻端口(720480,4:2:0,30幀/秒),音頻通過McBSP(采樣率為44k)進入DSP,壓縮后的數據數率在2Mbps左右,數據通過PCI每488us輸出一個128字節的包(PCI口工作頻率為33MHz),外置SDRAM的時鐘頻率為133MHz。
2. 統計好這些信息后,需要根據系統對各種碼流實時性及其傳輸數據塊大小,對各個被使用的EDMA通道進行優先級分配。一般而言,音頻流傳輸塊小,占用EDMA總線的時間短,而視頻傳輸塊比較大,在占用EDMA總線的時間較長,因此將輸入音頻所對應的EDMA通道的優先級設定為Q0(緊急),視頻所對應的優先級設定為Q2(中等),輸出碼流所對應的優先級設定為Q1(高),音視頻算法處理中所調度的QDMA的優先級設定為Q3(低)。當然,在真正的系統應用中,可能還需要調節這些設置。
實際上,基于TI DSP的視頻算法的優化集成過程,將根據圖2所示的步驟進行。首先初步配置內存,并選擇相應編譯優化選項,如果編譯的結果已經可以達到實時性要求就結束后面的優化,否則開始優化內存和EDMA的配置,從而提高對緩存和內部總線的利用率。如果還無法達到要求,則通過剖析整個工程確定消耗CPU資源最高的代碼段或者函數,對這些關鍵模塊進行優化,并采用線性匯編、甚至匯編直到整個系統滿足要求為止。
評論