《電子技術(shù)應用》
您所在的位置:首頁 > 嵌入式技术 > 业界动态 > 使用CLT 工具优化C6000 代码

使用CLT 工具优化C6000 代码

2015-05-08
關(guān)鍵詞: CLT 编译器 存储器

  摘 要
  在C6000 DSP 的開發(fā)過程中,優(yōu)化是必不可少的一個環(huán)節(jié),根據(jù)對象不同可以分為系統(tǒng),算法,代碼以及內(nèi)存優(yōu)化。通常,開發(fā)者熟悉自己的代碼,會從前三個方面修改以獲得整體性能的提升,但是對于內(nèi)存尤其是緩存(Cache)的優(yōu)化,因為其涉及到芯片本身的架構(gòu),Cache 的維護由 DSP 自動完成,用戶通常不能干預,所以似乎無從著手;考慮到這些實際的問題,從 TI 的 7.0 系列編譯器開始支持使用緩存優(yōu)化工具(Cache Layout Tools)對 C6000 代碼進行優(yōu)化,通過這一系列的工具,可以很輕松的完成 L1P Cache 性能的提升,本文詳細介紹了該工具的使用方法。
  1.  引言
  目前,使用TI DSP 的用戶越來越多,在C6000 系列DSP 中,包含了C64x, C64x+, C66x 等。在C6000 DSP 的開發(fā)過程中,為了充分利用DSP 的計算資源,需要對用戶程序進行優(yōu)化的工作,根據(jù)對象不同可以分為系統(tǒng),算法,代碼以及內(nèi)存優(yōu)化。通常,開發(fā)者熟悉自己的系統(tǒng)和代碼,可以比較方便的從前三個方面修改以獲得整體性能的提升,但是對于內(nèi)存尤其是緩存(Cache)的優(yōu)化,因為其涉及到芯片本身的架構(gòu),Cache 的維護由DSP 自動完成,用戶通常不能干預,所以似乎無從著手;考慮到這些實際的問題,從TI 的7.0 系列編譯器開始支持使用緩存優(yōu)化工具(Cache Layout Tools)對C6000 代碼進行優(yōu)化,通過這一系列的工具,可以很輕松的完成L1P Cache 性能的提升,本文詳細介紹了該工具的使用方法。
  2.  C6000 DSP 內(nèi)核緩存機制
  C6000 系統(tǒng)的存儲器結(jié)構(gòu)如下圖所示。

QQ截圖20150508170729.png

  存儲器分成三級:第一級是L1,包括數(shù)據(jù)存儲器(L1D)和代碼存儲器(L1P);第二級是代碼和數(shù)據(jù)共用存儲器(L2 以及MSMC SRAM);第三級是外部存儲器,主要是DDR 存儲器。L1P、L1D 和L2的Cache 功能分別由相應的L1P 控制器、L1D 控制器和L2 控制器完成。
  在C6000 DSP 中通常我們會把L1P 全部配置成Cache,當CPU 發(fā)出取指命令,首先會從L1P 里查找,如果L1P 找不到,則到下一級Cache 或者Memory 里查找,當找到需要的地址,則將其讀入L1P 里,CPU 從中讀取執(zhí)行。
  因為L1P Cache 的大小是有限的(本文以32KB 為例),而用戶內(nèi)存空間一般大于32KB, 必須采取一種映射的方式使得所有地址都能被L1P 緩存;在C6000 DSP 中,L1P Cache 使用地址直接映射,所有DSP 核可訪問的地址對L1P Cache 大?。?2K)取模就能得到該地址在L1P Cache 的偏移值。
  如果用戶代碼在內(nèi)存排布不合理,可能會在L1P Cache 中發(fā)生反復的內(nèi)容替換,下圖中的例子是一個極端情況。

QQ截圖20150508170735.png

  TOP 函數(shù)中FOR 循環(huán)反復調(diào)用A 函數(shù),而A,B,C 三個函數(shù)在內(nèi)存地址的分布上,與32KB 邊界的偏移地址是一樣的,因此,A,B,C 將對應L1P 里同一個CACHE 位置;其運行流程如下
  ·當執(zhí)行A 時,CPU 需要把A 函數(shù)調(diào)入到Cache 偏移值N 的位置上;
  ·A 調(diào)用B,此時調(diào)入B 到Cache 偏移值N 的位置上,覆蓋A 的代碼;
  ·B 調(diào)用C,此時調(diào)入C 到Cache 偏移值N 的位置上,覆蓋B 的代碼;
  ·C 返回,下一次循環(huán)調(diào)入A 到Cache 中覆蓋C 的代碼。
  DSP 核對L1P,L2,DDR 的訪問速度差異很大,對L1P 的訪問通常在1 個時鐘周期內(nèi)完成,而L2 平均需要 3-5 個周期,DDR 訪問需要的時間更多,因此我們應該盡量避免上述這種反復重寫Cache的情況,盡可能的減少函數(shù)在Cache 中的置換。
  如何解決該問題?最好的解決方法則是將A, B, C 在內(nèi)存中連續(xù)排放,這樣對Cache 的操作次數(shù)將降到最低,能夠有效的提高執(zhí)行效率,如下圖所示,只要A,B,C 總的大小不超過32KB, 它們在Cache 中的偏移值就是連續(xù)的,不會發(fā)生覆蓋的現(xiàn)象,即使其總和大于32KB,發(fā)生置換的也僅僅是超過32K 的部分。

QQ截圖20150508170742.png

  3.  內(nèi)存優(yōu)化工具
  通過上述機制可以看到,對于L1P Cache 的優(yōu)化主要通過分析函數(shù)調(diào)用關(guān)系和其在內(nèi)存的分布。由于用戶代碼日益復雜,人工分析代碼調(diào)用關(guān)系和地址排布需要花費大量的時間。因此,從7.0 系列編譯工具開始,TI 提供了一套內(nèi)存優(yōu)化工具  (Cache Layout Tools) 來幫助用戶輕松快捷地解決該問題。
  該工具的原理是在用戶進行程序編譯時打開生成分析信息選項,編譯器會自動加入分析記錄代碼到用戶程序里,之后用戶在TI DSP simulator 或者DSP 芯片上運行該可執(zhí)行文件,內(nèi)置的分析代碼會自動記錄用戶的函數(shù)調(diào)用關(guān)系及調(diào)用次數(shù)。運行的案例越多,記錄的信息會更詳細,優(yōu)化的效果也就越好。
  在得到函數(shù)運行時信息以后,就可以使用編譯器工具對其進行分析,生成函數(shù)排布的順序,最后將此排布順序輸入到編譯器里重新編譯原代碼,生成的可執(zhí)行文件就已經(jīng)優(yōu)化過內(nèi)存排布,具體的操作可以參照以下實例。
  4.  實例教程
  該實例主要由三個C 文件組成,

QQ截圖20150508170748.png

  實例中使用DSP 計數(shù)器 TSCL 來統(tǒng)計cycle 數(shù),子函數(shù)放在sub 目錄下。
  使用實例的步驟如下,
  1.  編譯代碼
  使用TI 編譯器對該實例進行編譯,為了產(chǎn)生用于profile 的信息,需要在編譯時增加 -- gen_profile_info 選項。如果使用命令還形式,命令行下運行Compile.bat 文件,cl6x 的具體參數(shù)可以參考spru186 和spru187 兩篇文檔,一般可以在編譯器的安裝目錄下找到他們,如C:\Program Files (x86)\Texas Instruments\C6000 Code Generation Tools 7.3.9\doc。

QQ截圖20150508170755.png

  同時在目錄下生成OBJ 和ASM 文件,這個和我們的實驗關(guān)系不大,可以不用關(guān)注。
  out 文件是一會需要下載到芯片里運行的可執(zhí)行文件,而map 文件用于幫助我們定位profile 信息存放的內(nèi)存地址。
  如果用戶使用CCS 編譯工具,則需要在Build 的屬性里指定Feedback 選項,然后正常編譯即可生成攜帶分析代碼的可執(zhí)行文件。

QQ截圖20150508170804.png

  2.  獲取分析信息
  根據(jù)用戶獲取分析數(shù)據(jù)的不同,這里有兩種方法,第一種方法適用于持續(xù)運行的程序,比如在基于SYS/BIOS 的程序里,有些任務是以循環(huán)的方式存在的,這時用戶需要自己從DSP 內(nèi)存里讀取分析數(shù)據(jù)。
  首先打開map 文件,可以找到.ppdata 段的內(nèi)存地址,這個地址就是profile 信息存放處,在例子中
  .ppdata    0    0081fecc    00000034     UNINITIALIZED
  .ppdata 段位于0x0081fecc 這個地址,長度是34 個byte。
  啟動CCS,連接EVM 板,下載out 文件到DSP 上,在main 函數(shù)末尾加上調(diào)試斷點,可以讓程序到這里暫停(實際上,在用戶代碼中,可以把斷點設置在需要的任何地方,profile 的信息是實時更新的)。

QQ截圖20150508170812.png

  運行該程序,到達斷點后,在View 菜單里打開memory browser,將地址設定為0x0081fecc, 可以讀到.ppdata 的信息,參考以下步驟將其存到工程目錄下。

QQ截圖20150508170819.png

  1)  選取Save Memory
  2)  存放路徑

QQ截圖20150508170827.png

  3)  確定數(shù)據(jù)地址和長度,如下圖

QQ截圖20150508170834.png

  4)  修改dat 文件
  打開剛才存下的dat 文件,注意到文件頭的數(shù)據(jù)長度是以32 比特字為單位的,我們需要以8 比特字節(jié)為單位,如
  1651 9 81fecc 0 d 1
  修改為
  1651 9 81fecc 0 34 1
  5)  轉(zhuǎn)換文件格式
  對剛才的運行profile 信息進行分析,得到優(yōu)化后的cmd 內(nèi)存排布文件,該文件內(nèi)容如下,用戶可根據(jù)自己的程序進行修改

QQ截圖20150508170841.png

  如果是大端,則將-le 選項改為-be 選項。
  第二種方法,針對于只需運行一次流程的程序,CCS 可以自動生成pdat 文件,需要注意的是,生成pdat 文件的分析代碼是在用戶程序結(jié)束也就是exit()程序執(zhí)行時進行,因此用戶要保證自己的程序能完整運行到主函數(shù)出口結(jié)束,否則無法生成pdat 文件,需要用第一種方法來獲取數(shù)據(jù)。
  3.  重新編譯代碼
  首先使用pdd6x 從數(shù)據(jù)文件里提取prf 文件作為重編譯的輸入文件

QQ截圖20150508170847.png

  在命令行形式下,可以以以下形式調(diào)用輸入文件生成csv 文件,
  在CCS 環(huán)境下,只需要在CCS 里指定需要的數(shù)據(jù)文件后產(chǎn)生csv 文件,

QQ截圖20150508170856.png

  

QQ截圖20150508170905.png

  通過調(diào)用clt6x 生成內(nèi)存排布

QQ截圖20150508170913.png

  將輸出的pfo.cmd 加入到項目的cmd 文件重新編譯輸出優(yōu)化后的out 文件,cache 優(yōu)化到此完成。
  對比優(yōu)化結(jié)果,對于TCP/IP 的例子應用上,CLT 帶來了接近20%的提升,對于視頻編碼等應用CLT 也帶來了5%左右的提升。而且,用戶代碼量越大,則CLT 可能帶來的提升越明顯。
  4.  結(jié)論
  通過使用CLT 工具,可以方便快捷的對用戶代碼的Cache 分配進行優(yōu)化,用戶不需要了解DSP Cache 分配的詳細信息,只需要在Simulator 或者硬件板卡上運行定制的代碼,就可以方便快捷地得到Cache 的詳細信息,并自動根據(jù)這些信息對程序在內(nèi)存的分布進行配置已達到提升性能的效果。
  參考文獻
  1.  TMS320C66x DSP CorePac User Guide (SPRUGW0)
  2.  KeyStone Architecture Multicore Shared Memory Controller (MSMC) User Guide (SPRUGW7)
  3.  KeyStone Architecture DDR3 Memory Controller User Guide (SPRUGV8)
  4.  Cache Layout Tools Example
  http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/18908.aspx

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。

相關(guān)內(nèi)容