基于TI C6000系列DSP的C/C++程序優(yōu)化技術(shù)
3.2.3 內聯(lián)函數優(yōu)化
通過(guò)下面的方法改進(jìn)C語(yǔ)言程序,可使編譯出的代碼性能顯著(zhù)提高:
(1)使用intrinsics(內聯(lián)函數)替代復雜的C/C++代碼;
(2)使用字(Word)訪(fǎng)問(wèn)存放在32位寄存器的高16位和低16位字段的數據;
(3)使用雙字訪(fǎng)問(wèn)存放在64位寄存器的32位數據(僅指C64xx/C67XX)。
C6000編譯器提供了許多內聯(lián)函數,它們直接對應著(zhù)C62X/C64X/C67X指令可快速優(yōu)化C代碼。這些內聯(lián)函數不易用C/C++語(yǔ)言實(shí)現其功能。內聯(lián)函數用前下劃線(xiàn)“_”特別標示,其使用方法與調用函數一樣。例如C語(yǔ)言的飽和加法只能寫(xiě)為需要多周期的函數:
這段復雜的代碼可以用_sadd()內聯(lián)函數實(shí)現,它是一個(gè)單周期的C6x指令。
result=_sadd(a,b);
要提高C6000數據處理率,應使一條Load/Store指令能訪(fǎng)問(wèn)多個(gè)數據。C6000有與內聯(lián)函數相關(guān)的指令,例如_add2(),_mpyhl(),_mpylh()等,這些操作數以16位數據形式存儲在32位寄存器的高位部分和低位部分。當程序需要對一連串短型數據進(jìn)行操作時(shí),可使用字1次訪(fǎng)問(wèn)2個(gè)短型數據,然后使用C6000相應指令來(lái)處理數據。相似的在C64x或C67x中,有時(shí)需要執行64位的LDDW來(lái)訪(fǎng)問(wèn)兩個(gè)32位數據,4個(gè)16位數據,甚至8個(gè)8位數據。
3.2.4 循環(huán)展開(kāi)
循環(huán)展開(kāi)是改進(jìn)性能的另一種,即把小循環(huán)的迭代展開(kāi),以讓循環(huán)的每次迭代出現在代碼中。這種方法可增加并行執行的指令數。當每次迭代操作沒(méi)有充分利用C6000結構的所有資源時(shí),可使用循環(huán)展開(kāi)提高性能。
有3種使循環(huán)展開(kāi)的方法:
(1)編譯器自動(dòng)執行循環(huán)展開(kāi);
(2)在程序中使用UNROLL偽指令建議編譯器做循環(huán)展開(kāi);
(3)用戶(hù)自己在C/C++代碼中展開(kāi)。
3.3 匯編優(yōu)化
在對C/C++代碼使用了所有的C/C++優(yōu)化手段之后,如果仍然不滿(mǎn)意代碼的性能,就可以寫(xiě)線(xiàn)性匯編程序,然后用匯編優(yōu)化器進(jìn)行優(yōu)化,生成高性能的代碼。
3.3.1 寫(xiě)線(xiàn)性匯編
使用C6000的剖析工具(Profiling Tools)可以找到代碼中最耗費時(shí)間的部分,就是這部分需要用線(xiàn)性匯編重寫(xiě)。線(xiàn)性匯編代碼與匯編源代碼相似,但是,線(xiàn)性匯編代碼中沒(méi)有指令延遲和寄存器使用信息。這樣做的目的是由匯編優(yōu)化器來(lái)為自己設定這些信息。
寫(xiě)線(xiàn)性匯編代碼時(shí),需要知道:匯編優(yōu)化器偽指令、影響匯編優(yōu)化器行為的選項、TMS320C6000指令、線(xiàn)性匯編源語(yǔ)句語(yǔ)法、指定寄存器或寄存器組、指定功能單元、源代碼注釋等。
3.3.2 匯編優(yōu)化器優(yōu)化
匯編優(yōu)化器的任務(wù)主要有:
(1)編排指令,最大限度的利用C6000的并行能力;
(2)確保指令滿(mǎn)足C6000的延遲要求(Latency Requirements);
(3)為源代碼分配寄存器。
4 結 語(yǔ)
C6000系列的DSP C/c++代碼優(yōu)化比傳統的代碼優(yōu)化要方便的多,但要真正發(fā)揮其芯片的工作效率還是需要一定的經(jīng)驗和技巧。這不僅要求開(kāi)發(fā)人員熟悉其硬件體系,還要求對編譯器的編譯原理有一定的理解。另外,在C語(yǔ)言層面上要達到DSP芯片的峰值即8條指令并行是很難的,大多情況下都只能達到6.7條指令并行。在實(shí)際開(kāi)發(fā)中,若優(yōu)化結果已達到6,7條指令并行卻還離實(shí)時(shí)的要求相差很遠,再花大量的人力去力求達到8條指令并行是不經(jīng)濟的,此時(shí)應該考慮其他的技術(shù)改進(jìn)或策略上的調整以求達到目的。
評論