劉 浪 陳伯孝 任臘梅
(西安電子科技大學(xué) 西安 710071)
在工程實踐中為了使復(fù)雜的算法能夠滿足實時性的要求,需要充分發(fā)揮DSP的高速處理能力,提高軟件的執(zhí)行效率,使處理器能夠以較高的性能實現(xiàn)設(shè)計的要求。一般的程序優(yōu)化的方法主要有[1]:在處理器允許的情況下盡量采用并行指令來實現(xiàn)相應(yīng)的運算功能;將算法中的循環(huán)部分展開,充分利用軟件流水線的操作以獲得最大的并行性能,盡量避免流水線延時;對算法的數(shù)學(xué)表達(dá)式進行重建,使得重建后的工程實現(xiàn)算法更適合處理器的架構(gòu)。本文根據(jù)TS201S系列DSP內(nèi)部的結(jié)構(gòu)特點和指令的控制方式,以TS201S為例分別從DSP兩組寄存器組的同時使用、IF-DO-ELSE指令的靈活運用、系數(shù)存儲單元的合理分配、指令間延時的減少、雙整型邏輯運算單元的綜合運用等方面介紹DSP程序的優(yōu)化設(shè)計方法。
ADSP TS201S DSP內(nèi)部結(jié)構(gòu)如圖1所示[1]。主要特點有:兩個獨立的雙運算模塊(X-ALU和YALU),使TS201S DSP具有雙核處理能力;兩組獨立的整型邏輯單元可以同時對核內(nèi)存儲器、外部存儲器、其它處理器的共享存儲單元尋址;4組相互獨立的128位寬度的內(nèi)部數(shù)據(jù)總線,借助于交叉連接器與每個內(nèi)部存儲塊相連,提供4字長的數(shù)據(jù)、指令及I/O的訪問。
圖1 TS201S處理器內(nèi)核結(jié)構(gòu)[1]
在一個程序中,循環(huán)體內(nèi)的指令行(TS201S DSP一個時鐘周期執(zhí)行一個指令行,一個指令行中最多可有四條指令)執(zhí)行次數(shù)最多,程序優(yōu)化的重點在于如何減少程序中循環(huán)體內(nèi)指令行的執(zhí)行周期。特別對于多重循環(huán),嵌套越深,循環(huán)程序的優(yōu)化對提高整個程序的執(zhí)行效率的作用就越大。以一個兩層循環(huán)為例,若外循環(huán)次數(shù)為n,內(nèi)循環(huán)次數(shù)為m,如果在內(nèi)循環(huán)中通過優(yōu)化使得循環(huán)所需的指令執(zhí)行周期數(shù)減少1個,則整個程序可節(jié)省大約(m·n)個指令周期??梢?,減少循環(huán)體內(nèi)指令行的執(zhí)行周期數(shù),整個程序指令執(zhí)行周期數(shù)就會隨循環(huán)次數(shù)成倍的減少。
下面從幾個方面介紹減少指令執(zhí)行周期數(shù)的方法。
TS201S處理器內(nèi)核中有兩個運算模塊[1],每個模塊中各有一組32個32位的寄存器,分別稱為X寄存器組和Y寄存器組。在編寫程序時要充分發(fā)揮DSP的雙核處理能力,盡量同時使用X和Y寄存器組,使得循環(huán)的執(zhí)行次數(shù)僅為使用單核處理時的一半,可使得運算量減少,在理論上可以使得運算效率提高50%。但是在有些情況下當(dāng)循環(huán)次數(shù)減少的同時,循環(huán)中也會增加相應(yīng)的處理,使得循環(huán)中的指令行增多,最終會使得運算效率的提高達(dá)不到50%。
在條件判斷時使用該指令,可以使在條件成立或不成立時要執(zhí)行的指令和條件判斷指令在同一時鐘周期運行,以此提高指令的并行性[4],從而提高程序的運算效率。在某些情況下還可以省去跳轉(zhuǎn)指令,進而減少跳轉(zhuǎn)指令帶來的延時,進一步提高程序的運算效率。
例如,在雷達(dá)信號處理中,經(jīng)常需要從動目標(biāo)檢測(MTD)處理結(jié)果中對相同距離單元、不同多普勒通道的信號中選取幅度最大值作為原始視頻信號,如圖2所示。假定距離單元數(shù)為M,多普勒單元數(shù)為N。第n個距離單元的輸出信號:
式中A(m,n)代表MTD求模后的第n個距離單元、第m個多普勒通道中信號的幅值。
圖3、圖4給出了采用不同編程方式實現(xiàn)上述功能的三種方案。表1中同時給出了當(dāng)M=380,N=8時程序所需的指令執(zhí)行周期數(shù)??梢姡磮D4中的方案B進行編程比圖3中的方案進行編程和圖4中的方案A進行編程的程序所需指令執(zhí)行周期數(shù)分別減少了62%和53%。進而說明同時使用X和Y寄存器組比僅使用X或Y寄存器組時程序的執(zhí)行效率要高,在條件判斷時使用IF-DO-ELSE指令會進一步提高程序的執(zhí)行效率。
表1 M=380,N=8時三種方案所需的指令執(zhí)行周期數(shù)
TS201S[1]可以對存儲器進行單字、雙字、四字不同長度的讀寫操作。當(dāng)進行單字寄存器的讀寫操作時對地址指針沒有特殊要求,但是在進行雙字寄存器或四字寄存器的讀寫操作時,地址指針必須分別可被2整除或被4整除。
當(dāng)對同一存儲區(qū)的數(shù)據(jù)進行訪問時,假設(shè)每次只進行數(shù)據(jù)的讀取不進行別的操作運算,分別進行單字寄存器、雙字寄存器、四字寄存器讀取時,單字寄存器讀取所用時間為雙字寄存器所用時間的2倍,雙字寄存器讀取所用時間為四字寄存器所用時間的2倍。所以在進行存儲區(qū)的讀寫操作時應(yīng)盡量使用四字寄存器的加載或存儲訪問。此時就要求要讀寫的數(shù)據(jù)存儲區(qū)的起始地址要是四的倍數(shù)。但是有時要讀寫的數(shù)據(jù)的存儲起始地址并不是四的倍數(shù),這時可以將要讀的數(shù)據(jù)通過補零的辦法使其存儲起始地址成為四的倍數(shù),例如對9組脈壓數(shù)據(jù)進行FIR濾波時,一般事先將這9組FIR濾波器系數(shù)存儲在DSP內(nèi)部的一段存儲區(qū)中,在濾波時分別讀取這9組系數(shù)進行濾波處理,但是9組系數(shù)每組按實虛部存儲,所以每組系數(shù)的數(shù)據(jù)量為18,則下一組濾波器系數(shù)的起始地址不是4的倍數(shù),此時在讀取下一組濾波器系數(shù)時就不能進行4寄存器的讀取訪問,但是通過在每組系數(shù)后邊補兩個零使每組系數(shù)的數(shù)據(jù)量為20,就可進行四字寄存器的訪問。這樣使得FIR濾波器系數(shù)所需的存儲空間變大,所以稱此辦法為犧牲空間換時間法。圖5為補零前后9組FIR濾波器系數(shù)存儲方式。圖中“實1n”和“虛1n”分別指第一組濾波器的第n個系數(shù)的實部和虛部。
TS201S共有兩塊雙整型邏輯運算單元(IALU)寄存器組,分別為J-IALU寄存器組和K-IALU寄存器組,每個IALU寄存器組包含32個數(shù)據(jù)寄存器和8個專用的循環(huán)緩沖尋址寄存器[1]。IALU中所有寄存器都是32位寬,也都是存儲器映射寄存器[1]。J-IALU寄存器組的寄存器是J31~J0,K-IALU寄存器組的寄存器是K31~K0。除了J31和K31外,這些寄存器都是通用的,且用于保存整型數(shù)據(jù)和用于存儲區(qū)的尋址[1]。當(dāng)對同一組數(shù)據(jù)進行相同運算處理時,可以在同一指令行中讀取本次要進行運算的數(shù)據(jù),存儲上一次的運算結(jié)果,這就要求在循環(huán)體外邊先進行一次處理,這樣會提高指令間的并行性,進而提高算法的運算效率。但是按照TS201S的IALU指令約束[1]:在同一指令行中,J-IALU只能執(zhí)行一條指令,K-IALU也只能執(zhí)行一條指令??梢栽谕恢噶钚羞M行一條J-IALU指令和一條K-IALU指令操作。這就要求分別使用J-IALU寄存器組中的一個寄存器和K-IALU寄存器組中的一個寄存器,分別指向要讀取的存儲區(qū)和要寫入的存儲區(qū),從而在同一指令行中使用J-IALU寄存器組中的一個寄存器進行讀取操作,用K-IALU寄存器組中的一個寄存器進行存儲操作,反之亦然。
TS201S的內(nèi)部總線借助于交叉連接器與每個內(nèi)部存儲塊相連,且交叉連接器不能直接訪問存儲器,需要通過存儲器緩沖(包括預(yù)取數(shù)緩沖、讀緩沖、回存緩沖和高速緩沖)才能訪問存儲器,所以在訪問存儲器時存在存儲器緩沖是否命中的問題。如果所訪問的數(shù)據(jù)未在存儲器緩沖中,存儲器緩沖將花費一些時鐘周期來訪問存儲器中的數(shù)據(jù),所以要采用相應(yīng)的措施來提高存儲器緩沖的命中率。由于預(yù)取數(shù)緩存的預(yù)取數(shù)操作是將存儲器指定地址對8取模后[5],將所在地址的8個32位字?jǐn)?shù)據(jù)傳輸?shù)筋A(yù)取數(shù)緩存內(nèi),數(shù)據(jù)的存儲起始地址最好是8的整數(shù),可避免第一次預(yù)取數(shù)操作取出無用數(shù)據(jù);指針的位移量盡可能不要超過8;所以一般要求對于存儲在同一存儲區(qū)并進行相同處理的數(shù)據(jù),盡量使用同一指針;數(shù)據(jù)處理根據(jù)指針的方向順序進行。
對剛開始編寫TS201S匯編程序的設(shè)計者,往往存在一個誤區(qū):認(rèn)為程序中使用的指令行越少,程序的執(zhí)行效率越高,這是由于沒有考慮指令間的延時狀態(tài),而延時狀態(tài)并不是程序[1],也不是由用戶編寫的,在程序和反匯編程序中并不能直接觀察到。在延時狀態(tài)中,處理器基本處于空閑狀態(tài),僅僅是在等待延時的結(jié)束,而并不執(zhí)行任何指令,那么延時狀態(tài)的存在意味著處理器要浪費一些指令周期,所以有時可能程序的并行程度設(shè)計得很好,但是程序的執(zhí)行效率反而下降。
處理器的流水線執(zhí)行指令方式在執(zhí)行不同的指令行時會引起一些開銷,影響這些開銷的因素主要有指令間的相關(guān)和資源的沖突。
對于指令m和指令n,如果指令n要用到指令m產(chǎn)生的結(jié)果,則稱指令n數(shù)據(jù)相關(guān)于指令m[2]。在上一個指令周期運算的結(jié)果,如果在下一個指令周期中立刻作為源操作數(shù)使用,這兩條指令之間就存在數(shù)據(jù)相關(guān)。這時,處理器會根據(jù)指令的不同在這兩條指令之間插入一定的延時狀態(tài),而在這段時間內(nèi),處理器基本上是處于空閑狀態(tài),僅僅在等待延時狀態(tài)的結(jié)束,而不執(zhí)行任何指令。在程序設(shè)計過程中,如果能避免延時或充分利用延時再進行一些運算,就能實現(xiàn)程序的進一步優(yōu)化。
資源沖突是內(nèi)部總線試圖進行處理器的存儲器訪問時[1,3],相應(yīng)的存儲空間處于繁忙狀態(tài)或者沖突時產(chǎn)生的,所以在同一指令行中如果同時出現(xiàn)存儲指令和讀取指令時應(yīng)注意這一問題。建議對同一程序中的不同緩存區(qū)分配在不同的存儲區(qū)(TS201S共有6個4Mbits的存儲區(qū)),從而減少資源沖突,提高程序的運行效率。
例如,在三脈沖對消過程中,需要在每個距離單元對三個脈沖重復(fù)周期的回波信號進行處理。在第m個距離單元、第n個脈沖重復(fù)周期的輸出信號:
表2給出了當(dāng)M=380時采用不同編程方案實現(xiàn)上述功能的所需的指令周期數(shù),可見方案B的執(zhí)行效率比方案A提高了16%。進而說明運用雙整型邏輯運算單元IALU比只采用一個整型邏輯運算單元IALU可減少指令間延時,進而提高程序的執(zhí)行效率。
表2 M=380時方案A和B所需的指令執(zhí)行周期數(shù)
圖6 三脈沖對消時的程序流圖
本文分別從DSP兩組寄存器組的使用、IF-DOELSE指令的使用、系數(shù)存儲單元的合理分配、指令間延時的減少、雙整型邏輯運算單元的綜合運用幾方面說明如何對程序進行優(yōu)化,并給出了實例,從給出的實例可以看出本文提出的優(yōu)化方法是切實可行的。本文所述的優(yōu)化方法同時適用于TS20XS系列DSP程序的優(yōu)化,在其它DSP中可借鑒。
[1]劉書明,羅勇江.ADSP TS20XS系列DSP原理與應(yīng)用設(shè)計[M].北京:電子工業(yè)出版社,2007.
[2]John L.Hennessy,David A.Patterson(鄭緯民等譯).計算機系統(tǒng)結(jié)構(gòu)-量化研究方法[M].北京:電子工業(yè)出版社,2004.
[3]Analog Device Inc.ADSP-TS201TigerSHARC Processor Hardware Reference,2003.
[4]Analog Device Inc.ADSP-TS201TigerSHARC Processor Programming Reference,2003.
[5]錢誠.基于DSP雷達(dá)信號參數(shù)估計的準(zhǔn)實時處理方法研究[D].南京航空航天大學(xué)碩士學(xué)位論文,2008.
[6]蘇濤,趙峰,盧剛.高速DSP新技術(shù)在雷達(dá)信號處理中的應(yīng)用[J].火控雷達(dá)技術(shù),2005.
[7]www.analog.com.