《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 業(yè)界動(dòng)態(tài) > 使用CLT 工具優(yōu)化C6000 代碼

使用CLT 工具優(yōu)化C6000 代碼

2015-05-08
關(guān)鍵詞: CLT 編譯器 存儲(chǔ)器

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

QQ截圖20150508170729.png

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

QQ截圖20150508170735.png

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

QQ截圖20150508170742.png

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

QQ截圖20150508170748.png

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

QQ截圖20150508170755.png

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

QQ截圖20150508170804.png

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

QQ截圖20150508170812.png

  運(yùn)行該程序,到達(dá)斷點(diǎn)后,在View 菜單里打開(kāi)memory browser,將地址設(shè)定為0x0081fecc, 可以讀到.ppdata 的信息,參考以下步驟將其存到工程目錄下。

QQ截圖20150508170819.png

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

QQ截圖20150508170827.png

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

QQ截圖20150508170834.png

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

QQ截圖20150508170841.png

  如果是大端,則將-le 選項(xiàng)改為-be 選項(xiàng)。
  第二種方法,針對(duì)于只需運(yùn)行一次流程的程序,CCS 可以自動(dòng)生成pdat 文件,需要注意的是,生成pdat 文件的分析代碼是在用戶程序結(jié)束也就是exit()程序執(zhí)行時(shí)進(jìn)行,因此用戶要保證自己的程序能完整運(yùn)行到主函數(shù)出口結(jié)束,否則無(wú)法生成pdat 文件,需要用第一種方法來(lái)獲取數(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

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

QQ截圖20150508170913.png

  將輸出的pfo.cmd 加入到項(xiàng)目的cmd 文件重新編譯輸出優(yōu)化后的out 文件,cache 優(yōu)化到此完成。
  對(duì)比優(yōu)化結(jié)果,對(duì)于TCP/IP 的例子應(yīng)用上,CLT 帶來(lái)了接近20%的提升,對(duì)于視頻編碼等應(yīng)用CLT 也帶來(lái)了5%左右的提升。而且,用戶代碼量越大,則CLT 可能帶來(lái)的提升越明顯。
  4.  結(jié)論
  通過(guò)使用CLT 工具,可以方便快捷的對(duì)用戶代碼的Cache 分配進(jìn)行優(yōu)化,用戶不需要了解DSP Cache 分配的詳細(xì)信息,只需要在Simulator 或者硬件板卡上運(yùn)行定制的代碼,就可以方便快捷地得到Cache 的詳細(xì)信息,并自動(dòng)根據(jù)這些信息對(duì)程序在內(nèi)存的分布進(jìn)行配置已達(dá)到提升性能的效果。
  參考文獻(xiàn)
  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)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。