海軍駐第七一六研究所軍代室 王國剛
江蘇自動化研究所 楊云高
基于TMS320C6678 DSP的程序優(yōu)化技術(shù)的研究
海軍駐第七一六研究所軍代室 王國剛
江蘇自動化研究所 楊云高
基于TMS320C6678 DSP的程序優(yōu)化是一個完整的技術(shù)體系。程序優(yōu)化首先要對所用DSP的架構(gòu)體系和存儲資源有一個清晰的認(rèn)識,并對該架構(gòu)DSP的匯編語言有一定的了解,再合理的利用DSP底層存儲資源分配、C語言的優(yōu)化、軟件流水以及編譯器的優(yōu)化等方法達(dá)到預(yù)期的優(yōu)化效果。
DSP程序優(yōu)化;存儲資源分配;C語言的優(yōu)化;軟件流水;編譯器的優(yōu)化
數(shù)字信號處理(Digital Signal Processing,簡稱DSP)技術(shù)發(fā)展迅速,現(xiàn)已廣泛應(yīng)用于圖像處理技術(shù)、通信、自動控制系統(tǒng)等許多新技術(shù)領(lǐng)域[1]。美國德州儀器公司推出了一款基于KeyStone多核心架構(gòu)體系的高性能數(shù)字信號處理器TMS320C6678。該處理器支持定點(diǎn)/浮點(diǎn)混合運(yùn)算,每個芯片都有8個C66x內(nèi)核,每個內(nèi)核得最高工作頻率可以達(dá)到1.25GHz,即單個TMS320C6678芯片最高能夠提供相當(dāng)于10GHz的內(nèi)核頻率,其單精度浮點(diǎn)運(yùn)算能力理論上可達(dá)160G FLOPS(Floating-point Operations Per Second)[2]。因此,TMS320C6678越來越多被應(yīng)用于有較高的實(shí)時性要求的超高性能計(jì)算當(dāng)中。同時,在這些超高性能的計(jì)算當(dāng)中,實(shí)時性是一個必然要解決的問題,這就需要對TMS320C6678 DSP的程序進(jìn)行優(yōu)化。
對TMS320C6678 DSP的程序進(jìn)行優(yōu)化,歸根結(jié)底就是通過多種優(yōu)化方法充分利用芯片內(nèi)部的各個功能單元和存儲資源,均衡每個功能單元的計(jì)算載荷,合理的分配不同的存儲資源,更好的發(fā)揮該DSP的性能。所以,要對該DSP的架構(gòu)有一個深入的了解。
TMS320C6678 DSP的VLIW(Very Long Instruction Word,超長指令字)架構(gòu)包括兩個通用寄存器文件系統(tǒng)、八個功能單元和兩個數(shù)據(jù)通道系統(tǒng)[3]。兩個數(shù)據(jù)通道系統(tǒng)、兩個寄存器文件系統(tǒng)和八個功能單元各自內(nèi)部之間都幾乎或者完全相互獨(dú)立,每個功能單元都能夠在一個時鐘周期內(nèi)執(zhí)行一條指令,而且不同的功能單元和寄存器都可以在同一時刻執(zhí)行各自的操作。這個機(jī)制是DSP程序優(yōu)化技術(shù)中軟件流水實(shí)現(xiàn)及指令并行的重要因素之一。
TMS320C6678的片上存儲資源共包括以下幾種[4]:每個C66x核心都配置有32KB的一級程序存儲空間(L1 Program Memory,簡稱L1P)、32KB的一級數(shù)據(jù)存儲空間(L1 Data Memory,簡稱L1D)、512KB的二級存儲空間(L2 Memory,簡稱L2)。TMS320C6678還有4096KB大小的共享存儲空間(Multicore Shared Memory,簡稱MSMCSRAM),八個核心共享該存儲空間,默認(rèn)配置為二級共享存儲空間,也可以配置為三級共享存儲空間。
2.1 底層存儲資源的合理分配
底層存儲資源的分配是DSP程序優(yōu)化需要考慮的第一種方法,是每個DSP程序及其優(yōu)化必須要做的工作。底層存儲資源的合理分配能夠使DSP程序優(yōu)化事半功倍,同時也能夠增強(qiáng)程序的穩(wěn)定性;反之,底層存儲資源分配不合理,則會導(dǎo)致DSP程序因?yàn)橘Y源沖突而崩潰。
進(jìn)行底層存儲資源分配時,應(yīng)該站在系統(tǒng)應(yīng)用層的角度,優(yōu)化存儲結(jié)構(gòu),合理分配資源。
(1)對實(shí)時性較強(qiáng)的程序,其代碼、變量及經(jīng)常訪問到的數(shù)據(jù)盡量放到片上資源之中。
一般情況下,都會將各自的代碼放到各自的L2存儲空間中。因?yàn)樵摽臻g可以全部配置成RAM,能夠提高指令提取的效率。若代碼量或數(shù)據(jù)量較大,關(guān)鍵代碼段和數(shù)據(jù)可以通過#pragma CODE_SECTION()和#pragma DATA_SECTION()偽指令分配到片上資源之中。
(2)根據(jù)代碼量和數(shù)據(jù)量等因素,合理分配Cache和RAM的比例關(guān)系,提高Cache的利用率[6]。
一般情況下,為了提高程序運(yùn)行的效率,在TMS320C6678上面進(jìn)行程序設(shè)計(jì)時,L1P和L1D都全部配置為Cache,L2則根據(jù)程序大小合理分配RAM和Cache的關(guān)系[7]。
(3)各核共享的程序和數(shù)據(jù)應(yīng)當(dāng)存放到共享緩存中,同時一定要注意存儲一致性的問題[8]。
TMS320C6678的八個核心共同訪問共享存儲空間MSMC時,會存在存儲一致性的問題??梢酝ㄟ^合理利用CACHE_invL1d()和CACHE_wbL1d()等函數(shù)強(qiáng)制實(shí)現(xiàn)多核之間的存儲一致性。
(4)不經(jīng)常訪問或者訪問具有隨機(jī)性的代碼和數(shù)據(jù),可以分配到不被Cache的內(nèi)存空間中和者被L2 Cache的片下的存儲資源中,降低對Cache性能的影響和對片上資源的占用。
2.2 C語言的優(yōu)化
(1)采用固有操作Intrinsic[3]
固有操作就是直接利用DSP的功能單元實(shí)現(xiàn)一些特殊的操作。固有操作與函數(shù)調(diào)用不同,不會產(chǎn)生跳轉(zhuǎn)。所以固有操作在提高某些操作運(yùn)行效率的同時,省去了程序跳轉(zhuǎn)的時間空隙,能夠有效地實(shí)現(xiàn)DSP程序的優(yōu)化。
SIMD中兩條最常用指令就是LDDW和STDW(執(zhí)行64bits的取數(shù)和存數(shù)),若程序中我們采用的數(shù)據(jù)單元為8位、16位或者32位,通過SIMD就能夠?qū)崿F(xiàn)一次讀取或者寫入8個、4個或者2個操作數(shù),相當(dāng)于.D功能模塊在一個指令周期內(nèi)便實(shí)現(xiàn)了原本要多個指令周期和延遲間隙才能實(shí)現(xiàn)的操作。SIMD的要點(diǎn)是數(shù)據(jù)單元應(yīng)盡可能小、循環(huán)應(yīng)展開并且數(shù)據(jù)應(yīng)邊界對齊。
(3)手動展開循環(huán)結(jié)構(gòu)體(UNROLL LOOP)
UNROLL的作用就是將單次循環(huán)體的操作,強(qiáng)制變?yōu)檎归_因子的倍數(shù),降低總的循環(huán)次數(shù),強(qiáng)制為DSP功能單元的并行操作創(chuàng)造條件。當(dāng)編譯器反饋內(nèi)核兩側(cè)功能單元的使用嚴(yán)重不平衡時,可以選擇使用UNROLL命令。UNROLL運(yùn)行的前提是循環(huán)體的循環(huán)次數(shù)能夠整除展開因子。
2.3 軟件流水(Software Pipeline)
CPU每執(zhí)行完一次指令具有一定的為延遲間隙,一條LOAD指令有4個延遲間隙,一條單精度浮點(diǎn)運(yùn)算有3個延遲間隙,一條跳轉(zhuǎn)指令有5個延遲間隙。在循環(huán)體里面,延遲間隙會顯著降低程序的效率。可以采用軟件流水解決延遲間隙的問題。
對于大部分DSP應(yīng)用程序來說,絕大部分CPU時間是消耗在循環(huán)體當(dāng)中,因此代碼優(yōu)化過程中最重要的是對循環(huán)的優(yōu)化。在C6000系列的DSP中,循環(huán)執(zhí)行的性能取決于軟件流水的實(shí)現(xiàn)程度。使用編譯器優(yōu)化選型-O3或者-O2,能夠使C編譯器自動對循環(huán)代碼實(shí)現(xiàn)軟件流水。圖1是DSP軟件流水和非軟件流水程序運(yùn)行效率對比示意圖:
圖1 軟件流水與非軟件流水的程序運(yùn)行效率對比示意圖
其中,F(xiàn)代表取指,D代表譯碼,E代表執(zhí)行指令。從圖4中可以看出,簡單的軟件流水也能夠通過排列流水操作和并行運(yùn)算有效地提高程序的運(yùn)行效率。
2.4 編譯器的優(yōu)化
秋季播種,以幼苗越冬,翌年春季收獲的菠菜,又稱根茬菠菜、凍菠菜、白露菠菜。一般當(dāng)?shù)厝掌骄鶜鉁?7~19℃時為播種適期,選用晚熟或不易抽薹的品種10月下旬至11月上旬栽植,翌年春天收獲。其他地區(qū)播種期可隨緯度的不同做適當(dāng)調(diào)節(jié)。
編譯器優(yōu)化的方法主要分為兩種:設(shè)置編譯器選項(xiàng)和告知編譯器信息。編譯器選項(xiàng)的設(shè)定能夠啟動文件級的優(yōu)化,已經(jīng)可以滿足大多數(shù)應(yīng)用的需求。告知編譯器信息則是代碼級的優(yōu)化,合理的應(yīng)用能夠大幅提升關(guān)鍵代碼段的執(zhí)行效率。
2.4.1 編譯器選項(xiàng)
編譯器選項(xiàng)較多,下面僅列出常用的幾個:
(1)在調(diào)試選項(xiàng)中,選擇-symdebug none選項(xiàng),表示程序運(yùn)行過程中不再提供軟件調(diào)試信息,如果選擇-g選項(xiàng),會增加調(diào)試信息,降低代碼的并行度并產(chǎn)生額外的代碼;
(2)選擇-opt_level = -O3/-O2優(yōu)化選項(xiàng),能夠啟動對循環(huán)體的軟件流水操作,消除未使用的全局賦值語句等,配合-pm實(shí)現(xiàn)文件級的優(yōu)化;
(3)選擇-mt選項(xiàng),表示程序中沒有使用別名計(jì)數(shù),可以使編譯器好的進(jìn)行優(yōu)化。
2.4.2 告知編譯器信息
(1)#pragma MUST_ITERATE()偽指令
循環(huán)次數(shù)的判斷也是導(dǎo)致循環(huán)執(zhí)行效率低下的因素。因?yàn)檠h(huán)體每執(zhí)行完一次,都要對循環(huán)次數(shù)進(jìn)行判斷,然后根據(jù)判斷結(jié)果跳轉(zhuǎn)執(zhí)行相應(yīng)的語句,判斷和跳轉(zhuǎn)本身會消耗多個指令周期和延遲間隙,產(chǎn)生額外操作,降低程序的實(shí)時性??梢酝ㄟ^啟用#pragma MUST_ITERATE()命令,傳遞循環(huán)次數(shù)的信息給編譯器,編譯器便能不需要判斷循環(huán)次數(shù)而自動展開循環(huán)體,實(shí)現(xiàn)軟件流水,免去判斷和跳轉(zhuǎn)的時間消耗;
(2)restrict關(guān)鍵字
變量之間的相關(guān)性對程序優(yōu)化有較大的影響,完全不相關(guān)的變量更利于提高編譯器對程序的優(yōu)化效率。為了幫助編譯器變量之間的相關(guān)性,我們可以為相互獨(dú)立的指針、引用和數(shù)組變量加上restrict關(guān)鍵詞,這樣可以向編譯器保證過這些變量是相互獨(dú)立的,他們指向的存儲區(qū)域沒有重疊或者沖突。
(3)_nassert()聲明
_nassert()聲明的作用就是告訴編譯器括號內(nèi)的表達(dá)式是成立的,從而暗示編譯器可以采用某種優(yōu)化措施。
采用不同的優(yōu)化方法對下面一段代碼進(jìn)行優(yōu)化,并在TI提供的評估板TMDS EVM6678L上進(jìn)行實(shí)例的調(diào)試,測量記錄針對不同的優(yōu)化方法,執(zhí)行該段代碼所消耗的時鐘周期數(shù)。
char adata[100000];
char bdata[100000];
int i = 0;
for(i=0;i<100000;i++)
{
adata[i]= i/4+1;
bdata[i]= adata[i]+1;
}
優(yōu)化方法1:將所有變量、代碼等都放到DSP TMS320C6678的片下存儲資源DDR3中;
優(yōu)化方法2:在優(yōu)化方法1的基礎(chǔ)上,選擇-opt_level = -O3優(yōu)化選項(xiàng),啟動對循環(huán)體的軟件流水操作;
優(yōu)化方法3:在優(yōu)化方法2的基礎(chǔ)上,將adata和bdata兩個數(shù)組都利用DATA_ALIGN命令強(qiáng)制進(jìn)行128位邊界對齊,并在程序中利用_nassert()聲明adata和bdata數(shù)組都是128位邊界對齊的,最后將i/4改變?yōu)閕ntrinsic操作_rcpsp(4)*i;
優(yōu)化方法4:在優(yōu)化方法3的基礎(chǔ)上,將adata和bdata兩個數(shù)組的128位邊界對齊命令改為32位邊界對齊;
將所有的變量、代碼等都放到DSP TMS320C6678的片上存儲資源L2 SRAM中,重新采用優(yōu)化方法2到4進(jìn)行優(yōu)化測試。
從上邊中可以實(shí)例演示的結(jié)果可以得出三個結(jié)論:
(1)相同的優(yōu)化方法,利用DDR3存儲資源時程序的運(yùn)行效率要低于利用L2 SRAM存儲資源的運(yùn)行效率;
(2)優(yōu)化的方法很多,組合方式也會隨著代碼的不同而不同,要合理的選擇不同的優(yōu)化方法,否則可能會達(dá)不到預(yù)期的優(yōu)化效果;
(3)合理的利用本文中介紹的優(yōu)化方法,能夠顯著的縮短代碼執(zhí)行所消耗的時間,提高應(yīng)用程序的實(shí)時性。
TMS320C6678 DSP一款高性能數(shù)字信號處理芯片,充分發(fā)揮該DSP的運(yùn)算潛能對后續(xù)數(shù)字信號處理技術(shù)的理論研究有一定的推動作用。本文首先對TMS320C6678 DSP的架構(gòu)及存儲資源進(jìn)行了介紹,然后從底層存儲資源的合理分配、C語言的優(yōu)化、軟件流水及編譯器的優(yōu)化等方面較為全面的介紹了該DSP能夠采用的程序優(yōu)化的方法。最后實(shí)例表明本文中的程序優(yōu)化方法明顯縮短了代碼運(yùn)行的效率,提高了程序運(yùn)行的實(shí)時性,對現(xiàn)有數(shù)字信號處理技術(shù)的工程實(shí)踐具有一定的借鑒意義。
[1]蘇濤,吳順君,李真芳等.高性能DSP與高速實(shí)時信號處理[M].西安:西安電子科技大學(xué)出版社,2002.
[2]牛金海,TMS320C66x KeyStone架構(gòu)多核DSP入門與實(shí)例精解[M].上海:上海交通大學(xué)出版社,2014.
[3]TMS320C6000Programmer’s Guide[D].Texas Instruments Inc.,2011.
[4]TMS320C6678 Data Manual[D].Texas Instruments Inc.,2014.
[5]TMS320C66x DSP CorePac User Guide[D].Texas Instruments Inc.,2013.
[6]Multicore Programming Guide[D].Texas Instruments Inc.,2012.
[7]TMS320C66x DSP Cache User Guide[D].Texas Instruments Inc.,2012.
[8]黃安文,張民選.多核處理器Cache一致性協(xié)議關(guān)鍵技術(shù)研究[J].計(jì)算機(jī)工程與科學(xué),31(2009):104-108.
王國剛,男,工程師,研究領(lǐng)域?yàn)樽詣涌刂啤?/p>
楊云高(1988—),男,江蘇連云港人,研究領(lǐng)域?yàn)榍度胧娇刂坪蛙浖O(shè)計(jì)。
Research on program optimization technique based on DSP TMS320C6678
Wang Guo-gang1,Yang Yun-gao2
(1.Naval Representative Of fi ce of the 716 Institute of CSIC,Lianyungang 222061,China;2.Jiangsu Automation Research Institute of CSIC,Lianyungang 222061,China)
Program optimization based on DSP TMS320C6678 is a complete technical system.To optimize the DSP program,we must have a clear vision of the architecture and the memory resources of the DSP,and understand the assembly language of the exactly DSP.Then we can have the ability to apply different methods appropriately to achieve the desired optimization results.The methods include distribution of the memory resources,optimization of C code,software pipeline,optimization of the complier,and so on.Also,DSP program optimization is the process of combining theory with practice.
DSP program optimization;distribution of the memory resources;optimization of C code;software pipeline;optimization of the complier.