H.264視頻編碼器在DSP上的實現(xiàn)與優(yōu)化
3.2 內(nèi)存分配及Cache優(yōu)化
與PC機(jī)相比,DSP的程序數(shù)據(jù)存儲空間非常有限。因此,對于視頻編碼這種需要處理大量數(shù)據(jù)的程序而言,必須合理安排數(shù)據(jù)和程序的存儲方式,實現(xiàn)對存儲器的優(yōu)化。實驗表明,合理利用兩級緩存并配合低工作頻率外部存儲器,系統(tǒng)的效率能達(dá)到全部使用高工作頻率內(nèi)部存儲器的80%~90%。
本文將占據(jù)較大空間的數(shù)據(jù)或使用頻率不高的程序放在片外存儲器中,啟用L2 Cache,調(diào)用C6000的芯片支持庫CSL中的CACHE-setL2Mode函數(shù),將L2設(shè)置為198KB的SRAM和64KB的Cache模式。并根據(jù)H.264算法本身的結(jié)構(gòu),采取以下方法對存儲器進(jìn)行優(yōu)化:利用CCS的分析工具Profile分析C代碼,將反復(fù)調(diào)用的程序段(例如DCT變換和IDCT變換)放在片內(nèi)程序存儲區(qū)中,把頻繁用到的數(shù)據(jù)段(如編碼表)放在片內(nèi)數(shù)據(jù)存儲器中,把運用次數(shù)較少的程序和數(shù)據(jù)段放在片外存儲器中,避免對程序或數(shù)據(jù)進(jìn)行不必要的反復(fù)搬移。
在H.264編碼器運行過程中,由于一幀圖象的數(shù)據(jù)量很大,因此將參考幀和當(dāng)前幀數(shù)據(jù)放到片外存儲器中,需要用到時,再將它們從外部存儲器搬到片內(nèi)存儲器中,以提高程序的運行效率。
3.3 代碼優(yōu)化
進(jìn)行代碼優(yōu)化,先要找出程序的瓶頸,即占用CPU時間較多的代碼,然后對其進(jìn)行有針對性的優(yōu)化。使用CCS提供的代碼剖析工具Profile可以統(tǒng)計顯示出程序中各個重要段和函數(shù)的運行時間,找出運算量較大的程序段,優(yōu)化這些程序段,對于提高算法的性能有巨大影響。
?、?聯(lián)合使用-pm和-03編譯選項,對代碼進(jìn)行項目級的優(yōu)化:CCS提供了強(qiáng)大功能的編譯選項,從-O0到-O3共四級優(yōu)化。-O3編譯選項使能軟件流水和其他優(yōu)化方法,-pm選項從程序代碼角度,把整個項目的所有源程序聯(lián)合起來,作為一個模塊來處理。-pm和-03兩個選項聯(lián)合使用,能進(jìn)行一系列的優(yōu)化,并且代碼尺寸變小很多。
?、?使用const、restrict 關(guān)鍵字修飾指針:const指示編譯器其修飾的指針?biāo)赶虻膬?nèi)容不能修改;restrict指示編譯器其修飾的指針與其他指針指向的內(nèi)容不會覆蓋,這些信息使兩個指針不會訪問同一存儲器地址,可以消除存儲器之間的相關(guān)性,這樣可以并行執(zhí)行多個數(shù)據(jù)的讀取和運算,使代碼運行達(dá)到昀大效率。
?、?對短字長數(shù)據(jù)使用寬長度的存儲器訪問(數(shù)據(jù)打包處理):即當(dāng)CPU執(zhí)行一連串短型數(shù)據(jù)(如16bit數(shù)據(jù))操作時,可將數(shù)據(jù)類型設(shè)置為32bit長度的int型,這樣可以一次性訪問2個短型數(shù)據(jù),然后使用C6000指令,同時進(jìn)行兩個數(shù)據(jù)的操作,減少了對內(nèi)存的訪問,這比采用16bit長度short型節(jié)約一半的時間。
?、?循環(huán)展開,把C語言中的循環(huán)打開,把多循環(huán)變?yōu)樯傺h(huán),減少循環(huán)嵌套,使得可能并行的指令增加,從而改進(jìn)軟件流水編排,改善代碼性能。
?、?減少C函數(shù)的調(diào)用,盡量使用系統(tǒng)提供的內(nèi)聯(lián)函數(shù)(intrinsics函數(shù))代替C函數(shù),C6000編譯器提供了許多intrinsics,是直接與C6000匯編指令映射的在線函數(shù),可以快速優(yōu)化C代碼,這樣減少許多不必要的操作,提高代碼運算速度。
⑹ 使用軟件流水技術(shù),軟件流水是一種對循環(huán)中的指令進(jìn)行調(diào)度優(yōu)化的技術(shù),利用軟件流水可生成非常緊湊的循環(huán)代碼。當(dāng)編譯時采用-O2或-O3級別的優(yōu)化選項時,編譯器將對程序中的循環(huán)進(jìn)行軟件流水。通過軟件流水的優(yōu)化,可以大大提高循環(huán)代碼的效率,極大地實現(xiàn)指令的并行性。
3.4 匯編程序級優(yōu)化
通過 profile clock工具找出效率很低的部分,使用線形匯編繼續(xù)優(yōu)化。線性匯編語言是 C6000系列 DSP獨有的一種編程語言,介于高級語言和低級語言之間。和標(biāo)準(zhǔn)的匯編語言不同的是,在編寫線性匯編程序時可不必考慮指令的延時、指令的并行、寄存器的使用和功能單元的分配等,匯編優(yōu)化器將根據(jù)代碼的情況自動確定這些信息。匯編程序優(yōu)化可通過對自動編譯生成的匯編文件進(jìn)行修改而進(jìn)行。匯編優(yōu)化其實就是根據(jù)以上各個方面的特點,采取針對性的方法,以獲得盡可能高的程序效率。常用的匯編偽指令如下:
?、?定義一個可被匯編優(yōu)化器優(yōu)化且可被 C/C++當(dāng)做函數(shù)調(diào)用的線性匯編代碼段的偽指令:
label .cproc [ var1,[var2,…] ]
.endproc
評論