TMS320C6000系列DSP維特比譯碼程序優(yōu)化設(shè)計方案
3 VA在DSP上的優(yōu)化實(shí)現(xiàn)
ACS操作是整個VA算法中運(yùn)算量最大的部分。在通常的程序設(shè)計中,使用一種對稱的蝶形運(yùn)算實(shí)現(xiàn)ACS操作,每次可以完成兩個ACS操作。因此優(yōu)化的核心任務(wù)就是減少每個蝶形運(yùn)算所消耗的運(yùn)算周期數(shù)。
蝶形運(yùn)算的原理請參見圖3。對前一級的兩個相鄰狀態(tài)2i和2i+1,一共有四條支路。計算出四條支路與接收信號的歐氏距離,與兩個前一級狀態(tài)2i和2i+1中存儲的以前路徑的度量值相加得到四條路徑A1、A2、B1、B2的度量值。然后在對應(yīng)的兩個當(dāng)前狀態(tài)i和i+32下兩兩比較,每個當(dāng)前狀態(tài)都留下度量值較小的一條路徑(幸存路徑),同時將當(dāng)前狀態(tài)的度量值以及與幸存路徑對應(yīng)的輸入比特存人相應(yīng)的位置,準(zhǔn)備下一級計算。
每個蝶形運(yùn)算包括:三次加載數(shù)據(jù)操作(load),因?yàn)榭梢宰C明一個蝶形中的四條支路的度量具有相同的絕對值,所以每次只需要加載一個由BMU預(yù)先計算的結(jié)果;四次加法操作;兩次比較操作;比較之后的四次存儲操作。其中,四次加法操作可以在一個周期內(nèi)同時完成;狀態(tài)i和i+32的幸存路徑則是獨(dú)立計算和存儲的。
針對前面提到的提高并行處理程度的幾個障礙,可以用以下的方法分別加以解決:
(1)解決功能模塊的限制 可以用不同的命令相互替代。例如賦值操作MV只能用.L、.S和.D功能模塊完成,如果這些模塊都被其它的并行指令占用,可以用乘1的方法實(shí)現(xiàn)賦值,而乘法指令MPY是用.M單元實(shí)現(xiàn)的。類似地,也可以用加零或減零的指令代替MV指令。
(2)解決交叉路徑的限制 需要依靠寄存器的分配和倒換,讓同一指令涉及到的寄存器盡量處在同一個寄存器組中,減少需要用到交叉路徑的機(jī)會。
(3)解決多周期指令的限制 加載數(shù)據(jù)的結(jié)果需要在4個周期以后才能得到。為了有效地利用等待的這段時間,在程序設(shè)計中把加載數(shù)據(jù)的指令放在前面的蝶形運(yùn)算中執(zhí)行,當(dāng)進(jìn)入本次蝶形運(yùn)算時,就能立即使用加載的新數(shù)據(jù)。同樣,本次蝶形運(yùn)算也要執(zhí)行為下一個蝶形運(yùn)算加載數(shù)據(jù)的指令。B指令(跳轉(zhuǎn)指令)的問題可以用類似的方法來處理。
(4)解決對長數(shù)據(jù)操作的限制 在(2,1,7)卷積碼的VA譯碼器中,幸存路徑存儲在PM里。每一個輸入幀對應(yīng)64個可能的狀態(tài),會產(chǎn)生64比特的幸存路徑比較結(jié)果。但TMS320C6701不能直接對64比特長的數(shù)據(jù)進(jìn)行讀寫操作,所以把PM分成兩個相同的32位數(shù)組PMO和PMl。前者用來存儲狀態(tài)0-31對應(yīng)的幸存路徑;后者存儲狀態(tài)32-64對應(yīng)的幸存路徑。PM0[i ]和PM1[i ]合在一起表示第i級網(wǎng)格的所有64條幸存路徑。當(dāng)編碼約束長度更大時,也可以用同樣的辦法來分開存儲。例如(2,1,9)卷.積碼的PM就可以分成8個32位的數(shù)組來存儲256個狀態(tài)的信息?;厮莶僮鞯臅r候,先確定路徑經(jīng)過哪一個狀態(tài),就可以從相應(yīng)的某一個數(shù)組中讀出路徑值,只需要一次LD(加載)操作。
圖4給出了優(yōu)化后的蝶形運(yùn)算流程圖。每次循環(huán)需要4個時鐘周期,分別為圖中的E0-E3,對應(yīng)著一次蝶形運(yùn)算。除了一些關(guān)鍵的加比選運(yùn)算之外,還需要一些輔助運(yùn)算來實(shí)現(xiàn)循環(huán)以及寄存器的相互拷貝,平均下來每個時鐘周期可并行執(zhí)行6條指令。
4優(yōu)化的效果和推廣
譯碼器輸出一幀所需要的時鐘周期數(shù)為
TBMC+n·TButter+Ttb
其中,TBMC、TButter和Ttb分別表示支路度量計算、蝶形運(yùn)算以及回溯操作所需要的周期數(shù),n表示每一輸出幀對應(yīng)的蝶形運(yùn)算的次數(shù)。
對于(2,1,7)卷積碼譯碼器,輸出一個幀需要32次蝶形運(yùn)算,因此n=32。在回溯幸存路徑的時候,有兩種方案輸出譯碼結(jié)果:一種是輸入一幀碼序列,就輸出一幀譯碼結(jié)果;另一種是輸入N幀碼序列,然后輸出N幀譯碼結(jié)果。后一種方法輸出每一幀所需要的周期數(shù)可以減小為Ttb/N,但同時延時也增大為(N-1) TButter/TCPS,其中TCPS是DSP每秒運(yùn)行的時鐘周期數(shù),等于DSP的工作頻率。
如果使用TI公司定義的線性匯編語言用圖1所示的結(jié)構(gòu)來實(shí)現(xiàn)(2,1,7)譯碼,經(jīng)過CCS2軟件編譯并自動進(jìn)行-o1級優(yōu)化以后,每譯出一個比特,大約需要1000個時鐘周期(TButter =22,n=32),時鐘為167MHz時譯碼速度不超過160kbps。
在經(jīng)過本文所述方法優(yōu)化以后的程序中,仍然是(2,1,7)卷積碼,TBMC =20,TButter =4,n=32;Ttb=700,選擇N=16,因此譯出一個比特的平均時間是128+20+(700/16)=192個時鐘周期。以TMS320C6701為例,它工作在167MHz,該程序的譯碼速率能達(dá)到大約870kbps,而延時僅為18μS。顯然,本文中的優(yōu)化程序性能遠(yuǎn)遠(yuǎn)高于自動優(yōu)化的效果。
對于不同編碼約束長度的卷積碼,例如WCDMA中用到的(2,1,9)碼,蝶形運(yùn)算單元的流程與(2,1,7)碼是完全相同的。不同的地方在于每一級的狀態(tài)數(shù)增加到了256個。因此只需要對程序中的存儲和回溯路徑的指令做一些改動就可以使用。
對于不同的DSP系統(tǒng),因?yàn)樵谥噶罴⒖偩€、寄存器等諸多方面存在差異,針對C6000系列的優(yōu)化的匯編程序不能直接應(yīng)用。但譯碼程序優(yōu)化中遇到的問題也是大致相同的,優(yōu)化的重點(diǎn)任務(wù)都是設(shè)法減少ACS的運(yùn)算量,因此本文提出的程序流程的基本思想以及一些解決問題的技巧都可以繼續(xù)加以運(yùn)用。
評論