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