基于TMS320C62X DSP的混合編程研究
2 并行匯編代碼的編寫
C6000的匯編代碼格式如下:
標號: 并行標記 [條件寄存器]指令助記符 功能單元 操作數 ;注釋。如:
LDW .D2 *B4,B2
|| [A1]SHL .S2X A4,B4 ;用到了交叉數據通道
TMS320C62X片內有8個并行的處理單元,分為相同的兩組。其體系結構采用超長指令字(VLIW)結構,一個指令包里的8條并行指令可同時分配到8個處理單元并行運行。這種一個指令包里有8條指令并行執行也給并行匯編代碼的編寫帶來很多要考慮的問題,具體如下:
(1)TMS320C62X指令的執行可以用延遲間隙來說明。延遲間隙在數量上等于從指令的源操作數被讀取到執行的結果可以被訪問所用的指令周期。如對于乘法指令(MPY),源操作數從第i個周期被讀取,則其計算結果在第(i+2)個周期才可用。
(2)使用相同功能單元的兩條指令不能被安排為并行指令。
(3)使用同一條交叉通路的兩條指令不能被安排在同一個執行指令包中,這是因為從寄存器組A~B或者從B~A都只有一條交叉通路。
(4)將數據讀入到(或存儲自)相同寄存器組的兩條讀(寫)指令不能被安排在同一個執行包中。
(5)每一個執行包里只能允許每一寄存器組處理一個長定點類型數據。
(6)在一個指令周期內對同一寄存器讀取多于四次是不允許的,但條件寄存器不在此限制之列。在一個指令周期內,不能 同時存在兩條寫入同一寄存器的指令,只有在寫操作不是在同一個指令周期發生時,才可以將具有同一目的地址的兩條指令安排并行。
3 基于TMS320C62X的運動補償的混合編程設計實例
運動補償是MPEG-4標準中的一種重要算法。運動補償是指根據運動矢量在參考幀中找出參考塊。如果運動矢量的X分量和Y分量都是整象素長度,則直接在參考幀中找出參考塊。如果為半象素長度,則需要通過內插運算計算出參考塊,計算出的參考塊需要加上解碼得出的誤差塊才能得到當前參考塊。本文給出了運動矢量的X分量和Y分量都是整象素長度時的運動補償方法。根據運動矢量可直接在參考幀中找到參考塊(8×8)。完成此功能的C語言函數如下:
void mc_case_a2(unsigned char *pSrc, short SrcOffset, short SrcWidth, unsigned char *pDst, short RoundCtrl)
{ ……
for (i=0; i8; i++)
{
*(tmp_P_Dst+i) = *(tmp_P_Src+i);
......
}
}
參數運動矢量SrcOffset對4(4個字節為一個字,長32位)的余數可能是0、1、2、3。當余數是0的時候,編譯后執行代碼是按字讀取(LDW)的,這充分體現了TMS320C62X的優點,也使程序的運行效率比較高。而當余數不為0的時候,則可能是按字節讀取(LDB)或是按半字讀取(LDH),這使程序的運行效率較低。視頻的編碼和解碼都要用到運動補償來重構圖像,這是一個很費時的操作,而且其代碼也是圖像處理中的核心代碼,這樣就要求編寫高效的程序來完成此操作。為了使代碼的運行效率更高,且結合TMS320C62X的硬件特點,希望對于不同的運動矢量,做運動補償的時候都能采用按字讀取和存儲的方式。這需要對運動矢量參數除以4,根據余數調整指針,使指針始終指向字對齊方式(而在C程序中當前塊是char型的以字節方式存儲的,對其進行移位處理只能是一個字節一個字節地進行移位,這就使得在C程序中不能用和匯編程序同樣的方法來對程序進行優化),如運動矢量除以4以后的余數為1,為了使要取的8個象素對準字訪問方式,則要按圖1進行操作。
MVK .S2 0xFFFC,temp ;獲得地址的LSB位
ADD .L1X pSrc,offset,pSrc ;參考塊第一個元素的地址
AND .L2X pSrc,temp,tmp_pSrc ;字對準訪問的地址
AND .S1 0x0003,pSrc,rshiftA ;用兩個LSB位得
;到了需右移幾個字
SUB .L1 0x04,rshiftA,lshiftA ;需左移幾個字
MPY .M1 rshiftA,8,rshiftA ;需右移的#bit數
MPY .M1 lshiftA,8,lshiftA ;需左移的#bit數
作為一個說明C語言與匯編程序混合編程的設計例子,采用并行匯編實現了這個函數的優化。這里只給出部分匯編程序:
.text ;將該段匯編代碼安排在.text
段,當然通過在C語言中用
#program_section也可以將其安排在其它自己命名的段中。
.global mc_case_a ;函數名,用.def或.gloal對其進行
聲明,使得C代碼調用該函數
_mc_case_a: ;標號,是C調用函數和匯編
被調用函數的接口處
……
評論