DSP函數(shù)執(zhí)行時間自動測試方法
出處:電子技術(shù)網(wǎng) 發(fā)布于:2013-06-26 10:47:01
摘要:在進行DSP函數(shù)級的優(yōu)化中,首先需要確定哪些函數(shù)占用CPU多。以TI C64x+ DSP為例,描述了如何利用TI集成開發(fā)環(huán)境及相關(guān)的配套腳本分析工具,實現(xiàn)大量函數(shù)執(zhí)行時間自動測試的方法,該方法效率高,并且可獲得函數(shù)運行的各類信息,為軟件的函數(shù)級優(yōu)化提供了充分依據(jù)。
1.前言
DSP軟件優(yōu)化是DSP軟件開發(fā)人員經(jīng)常面臨的課題。雖然TI的集成開發(fā)環(huán)境CCS提供了豐富的優(yōu)化手段,但在產(chǎn)品開發(fā)階段,考慮的比較多的往往是代碼的可讀性。正確性以及調(diào)測的方便,而函數(shù)執(zhí)行效率方面不一定能全面照顧到,從而在后期面臨代碼優(yōu)化工作。
在一個復(fù)雜的DSP系統(tǒng)上運行的軟件工程函數(shù)眾多,軟件優(yōu)化除了文件級優(yōu)化之外,往往需要對某些重點函數(shù)進行優(yōu)化。而如何從大量的函數(shù)中準確的提取出執(zhí)行效率低。占用CPU資源多的重點優(yōu)化函數(shù),成為函數(shù)級優(yōu)化之前的首先要解決的問題。以往測試函數(shù)執(zhí)行時間,一般在函數(shù)前后添加記錄時間點的測試代碼,在Emulator環(huán)境或真實環(huán)境中跑一下測得函數(shù)執(zhí)行時間,或者在Simulator環(huán)境下使用CCS提供的Profile功能,測得函數(shù)執(zhí)行占用的cycle數(shù)。無論哪種方法,都只能逐個函數(shù)進行,效率低下,而且不能直接得出函數(shù)執(zhí)行頻率這一優(yōu)化需要參考的重要指標(因為有些函數(shù)雖然執(zhí)行消耗cycle很多,但其執(zhí)行次數(shù)少,也不是占用CPU的主因)。如果對各函數(shù)的執(zhí)行頻率進行理論上的計算,再結(jié)合打點測試結(jié)果做通盤的比較,做起來也是效率低,而且面臨與實際可能有較大出入的問題。
2.函數(shù)執(zhí)行時間測量
利用TI CCS3.3(6.1.12版本以上)集成開發(fā)環(huán)境自帶的函數(shù)進出鉤子(Function entry/exit hooks)的新功能,可以方便的實現(xiàn)整個軟件工程運行過程中執(zhí)行到的全部函數(shù)(庫函數(shù)及inline函數(shù)除外)進入和退出時間點的記錄,再配合相關(guān)的腳本分析工具,很快一張所有運行到的函數(shù)執(zhí)的行時間和執(zhí)行次數(shù)的匯總表,便呈現(xiàn)在眼前。
2.1 編寫函數(shù)進出鉤子(hook)函數(shù),構(gòu)造測試工程
鉤子函數(shù)的功能,是在函數(shù)進入和退出時進行調(diào)用,記錄下函數(shù)指針和進出的時間點,保存在一片專門開辟的內(nèi)存空間。這片空間在這里我們稱之為“hook信息記錄區(qū)”.hook信息記錄區(qū)大小可以自己根據(jù)需要制定。如果占用內(nèi)存空間往往比較大,可存放在片外DDR2內(nèi)存空間。在hook信息記錄方式上,由于后續(xù)配套分析腳本的需要,采用順序記錄(而不是循環(huán)記錄)的方式。另外由于鉤子函數(shù)調(diào)用極其頻繁,編寫時需要注意提高hook函數(shù)的執(zhí)行效率。Hook函數(shù)主要包括初始化函數(shù)。進入函數(shù)時調(diào)用的hook函數(shù)以及退出函數(shù)時調(diào)用的hook函數(shù)。下面是一個進入函數(shù)時調(diào)用的hook函數(shù)代碼(其中g(shù)aqRecord[]數(shù)組空間就是hook信息記錄區(qū));退出函數(shù)時調(diào)用的hook函數(shù),可以跟FuncHookEnter相同,也可以不同,相同時可以直接用FuncHookEnter.

本例中,將FuncHook.c文件加入到DSP軟件工程中,并使用-o3優(yōu)化(提高執(zhí)行效率)。并修改DSP工程的編譯選項,登記鉤子進出函數(shù),具體設(shè)置方法為,打開Build Options對話框,選中C o m p i l e r – > C a t e g o r y ->Advance(2),然后在“Entry hook function”一欄中填入自己定義的進入函數(shù)的鉤子函數(shù)名稱,例如此處填入FunHookEnter,“Caller's parameter topass”從下拉框中選擇“address”,退出函數(shù)的hook函數(shù)的設(shè)置一樣。
由于hook信息記錄區(qū)大小有限,而且采用順序記錄的方式,hook信息記錄區(qū)很快就記錄滿了,之后便停止記錄,因此,在記錄時可以通過對索引變量進行了判斷,該索引初始化為不記錄,在做好一切準備工作(如DSP加載后,把系統(tǒng)功能都運行起來)之后,通過一個調(diào)試開關(guān),在idle任務(wù)執(zhí)行函數(shù)中檢測到該開關(guān)變?yōu)镃TRUE后,將索引置為0,開始記錄hook信息。另外,該idle任務(wù)函數(shù)執(zhí)行很頻繁,實際測試一般不需要記錄該函數(shù)的進出時間信息,所以可以使用#pragma NO_HOOKS將該函數(shù)屏蔽掉。
2.2 腳本工具自動化分析記錄的數(shù)據(jù)
編譯測試工程,生成DSP版本并加載運行,做好準備工作(如運行特定功能)之后,通過調(diào)試命令的方法將gudRecordIdx索引置0,開始觸發(fā)記錄hook信息。記錄區(qū)滿后(可以通過讀取gudRecordIdx變量值來確認),將hook信息記錄區(qū)(即:gaqRecord[]數(shù)組)讀出,傳送到后臺PC機保存生成一個dat文件。
由于hook信息記錄是記錄區(qū)寫滿后即停止,所以實際得到的dat文件中記錄的一些函數(shù)可能只有進入記錄,沒有對應(yīng)退出的記錄,這樣可能造成后面的腳本自動分析失敗,這個問題可以對生成的dat文件稍加改造來解決。使用文本編輯器打開dat文件,在文件頭添加如下三行信息:

其中行“1651 1 0 0 0”為dat格式文件頭,是固定不變的。而第二行“0xA0000000”為一個任意數(shù),只要與測試工程中任意一個函數(shù)的指針都不相同就行。
接下來就是利用TI提供的自動化腳本分析工具進dat文件進行分析,腳本分析工具文件夾中包含以下相關(guān)文件:
?。?)func_info.pl.ofd6x.exe和XML_TI_OFD.pm安裝TI提供的cg_xml-v2_20_00-Setup.exe之后從安裝程序目錄下得到的,主要用來根據(jù)函數(shù)地址生成函數(shù)名字符串;(2)cmd.bat是可執(zhí)行批處理文件,使用時需要修改該文件,將其中的。out和。dat文件名改為與實際處理的文件名一致;(3)post_process7.pl是dat文件分析專用Perl語言腳本。運行該腳本之前,需要安裝ActivePerl.
把獲取的記錄函數(shù)進出時間的。dat文件和工程編譯生成的。out文件也拷貝到該目錄中,執(zhí)行cmd.bat即生成終分析結(jié)果文件output.
csv.用Excel打開該文件,也可另存為xls文件,方便編輯。
3.實用實例
按照前面的描述定義鉤子函數(shù)并設(shè)置編譯器編譯選項,在加載DSP并運行相關(guān)系統(tǒng)功能后,獲得如下某DSP系統(tǒng)函數(shù)執(zhí)行時間測試結(jié)果樣例,可以清楚的看到實際運行過程中各函數(shù)執(zhí)行占用CPU的情況,CPU占用率比較大的函數(shù)就是要著手優(yōu)化的重點。
如表1所示,測試結(jié)果中的“Exclusive_Cycles”是不包括子函數(shù)執(zhí)行時間在內(nèi)的函數(shù)執(zhí)行占用CPU周期數(shù)(凈時間);“Inclusive_Cycles”是包括子函數(shù)執(zhí)行時間在內(nèi)的函數(shù)執(zhí)行占用CPU周期數(shù)(毛時間);“Number_of_Calls”在函數(shù)執(zhí)行的次數(shù);“Avg_Cycles”是平均執(zhí)行cycle數(shù);“Max_Cycles”是執(zhí)行凈cycle數(shù);“Min_Cycles”是執(zhí)行凈cycle數(shù)。

此hook信息記錄功能對于BIOS庫函數(shù)及inline函數(shù),編譯器不會嵌入hook調(diào)用,測試時根據(jù)需要,可以把內(nèi)聯(lián)函數(shù)的inline關(guān)鍵字去掉。另外,在-o3優(yōu)化的情況下,為了提高執(zhí)行效率,編譯器會把某些代碼行規(guī)模小,調(diào)用地方少的普通函數(shù)自動展開為inline函數(shù)(這種情況可以從匯編代碼中看到),從而導(dǎo)致這些函數(shù)沒有被hook記錄到。此時,可以將使用了-o3優(yōu)化的文件或整個工程的編譯選項auto inline threshold設(shè)置為0,以解決編譯器自動inline的問題。
4.結(jié)論
使用該進出hook函數(shù)進行函數(shù)執(zhí)行時間的自動測試方法,可以輕而易舉的得到實際運行中各函數(shù)準確的平均執(zhí)行時間,以及各自對CPU的占用情況,將軟件開發(fā)人員從之前的機械繁瑣的函數(shù)效率測試的工作中解放出來,使得函數(shù)優(yōu)化工作能夠更加準確的把握到重點,后續(xù)優(yōu)化效果評估也更加的容易,從而大大提高軟件函數(shù)級優(yōu)化工作的效率。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 掌握 DSP:原理剖析與應(yīng)用實踐2025/5/8 14:03:24
- 模糊邏輯在 DSP 上實時執(zhí)行2023/7/25 17:13:30
- 多速率DSP及其在數(shù)模轉(zhuǎn)換中的應(yīng)用2023/6/12 15:28:52
- 使用 DSP 加速 CORDIC 算法2023/3/29 15:46:30
- 高速DSP系統(tǒng)的信號完整性2022/9/26 16:45:38









