DSP在自動(dòng)目標(biāo)識(shí)別中的應(yīng)用
3.2 基于TMS320C62x的并行算法軟件開發(fā)方法
本文引用地址:http://butianyuan.cn/article/87321.htm基于TMS320C62x的并行編譯系統(tǒng)支持C語言和匯編語言開發(fā)并行程序代碼。通常,開發(fā)ATR并行算法按照代碼開發(fā)流程的三個(gè)階段進(jìn)行并行程序設(shè)計(jì):第一階段是開發(fā)C代碼;第二階段是優(yōu)化C代碼;第三階段是編寫線性匯編代碼。以上三個(gè)階段不是必須的,如果在某一階段已經(jīng)實(shí)現(xiàn)了ATR算法的功能和性能要求,就不必進(jìn)入下一階段。
?。?)開發(fā)C代碼
開發(fā)C代碼需要考慮的要點(diǎn)包括:
?、贁?shù)據(jù)結(jié)構(gòu)
TMS320C62x編譯器定義了各種數(shù)據(jù)結(jié)構(gòu)的長度:字符型(char)為8位,短整型(short)為16位,整型(int)為32位,長整形(long)為40位,浮點(diǎn)型(float)為32位,雙精度浮點(diǎn)型(double)為64位。在編寫C代碼時(shí)應(yīng)當(dāng)遵循的規(guī)則是:避免在代碼中將int和long型作為同樣長度處理;對于定點(diǎn)乘法,應(yīng)當(dāng)盡可能使用short型數(shù)據(jù);對循環(huán)計(jì)數(shù)器使用int或者無符號(hào)int類型,避免不必要的符號(hào)擴(kuò)展。
?、谔岣逤代碼性能
應(yīng)用調(diào)試器的Profile工具可以得到一個(gè)關(guān)于C代碼中各特定代碼段執(zhí)行情況的統(tǒng)計(jì)表,也可以得到特定代碼段招待所用的CPU時(shí)鐘周期數(shù)。因此可以找出影響軟件程序總體性能的C代碼段加以改進(jìn),通常是循環(huán)代碼段影響軟件程序總體性能。
?、蹟?shù)據(jù)的定標(biāo)
由于TMS320C62x是定點(diǎn)系列芯片,不支持浮點(diǎn)操作。在程序編寫過程中,應(yīng)當(dāng)盡量采用定點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。而實(shí)際處理的數(shù)據(jù)通常都是浮點(diǎn)的,所以需要把浮點(diǎn)數(shù)據(jù)通過定標(biāo)轉(zhuǎn)化為整型數(shù)據(jù)處理,提高程序的處理速度。數(shù)據(jù)的定標(biāo)是十分關(guān)鍵的步驟,既要使數(shù)據(jù)處理精度滿足性能要求,又要防止在數(shù)據(jù)處理過程中出現(xiàn)溢出。
?。?)優(yōu)化C代碼
優(yōu)化C代碼包括向編譯器指明不相關(guān)的指令、循環(huán)展開、循環(huán)合并、使用內(nèi)聯(lián)函數(shù)、使用字訪問短整型數(shù)據(jù)和軟件流水等方法。
?、傧蚓幾g器指明不相關(guān)的指令
為使指令并行操作,編譯器必須確定指令間的相關(guān)性,只有不相關(guān)的指令才可以并行執(zhí)行。如果編譯器不能確定兩條指令是不相關(guān)的,則認(rèn)為是相關(guān)的,安排它們串行招待。用戶可通過如下方法指明相關(guān)的指令:
·關(guān)鍵字const可以指定一個(gè)目標(biāo),const表示一個(gè)變量或者一個(gè)變量的存儲(chǔ)單元保持不變,使用const可以提高代碼的性能和適應(yīng)性。
·一起使用-pm選項(xiàng)和-03選項(xiàng)可以確定程序優(yōu)先級(jí)。在程序優(yōu)先級(jí)中,所有源文件都被編譯成一個(gè)模塊,從而使編譯器更有效地消除相關(guān)性。
·使用-mt選項(xiàng)向編譯器說明在代碼中不存在存儲(chǔ)器相關(guān)性,即允許編譯器在無存儲(chǔ)器相關(guān)性的假設(shè)下進(jìn)行優(yōu)化。
?、谘h(huán)展開
循環(huán)展開就是把循環(huán)計(jì)數(shù)小的循環(huán)展開,成為非循環(huán)形式的串行程序,或者把循環(huán)計(jì)數(shù)大的循環(huán)部分展開,減少循環(huán)迭代次數(shù),增加單個(gè)循環(huán)內(nèi)的代碼,使得循環(huán)內(nèi)的操作可以均勻分布在各個(gè)功能單元上,保持DSP處理器的各個(gè)功能單元滿負(fù)荷運(yùn)行。
?、垩h(huán)合并
如果兩個(gè)循環(huán)計(jì)數(shù)差不多、循環(huán)執(zhí)行互不相同的操作,可以把它們合并在一起組成一個(gè)循不。當(dāng)兩個(gè)循環(huán)的負(fù)荷都不滿時(shí),這是非常有用的。
④使用內(nèi)聯(lián)函數(shù)
TMS320C62x編譯器提供的內(nèi)聯(lián)函數(shù)是直接映射為內(nèi)聯(lián)指令的特殊函數(shù),內(nèi)聯(lián)函數(shù)的代碼高效、代碼長度短。用戶可以使用內(nèi)聯(lián)函數(shù)并行優(yōu)化C代碼。
?、菔褂米止?jié)訪問短整型數(shù)據(jù)
內(nèi)聯(lián)函數(shù)中有些指令是對存儲(chǔ)在32位寄存器的高16位和低16位字段進(jìn)行操作的。當(dāng)有大量短整型數(shù)據(jù)進(jìn)行操作時(shí),可以使用字(整型數(shù))一次訪問兩個(gè)短整型數(shù)據(jù)。然后使用內(nèi)聯(lián)函數(shù)對這些數(shù)據(jù)進(jìn)行操作,從而減少對內(nèi)存的訪問。
?、捃浖魉?/p>
軟件流水是用來安排循環(huán)指令,使這個(gè)循環(huán)多次迭代并行執(zhí)行的一種技術(shù)。在編譯時(shí)使用-o2和-o3選項(xiàng),編譯器可對循環(huán)代碼實(shí)現(xiàn)軟件流水;使用-o3和-pm選項(xiàng),使優(yōu)化器訪問整個(gè)程序,了解循環(huán)次數(shù);使用_nassert內(nèi)聯(lián)函數(shù),防止冗余循環(huán)產(chǎn)生;使用投機(jī)執(zhí)行(_mh選項(xiàng))消除軟件注流水循環(huán)的排空,從而減少代碼尺寸。
在嵌套循環(huán)中,編譯器僅對最里面的循環(huán)執(zhí)行軟件流水,因此對招待周期很少的內(nèi)循環(huán)作循環(huán)展開,外循環(huán)進(jìn)行軟件流水,這樣可以改進(jìn)C代碼并行執(zhí)行的性能。使用軟件流水還應(yīng)當(dāng)注意:盡管軟件流水循環(huán)可以包含內(nèi)聯(lián)函數(shù),但是不能包含函數(shù)調(diào)用;在循環(huán)中不可以有條件終止指令;在循環(huán)體中不可以修改循環(huán)控制變量。
?。?)編寫線性匯編代碼
編寫線性匯編代碼是并行算法軟件開發(fā)流程的第三個(gè)階段。了提高并行算法軟件代碼的性能,對影響并行程序速度的關(guān)鍵C代碼可以用線性編重新編寫。編寫線性匯編代碼不需要指明使用的寄存器、指令的并行與否、指令的延遲周期和指令使用的功能單元,匯編優(yōu)化器會(huì)根據(jù)情況確定這些住處。優(yōu)化線性匯編代碼的方法包括:為線性匯編指令指定功能單元,使得最后的匯編指令并行執(zhí)行;使用字訪問短整型數(shù)據(jù);使用軟件流水對循環(huán)進(jìn)行優(yōu)化。編寫線性匯編代碼的工作量非常大,需要很長的開發(fā)周期,而且開發(fā)后的匯編代碼不能像C代碼那樣移植在其它的DSP平臺(tái)上。
應(yīng)用上述并行程序開發(fā)方法,在TMS320C6201 EVM板上實(shí)現(xiàn)了寬帶毫米波雷達(dá)目標(biāo)時(shí)延神經(jīng)網(wǎng)絡(luò)識(shí)別算法。經(jīng)過實(shí)際測試,并行算法程序執(zhí)行時(shí)間為0.850ms,滿足了目標(biāo)識(shí)別算法的實(shí)時(shí)性需求。
評(píng)論