基于TI C6000系列DSP的C/C++程序優(yōu)化技術(shù)
匯編源代碼再經(jīng)過匯編器(Assembier)翻譯為機器語言目標文件。機器語言是基于通用目標文件格式(Common Object File Format,COFF)的。
連接器(Linker)連接目標文件,生成一個可執(zhí)行文件。它要完成地址的重分配(Relocation)和解析外部引用(Resolve External References)。
得到可執(zhí)行文件之后就可以進行調(diào)試。可用軟件仿真器(Simulator)在PC機上對指令和運行時間進行精確仿真;用XDS硬件仿真器(Emulator)在目標板上進行調(diào)試。
調(diào)試通過后即可下載到目標板進行獨立運行。本文引用地址:http://cafeforensic.com/article/152470.htm
3 程序優(yōu)化流程及方法
3.1 程序優(yōu)化階段
由于DSP應(yīng)用的復(fù)雜度,在用C語言進行DSP軟件開發(fā)時,一般先在基于通用微處理器的PC機或工作站上對算法進行仿真,仿真通過后再將C程序移植到DSP平臺中。
所以,DSP的軟件開發(fā)與優(yōu)化流程主要分為3個階段:C代碼開發(fā)階段;C代碼優(yōu)化階段;手工匯編代碼重編寫階段。如圖2所示。
在圖2中,第一階段:沒有C6000知識的用戶能開發(fā)自己的C代碼,然后使用CCS中的代碼剖析工具,確定C代碼中可能存在的低效率段,為進一步代碼優(yōu)化做好準備。第二階段:C代碼優(yōu)化階段。在這個階段,主要利用intrinsics函數(shù)以及編譯器編譯選項來提高代碼的性能。優(yōu)化后利用軟件模擬器檢查代碼的效率,如仍不能達到期望的效率,則進入第三階段。第三階段:寫線性匯編優(yōu)化。在這個階段中,用戶把最耗費時間的代碼抽取出來,重新用線性匯編寫,然后使用匯編優(yōu)化器優(yōu)化這些代碼。在第一次寫線性匯編時,可以不考慮流水線和寄存器分配。然后,提高線性匯編代碼性能,往代碼中添加更多的細節(jié),如分配寄存器等。由于這一階段所需的時間要比第二階段多,所以整個代碼的優(yōu)化盡量放在第二階段來完成,而少使用線性匯編代碼優(yōu)化。
3.2 C/C++代碼優(yōu)化方法
為了使C/C++代碼獲得最好的性能,可以使用編譯選項、軟件流水、內(nèi)聯(lián)函數(shù)和循環(huán)展開等方法來對代碼進行優(yōu)化,以提高代碼執(zhí)行速度,并減小代碼尺寸。
3.2.1 編譯器選項優(yōu)化
C/C++編譯器可以對代碼進行不同級別的優(yōu)化。高級優(yōu)化由專門的優(yōu)化器完成,低級的和目標DSP有關(guān)的優(yōu)化由代碼生成器完成。圖3為編譯器、優(yōu)化器和代碼生成器的執(zhí)行圖。
當優(yōu)化器被激活時,將完成圖3所示的過程。C/C++語言源代碼首先通過一個完成預(yù)處理的解析器(Parser),生成一個中間文件(.if)作為優(yōu)化器(Optimi-zer)的輸入。優(yōu)化器生成一個優(yōu)化文件(.opt),這個文件作為完成進一步優(yōu)化的代碼生成器(Code Genera-tor)的輸入,最終生成匯編文件(.a(chǎn)sm)。
最簡單執(zhí)行優(yōu)化的方法是采用cl6x編譯程序,在命令行設(shè)置一On選項即可。n是優(yōu)化的級別(n為0,1,2,3),它控制優(yōu)化的類型和程度。
3.2.2 軟件流水優(yōu)化
軟件流水是編排循環(huán)指令,使循環(huán)的多次迭代并行執(zhí)行的技術(shù)。使用一02和一03選項編譯C/C++程序時,編譯器就從程序中收集信息,嘗試對程序循環(huán)做軟件流水。
圖4顯示一個軟件流水循環(huán)。圖4中A,B,C,D和E表示1次迭代中的各條指令;A1,A2,A3,A4和A5表示一條指令執(zhí)行的各階段。循環(huán)中,一個周期最多可并行執(zhí)行5條指令,即圖中陰影部分所示的循環(huán)核(Loop Kernel)部分。循環(huán)核前面的部分稱為流水循環(huán)填充(Pipelined Loop Prolog),循環(huán)核后面部分稱為循環(huán)排空(Pipelined Loop Epilog)。
評論