使用CLT 工具優(yōu)化C6000 代碼
摘 要
本文引用地址:http://dyxdggzs.com/article/201609/303829.htm在C6000 DSP 的開(kāi)發(fā)過(guò)程中,優(yōu)化是必不可少的一個(gè)環(huán)節,根據對象不同可以分為系統,算法,代碼以及內存優(yōu)化。通常,開(kāi)發(fā)者熟悉自己的代碼,會(huì )從前三個(gè)方面修改以獲得整體性能的提升,但是對于內存尤其是緩存(Cache)的優(yōu)化,因為其涉及到芯片本身的架構,Cache 的維護由 DSP 自動(dòng)完成,用戶(hù)通常不能干預,所以似乎無(wú)從著(zhù)手;考慮到這些實(shí)際的問(wèn)題,從 TI 的 7.0 系列編譯器開(kāi)始支持使用緩存優(yōu)化工具(Cache Layout Tools)對 C6000 代碼進(jìn)行優(yōu)化,通過(guò)這一系列的工具,可以很輕松的完成 L1P Cache 性能的提升,本文詳細介紹了該工具的使用方法。
1. 引言
目前,使用TI DSP 的用戶(hù)越來(lái)越多,在C6000 系列DSP 中,包含了C64x, C64x+, C66x 等。在C6000 DSP 的開(kāi)發(fā)過(guò)程中,為了充分利用DSP 的計算資源,需要對用戶(hù)程序進(jìn)行優(yōu)化的工作,根據對象不同可以分為系統,算法,代碼以及內存優(yōu)化。通常,開(kāi)發(fā)者熟悉自己的系統和代碼,可以比較方便的從前三個(gè)方面修改以獲得整體性能的提升,但是對于內存尤其是緩存(Cache)的優(yōu)化,因為其涉及到芯片本身的架構,Cache 的維護由DSP 自動(dòng)完成,用戶(hù)通常不能干預,所以似乎無(wú)從著(zhù)手;考慮到這些實(shí)際的問(wèn)題,從TI 的7.0 系列編譯器開(kāi)始支持使用緩存優(yōu)化工具(Cache Layout Tools)對C6000 代碼進(jìn)行優(yōu)化,通過(guò)這一系列的工具,可以很輕松的完成L1P Cache 性能的提升,本文詳細介紹了該工具的使用方法。
2. C6000 DSP 內核緩存機制
C6000 系統的存儲器結構如下圖所示。
存儲器分成三級:第一級是L1,包括數據存儲器(L1D)和代碼存儲器(L1P);第二級是代碼和數據共用存儲器(L2 以及MSMC SRAM);第三級是外部存儲器,主要是DDR 存儲器。L1P、L1D 和L2的Cache 功能分別由相應的L1P 控制器、L1D 控制器和L2 控制器完成。
在C6000 DSP 中通常我們會(huì )把L1P 全部配置成Cache,當CPU 發(fā)出取指命令,首先會(huì )從L1P 里查找,如果L1P 找不到,則到下一級Cache 或者M(jìn)emory 里查找,當找到需要的地址,則將其讀入L1P 里,CPU 從中讀取執行。
因為L(cháng)1P Cache 的大小是有限的(本文以32KB 為例),而用戶(hù)內存空間一般大于32KB, 必須采取一種映射的方式使得所有地址都能被L1P 緩存;在C6000 DSP 中,L1P Cache 使用地址直接映射,所有DSP 核可訪(fǎng)問(wèn)的地址對L1P Cache 大小(32K)取模就能得到該地址在L1P Cache 的偏移值。
如果用戶(hù)代碼在內存排布不合理,可能會(huì )在L1P Cache 中發(fā)生反復的內容替換,下圖中的例子是一個(gè)極端情況。
TOP 函數中FOR 循環(huán)反復調用A 函數,而A,B,C 三個(gè)函數在內存地址的分布上,與32KB 邊界的偏移地址是一樣的,因此,A,B,C 將對應L1P 里同一個(gè)CACHE 位置;其運行流程如下
· 當執行A 時(shí),CPU 需要把A 函數調入到Cache 偏移值N 的位置上;
· A 調用B,此時(shí)調入B 到Cache 偏移值N 的位置上,覆蓋A 的代碼;
· B 調用C,此時(shí)調入C 到Cache 偏移值N 的位置上,覆蓋B 的代碼;
· C 返回,下一次循環(huán)調入A 到Cache 中覆蓋C 的代碼。
DSP 核對L1P,L2,DDR 的訪(fǎng)問(wèn)速度差異很大,對L1P 的訪(fǎng)問(wèn)通常在1 個(gè)時(shí)鐘周期內完成,而L2 平均需要 3-5 個(gè)周期,DDR 訪(fǎng)問(wèn)需要的時(shí)間更多,因此我們應該盡量避免上述這種反復重寫(xiě)Cache的情況,盡可能的減少函數在Cache 中的置換。
如何解決該問(wèn)題?最好的解決方法則是將A, B, C 在內存中連續排放,這樣對Cache 的操作次數將降到最低,能夠有效的提高執行效率,如下圖所示,只要A,B,C 總的大小不超過(guò)32KB, 它們在Cache 中的偏移值就是連續的,不會(huì )發(fā)生覆蓋的現象,即使其總和大于32KB,發(fā)生置換的也僅僅是超過(guò)32K 的部分。
3. 內存優(yōu)化工具
通過(guò)上述機制可以看到,對于L1P Cache 的優(yōu)化主要通過(guò)分析函數調用關(guān)系和其在內存的分布。由于用戶(hù)代碼日益復雜,人工分析代碼調用關(guān)系和地址排布需要花費大量的時(shí)間。因此,從7.0 系列編譯工具開(kāi)始,TI 提供了一套內存優(yōu)化工具 (Cache Layout Tools) 來(lái)幫助用戶(hù)輕松快捷地解決該問(wèn)題。
該工具的原理是在用戶(hù)進(jìn)行程序編譯時(shí)打開(kāi)生成分析信息選項,編譯器會(huì )自動(dòng)加入分析記錄代碼到用戶(hù)程序里,之后用戶(hù)在TI DSP simulator 或者DSP 芯片上運行該可執行文件,內置的分析代碼會(huì )自動(dòng)記錄用戶(hù)的函數調用關(guān)系及調用次數。運行的案例越多,記錄的信息會(huì )更詳細,優(yōu)化的效果也就越好。
在得到函數運行時(shí)信息以后,就可以使用編譯器工具對其進(jìn)行分析,生成函數排布的順序,最后將此排布順序輸入到編譯器里重新編譯原代碼,生成的可執行文件就已經(jīng)優(yōu)化過(guò)內存排布,具體的操作可以參照以下實(shí)例。
4. 實(shí)例教程
該實(shí)例主要由三個(gè)C 文件組成,
實(shí)例中使用DSP 計數器 TSCL 來(lái)統計cycle 數,子函數放在sub 目錄下。
使用實(shí)例的步驟如下,
1. 編譯代碼
使用TI 編譯器對該實(shí)例進(jìn)行編譯,為了產(chǎn)生用于profile 的信息,需要在編譯時(shí)增加 -- gen_profile_info 選項。如果使用命令還形式,命令行下運行Compile.bat 文件,cl6x 的具體參數可以參考spru186 和spru187 兩篇文檔,一般可以在編譯器的安裝目錄下找到他們,如C:Program Files (x86)Texas InstrumentsC6000 Code Generation Tools 7.3.9doc。
評論