摘 "要: 數據實時處理能力是雷達信號處理等實時系統的重要指標,提高軟件運行效率是系統軟件設計中必須要考慮的問題。大批量數據讀取和存儲操作存在于信號處理各工作階段,對其進行充分優化是信號處理軟件設計的重要組成部分。在此以ADSP TS201平臺數據轉存為例,描述了軟件優化的設計思路和處理方法,運行結果表明,充分應用DSP并行處理特性和寬數據操作,采用匯編語言編程,可以使軟件運行效率得到顯著提高。
關鍵詞: TS201; 匯編語言; 優化設計; 指令并行; 信號處理
中圖分類號: TN919?34; TP312 " " " " " " " " " "文獻標識碼: A " " " " " " " " " 文章編號: 1004?373X(2015)02?0046?03
Software optimization design based on TS201
REN La?mei, GU Kang, LI Zeng?yuan
(Shaanxi Huanghe Group Co., Ltd., Xi’an 710043, China)
Abstract: The capability of real?time data processing is a significant index for evaluation of real?time processing systems, such as radar signal processing system. Improvement of software efficiency must be considered in system software design. Due to the fact that the readout and storage of mass data exist in every stage of data processing, the sufficient optimization becomes imperative for design of signal processing software. Taking data dump based on ADSP TS201 platform for example, the principle of optimization design and its processing approach are illuminated. Preliminary results verify that the software running efficiency can be dramatically improved by the parallel processing and broad data operation with DSP, as well as application of assembler language programming.
Keywords: TS201; assemble language; optimization design; instruction parallel; signal processing
雷達作為一種探測、捕獲及跟蹤目標的現代化設備,要求具有較高的實時處理能力。信號處理系統作為雷達的重要組成部分,負責對回波信號進行處理并檢測目標信號,是雷達系統中數據處理量最大、運算復雜度最高的部分,其實時處理能力的提高能夠達到提升雷達系統整體性能的目的[1?2]。對信號處理軟件的優化通常需結合具體DSP處理器平臺進行,本文主要介紹了基于ADSP TS201的軟件優化設計方法。
1 "優化設計方法
軟件的優化設計通常包括如下兩部分:
(1) 對軟件算法的優化,即通過尋找最適合硬件實現的算法,提高軟件運行效率;
(2) 對代碼的優化,即通過優化代碼的組合及順序,提高代碼執行效率。當實現算法確定后,軟件的優化主要是代碼的優化。
為了提高軟件執行效率需采用匯編語言進行編程,通過充分利用CPU資源,使其在最少的時間完成最多的指令。ADSP TS201是ADI的一款支持浮點數運算的高性能數字信號處理芯片,其內部包含兩個運算模塊(X、Y模塊)及2個整數運算寄存器組(J、K寄存器組),雙運算模塊及雙整數運算寄存器組支持并行操作。4條相互獨立的128位寬度的內部數據總線分別連接6個4 Mb內部存儲器塊中的一個,提供4字的數據、指令及I/O訪問。內部靜態超標量結構使得DSP每周期可執行多達4條指令,24個16位定點運算和6個浮點運算[3?5]。
結合ADSP TS201的硬件結構,對軟件的優化主要可從如下幾個方面進行考慮:充分利用雙運算模塊和雙整型ALU,進行并行操作;使用自增的指針尋址方式,減小尋址時間;充分利用單周期多指令操作。
2 "軟件優化實例
通常雷達信號處理包括脈沖壓縮、MTI、MTD、恒虛警等一系列處理[6?8]。這些處理包含大量的乘法、加法等運算,計算處理較為復雜,不可能將處理中間結果直接存儲在寄存器中用于后續處理,因此需要將各算法處理結果及時存儲在DSP內存中,這樣就要對數據進行反復地讀取和存儲[9?10]。數據讀取和存儲操作的優化設計就成為軟件優化中的重要部分。本文就以包含數據讀取和存儲的數據轉存操作為例,介紹軟件的優化設計方法。數據轉存操作要求將數組Source中的200項數據轉移到數組Destination中。該功能可使用C語言實現,也可以使用匯編語言編寫。
2.1 "方案1:C語言for循環實現數據轉移
采用C語言編程,最簡單的方法是用for循環語句進行數據的循環讀取和存儲,如下所示:
int Trans_loop;
for (Trans_loop =0; Trans_loop lt;200; Trans_loop ++)
{ " " Source[Trans_loop] = Destination[Trans_loop]; }
該段代碼經編譯器編譯后產生的匯編代碼如表1所示。
表1 for循環語句執行過程
注:表中的黑體字表示插入了等待周期。
表1匯編代碼中,第2~16行循環執行200次,實現200項數據的轉移。一個數據的轉移需15行指令,若無等待周期需消耗15個指令周期,則轉存200項數據總共需要1+15×200=3 001個指令周期。實際運行中,有時會由于數據不穩定,DSP自動插入等待周期;部分跳轉指令會打斷流水的執行,也會插入等待周期,導致實際消耗指令周期大于理論值。表1中給出了實際的指令周期消耗數,表中的黑體字表示插入了等待周期,其中第3行、第4行、第8行、第11行的插入是因為指令中用了立即數,此指令在執行時需從程序存儲塊中取出數據,導致指令執行時間增加。總指令周期計算時最后加10是因為循環結束時,PC預測錯誤,指令流水被打斷,系統插入10個等待周期,該段代碼總共消耗4 823個指令周期。
2.2 "方案2:匯編語言雙字轉移
第2種方案是用匯編語言編寫實現數據轉移,編寫代碼如下:
行號 指令
1 j10=j31+_Source;;
2 k10=k31+_Source+2;xr0 = 200;;
3 j0=j31+_Destination;;
4 k0=k31+_Destination+2;;
5 xr0=lshift r0 by ?2;;
6 lc0=xr0;;
7 xr1:0=l[j10+=4];;
8 transfer_begin:
9 yr1:0=l[k10+=4];l[j0+=4]=xr1:0;;
10 .align_code 4;
11 if nlc0e,jump transfer_begin; l[k0+=4]=yr1:0;xr1:0=l[j10+=4];;
與方案1相比,該方案使用TS201的零開銷循環計數器lc0減少循環開銷;通過j9和j10地址自增尋址減小尋址時間;并行運行雙寄存器減少存取次數;利用DSP寬數據總線進行數據雙字訪問,減少循環次數,理論上總共需要107個指令周期。實際運行時,第9行、第11行的在前兩次執行時由于數據不穩定會插入等待周期,當Source與Destination處于相同存儲塊時,由于第9行和第11行中讀數和寫數是對同一存儲塊進行的,而DSP對同一存儲塊分配的數據總線不能同時進行讀和寫,因此第9行和第11行執行時插入等待周期,各消耗2個指令周期,總共消耗246個周期;當Source與Destination處于不同存儲塊時,DSP的不同數據總線可以同時訪問兩個存儲塊,第9行和第11行的執行不需額外等待,共消耗116個指令周期。
2.3 "方案3:匯編語言四字轉移
由于200是8的整數倍,因此還可以考慮采用128位數據總線進行4字訪問,此時代碼如下:
行號 指令
1 j10=j31+_Source;;
2 k10= k31+_Source+4;xr0 = 200;;
3 j0=j31+_Destination;;
4 k0=k31+_Destination+4;;
5 xr0=lshift r0 by ?3;;
6 lc0=xr0;;
7 xr3:0=q[j10+=8];;
8 transfer_begin:
9 yr3:0=q[k10+=8];q[j0+=8]=xr3:0;;
10 .align_code 4;
11 if nlc0e,jump transfer_begin;q[k0+=8]=yr3:0;
xr3:0=q[j10+=8];;
與方案2相比,該方案將雙字訪問變為4字訪問,進一步減少了讀取次數,理論消耗57個指令周期。實際執行時由于第7行到第9行、第9行到第11行以及第11行到第9行2個連續的指令行中都有對xr1:0和yr1:0寄存器的操作,當數據未穩定時,會插入等待周期。當Source與Destination處于相同存儲塊時,總共消耗132個周期。當Source與Destination處于不同存儲塊時,總共消耗66個指令周期。
從3種方案的執行結果可以看到,通過充分利用指令并行、寬數據總線以及零開銷循環計數器,并將源數據區和目的數據區分配到不同的存儲塊中,對匯編代碼進行一步步的優化,方案2可以在116個周期內完成方案1中需用4 823個指令周期才能完成的任務,效率提高了約40倍;方案3可以在66個指令周期內完成,相對方案1效率提高了約70倍。
需要說明的是,此時統計的指令周期數包含了循環運行前的準備計算,這些計算與循環次數無關,此處僅以200個數據為例,當轉存數據越大時,實際的效率差異越大。方案3要求使用存儲區是雙字對齊的,方案4要求存儲區都是4字對齊的,這要求在數組定義時使用關鍵字align進行設置。
3 "結 "語
通過充分利用指令并行、寬數據總線以及零開銷循環計數器,可以顯著提高數據轉移的運行效率。本文所述方法為軟件優化中的基礎方法,更多的方法可結合具體算法進行,包括充分利用雙運算模塊和雙整型ALU進行并行操作、合理安排指令順序減少指令等待延時充分發揮軟件流水作用、將程序和數據或同一指令周期中涉及的數據放在不同存儲器塊中、循環展開等[11?13]。數據的讀取與存儲是所有算法實現的基礎,本文所述優化處理方法可應用到各類需要對大批量數據進行處理的算法中。本文以AD公司TS201為例進行了說明,對于諸如TI6678等其他DSP處理器,雖然具體指令有所不同,但優化處理的思路是同樣適用的。
參考文獻
[1] 蘇濤.實時信號處理系統設計[M].西安:西安電子科技大學出版社,2005.
[2] Analog Devices. ADSP?TS201 TigerSHARC processor programming reference (1.0) [R]. USA: Analog Devices, 2004.
[3] Analog Devices. ADSP?TS201 TigerSHARC Processor hardware reference (1.1) [R]. USA: Analog Devices, 2004.
[4] 劉書明,羅勇江.ADSP TS20XS 系列DSP原理與應用設計[M].北京:電子工業出版社,2007.
[5] 羅軍.基于TS20X DSP的機載雷達實時信號處理[D].成都:電子科技大學,2004.
[6] 韓婧.微波稀布陣雷達目標檢測技術的設計與實現[D].西安:西安電子科技大學,2010.
[7] 李軍華.脈沖壓縮線性調頻測距系統信號處理技術研究[D].南京:南京理工大學,2007.
[8] 吳旖.雷達信號恒虛警檢測處理研究[D].南京:南京理工大學,2009.
[9] 夏金艷.某末制導雷達信號處理機系統設計與實現[D].西安:西安電子科技大學,2009.
[10] 吳順君,梅曉春.雷達信號處理和數據處理技術[M].北京:電子工業出版社,2010.
[11] 郭淑婷.DSP匯編語言優化設計[J].河南師范大學學報:自然科學版,2009,37(1):151?154.
[12] Analog Devices. Writing efficient floating?point FFTs for ADSP?TS201 TigerSHARC processors [R]. USA: Analog Devices, 2004.
[13] 劉浪,陳伯孝,任臘梅.TS20XS系列DSP程序優化設計方法及應用[J].火控雷達技術,2011(3):66?71.