TMS320C6678 存儲(chǔ)器訪問性能 (上)
摘要
本文引用地址:http://www.ex-cimer.com/article/201610/307348.htmTMS320C6678 有8 個(gè)C66x 核,典型速度是1GHz,每個(gè)核有 32KB L1D SRAM,32KB L1P SRAM 和 512KB LL2 SRAM;所有 DSP 核共享 4MB SL2 SRAM。一個(gè) 64-bit 1333MTS DDR3 SDRAM 接口可以支持8GB 外部擴(kuò)展存儲(chǔ)器。
存儲(chǔ)器訪問性能對 DSP 上運(yùn)行的軟件是非常關(guān)鍵的。在 C6678 DSP 上,所有的主模塊,包括多個(gè)DSP 核和多個(gè)DMA 都可以訪問所有的存儲(chǔ)器。
每個(gè)DSP 核每個(gè)時(shí)鐘周期都可以執(zhí)行最多128 bits 的load 或store 操作。在1GHz 的時(shí)鐘頻率下,DSP 核訪問L1D SRAM 的帶寬可以達(dá)到16GB/S。
DSP 的內(nèi)部總線交換網(wǎng)絡(luò),TeraNet,提供了 C66x 核(包括其本地存儲(chǔ)器),外部存儲(chǔ)器, EDMA 控制器,和片上外設(shè)之間的互連總共有 10 個(gè) EDMA 傳輸控制器可以被配置起來同時(shí)執(zhí)行任意存儲(chǔ)器之間的數(shù)據(jù)傳輸。
本文為設(shè)計(jì)人員提供存儲(chǔ)器訪問性能評估的基本信息;提供各種操作條件下的性能測試數(shù)據(jù);還探討了影響存儲(chǔ)器訪問性能的一些因素。
1. 存儲(chǔ)器系統(tǒng)簡介
TMS320C6678 有8 個(gè)C66x 核,每個(gè)核有:
· 32KB L1D (Level 1 Data) SRAM,它和DSP 核運(yùn)行在相同的速度上,可以被用作普通的數(shù)據(jù)存儲(chǔ)器或數(shù)據(jù)cache。
· 32KB L1P (Level 1 Program) SRAM,它和DSP 核運(yùn)行在相同的速度上,可以被用作普通的程序存儲(chǔ)器或程序cache。
· 512KB LL2 (Local Level 2) SRAM,它的運(yùn)行速度是DSP 核的一半,可以被用作普通存儲(chǔ)器或cache,既可以存放數(shù)據(jù)也可以存放程序。
所有DSP 核共享4MB SL2 (Shared Level 2) SRAM,它的運(yùn)行速度是DSP 核的一半,既可以存放數(shù)據(jù)也可以存放程序。
TMS320C6678 集成一個(gè)64-bit 1333MTS DDR3 SDRAM 接口,可以支持8GB 外部擴(kuò)展存儲(chǔ)器,既可以存放數(shù)據(jù)也可以存放程序。它的總線寬度也可以被配置成32 bits 或16 bits。
存儲(chǔ)器訪問性能對 DSP 上軟件運(yùn)行的效率是非常關(guān)鍵的。在 C6678 DSP 上,所有的主模塊,包括多個(gè)DSP 核和多個(gè)DMA 都可以訪問所有的存儲(chǔ)器。
每個(gè)DSP 核每個(gè)時(shí)鐘周期都可以執(zhí)行最多128 bits 的load 或store 操作。在1GHz 的時(shí)鐘頻率下,DSP 核訪問 L1D SRAM 的帶寬可以達(dá)到 16GB/S。當(dāng)訪問二級(L2)存儲(chǔ)器或外部存儲(chǔ)器時(shí),訪問性能主要取決于訪問的方式和cache。
每個(gè) DSP 核有一個(gè)內(nèi)部 DMA (IDMA),在 1GHz 的時(shí)鐘頻率下,它能支持高達(dá) 8GB/秒的傳輸。但I(xiàn)DMA 只能訪問L1 和LL2 以及配置寄存器,它不能訪問外部存儲(chǔ)器。
DSP 的內(nèi)部總線交換網(wǎng)絡(luò),TeraNet,提供了 C66x 核 (包括其本地存儲(chǔ)器) ,外部存儲(chǔ)器, EDMA 控制器,和片上外設(shè)之間的互聯(lián)??偣灿? 10 個(gè) EDMA 傳輸控制器可以被配置起來同時(shí)執(zhí)行任意存儲(chǔ)器之間的數(shù)據(jù)傳輸。芯片內(nèi)部有兩個(gè)主要的 TeraNet 模塊,一個(gè)用 128 bit 總線連接每個(gè)端點(diǎn),速度是DSP 核頻率的1/3,理論上,在1GHz 的器件上每個(gè)端口支持 5.333GB/秒的帶寬;另一個(gè) TeraNet 內(nèi)部總線交換網(wǎng)絡(luò)用 256 bit 總線連接每個(gè)端點(diǎn),速度是DSP 核頻率的1/2,理論上,在1GHz 的器件上每個(gè)端口支持16GB/秒的帶寬。
總共有10 個(gè)EDMA 傳輸控制器可以被配置起來同時(shí)執(zhí)行任意存儲(chǔ)器之間的數(shù)據(jù)傳輸。它們中的兩個(gè)連接到256-bit, 1/2 DSP 核速度的 TeraNet 內(nèi)部總線交換網(wǎng)絡(luò);另外8 個(gè)連接到128-bit, 1/3 DSP 核速度的 TeraNet 內(nèi)部總線交換網(wǎng)絡(luò)。
圖1 展示了TMS320C6678 的存儲(chǔ)器系統(tǒng)??偩€上的數(shù)字代表它的寬度。大部分模塊運(yùn)行速度是DSP 核時(shí)鐘的1/n,DDR 的典型速度是1333MTS(Million Transfer per Second)。
圖1 TMS320C6678 存儲(chǔ)器系統(tǒng)
本文為設(shè)計(jì)人員提供存儲(chǔ)器訪問性能評估的基本信息;提供各種操作條件下的性能測試數(shù)據(jù);還探討了影響存儲(chǔ)器訪問性能的一些因素。
本文對分析以下常見問題會(huì)有所幫助:
1. 應(yīng)該用DSP 核還是DMA 來拷貝數(shù)據(jù)?
2. 一個(gè)頻繁訪問存儲(chǔ)器的函數(shù)會(huì)消耗多少時(shí)鐘周期?
3. 當(dāng)多個(gè)主模塊共享存儲(chǔ)器時(shí),對某個(gè)模塊的性能會(huì)有多大的影響?
本文中的大部分?jǐn)?shù)據(jù)是在C6678 EVM (EValuation Module)板上測試得到的,它上面有64-bit 1333MTS 的DDR 存儲(chǔ)器。
2. DSP 核,EDMA3,IDMA 拷貝數(shù)據(jù)的性能比較
數(shù)據(jù)拷貝的帶寬由下面三個(gè)因素中最差的一個(gè)決定:
1. 總線帶寬
2. 源端吞吐量
3. 目的端吞吐量
表1 總結(jié)了C6678 上C66x 核,IDMA 和EDMA 的理論帶寬。
表1 1GHz C6678 上C66x 核,IDMA 和EDMA 的理論帶寬
表2 總結(jié)了C6678 EVM(64-bit 1333MTS DDR)上各種存儲(chǔ)器端口的理論帶寬。
表2 1GHz C6678 上各種存儲(chǔ)器端口的理論帶寬
表3 列出了在1GHz C6678 EVM( 64-bit 1333MTS DDR)上,在不同情況下用EDMA,IDMA 和DSP 核做大塊連續(xù)數(shù)據(jù)拷貝測得的吞吐量。
在這些測試中,L1 上的測試數(shù)據(jù)塊的大小是8KB;IDMA LL2->LL2 拷貝的數(shù)據(jù)塊的大小是32KB;其它DSP 核拷貝測試的數(shù)據(jù)塊的大小是64KB,其它EDMA 拷貝測試的數(shù)據(jù)塊大小是128KB。
吞吐量由拷貝的數(shù)據(jù)量除以消耗的時(shí)間得到。
表3 DSP 核,EDMA 和IDMA 數(shù)據(jù)拷貝的吞吐量比較
總的來說,DSP 核可以高效地訪問內(nèi)部存儲(chǔ)器,而用DSP 核訪問外部存儲(chǔ)器則不是有效利用資源的方式;IDMA 非常適用于DSP 核本地存儲(chǔ)器 (L1D,L1P,LL2) 內(nèi)連續(xù)數(shù)據(jù)塊的傳輸,但它不能訪問共享存儲(chǔ)器 (SL2, DDR) ;而外部存儲(chǔ)器的訪問則應(yīng)盡量使用EDMA。
Cache 配置顯著地影響DSP 核的訪問性能,Prefetch buffer 也能提高讀訪問的效率,但它們不影響EDMA 和IDMA。這里所有DSP 核的測試都是基于cold cache(cache 和Prefetch buffer 在測試前被清空)。
對DSP 核,SL2 可以通過從0x0C000000 開始的缺省地址空間被訪問,通常這個(gè)地址空間被設(shè)置為cacheable 而且prefetchable。SL2 可以通過XMC (eXtended Memory Controller) 被重映射到其它存儲(chǔ)器空間,通常重映射空間被用作non-cacheable, nonprefetchable 訪問(當(dāng)然它也可以被設(shè)置為cacheable 而且prefetchable)。通過缺省地址空間訪問比通過重映射空間訪問稍微快一點(diǎn)。
前面列出的EDMA 吞吐量數(shù)據(jù)是在EDMA CC0 (Channel Controller 0) TC0 (Transfer Controller 0)上測得的,EDMA CC1 和EDMA CC2 的吞吐量比EDMA CC0 低一些,后面有專門的章節(jié)來比較10 個(gè)EDMA 傳輸控制器的差別。
3. DSP 核訪問存儲(chǔ)器的時(shí)延
L1 和 DSP 核的速度相同,所以DSP 核每個(gè)時(shí)鐘周期可以訪問L1 存儲(chǔ)器一次。對一些特殊應(yīng)用,需要非??斓脑L問小塊數(shù)據(jù),可以把L1 的一部分配置成普通RAM(而不是cache)來存放數(shù)據(jù)。
通常,L1 被全部配置成cache,如果cache 訪問命中(hit),DSP 核可在一個(gè)周期完成訪問;如果cache 訪問沒有命中(miss),DSP 核需要等待數(shù)據(jù)從下一級存儲(chǔ)器中被讀到cache 中。
本節(jié)討論DSP 核訪問內(nèi)部存儲(chǔ)器和外部DDR 存儲(chǔ)器的時(shí)延。下面是時(shí)延測試的偽代碼:
3.1 DSP 核訪問LL2 的時(shí)延
圖2 是在1GHz C6678 EVM 上測得的DSP 核訪問LL2 的時(shí)延。DSP 核執(zhí)行512 個(gè)連續(xù)的LDDW (LoaD Double Word) 或STDW (STore Double Word) 指令所花的時(shí)間被測量,平均下來每個(gè)操作所花的時(shí)間被畫在圖中。這個(gè)測試使用了32KB L1D cache。
圖2 DSP 核訪問LL2
對LDB/STB 和LDW/STW 的測試表明,它們的時(shí)延與LDDW/STDW 相同。
由于L1D cache 只有在讀操作時(shí)才會(huì)被分配,DSP 核讀LL2 總是通過L1D cache。所以,DSP核訪問LL2 的性能高度依賴cache。多個(gè)訪問之間的地址偏移(stride)顯著地影響訪問效率,地址連續(xù)的訪問可以充分地利用cache;大于或等于64 字節(jié)的地址偏移導(dǎo)致每次訪問都miss L1 cache 因?yàn)長1D cache 行大小是64 bytes。
由于L1D cache 不會(huì)在寫操作時(shí)被分配,并且這里的測試之前cache 都被清空了,所以任何對LL2 的寫操作都通過L1D write buffer (4x16bytes)。對多個(gè)寫操作,如果地址偏移小于16 bytes,這些操作可能在write buffer 中被合并成一個(gè)對LL2 的寫操作,從而獲得接近平均每個(gè)寫操作用1 個(gè)時(shí)鐘周期的效率。
當(dāng)多個(gè)寫操作之間的偏移是128 bytes 整數(shù)倍時(shí),每個(gè)寫操作都訪問LL2 的相同sub-bank (LL2包含兩個(gè)banks,每個(gè)bank 包含4 個(gè)總線寬度為16-byte 的sub-bank),對相同sub-bank 的連續(xù)訪問的時(shí)延是4 個(gè)時(shí)鐘周期。對其它的訪問偏移量,連續(xù)的寫操作會(huì)訪問LL2 不同的bank,這樣的多個(gè)訪問的在流水線上可以被重疊起來,從而使平均的訪問時(shí)延比較小。
C66x 核在C64x+核的基礎(chǔ)上有很多改進(jìn),C66x 核的L2 存儲(chǔ)器控制器和DSP 核速度相同,而 C64x+的L2 存儲(chǔ)器控制器的運(yùn)行速度是DSP 核速度的1/2。圖3 比較了C66x 和C64x+ Load/Store LL2 存儲(chǔ)器的性能。
圖3 C66x 和C64x+核在LL2 上Load/Store 的時(shí)延比較
3.2 DSP 核訪問SL2 的時(shí)延
圖4 是在1GHz C6678 EVM 上測得的DSP 核訪問SL2 的時(shí)延。DSP 核執(zhí)行512 個(gè)連續(xù)的LDDW (LoaD Double Word) 或STDW (STore Double Word) 指令所花的時(shí)間被測量,平均下來每個(gè)操作所花的時(shí)間被畫在圖中。測試中,L1D 被配置成32KB cache。
圖4 DSP 核訪問SL2
對LDB/STB 和LDW/STW 的測試表明,它們的時(shí)延與LDDW/STDW 相同。
DSP 核讀SL2 通常會(huì)通過L1D cache,所以,和訪問LL2 一樣,DSP 核訪問SL2 的性能高度依賴cache。
XMC 中還有一個(gè)prefetch buffer (8x128bytes) ,它可以被看作是一個(gè)額外的只對讀操作可用的cache。DSP 核之外的每16-MB 存儲(chǔ)器塊都可以通過MAR (Memory Attribute Register) 的PFX (PreFetchable eXternally) bit 被配置為是否通過prefetch buffer 讀,使能它會(huì)對多個(gè)主模塊共享存儲(chǔ)器的效率有很大幫助;它也能顯著地改善對SL2 連續(xù)讀的性能。不過,prefetch buffer 對寫操作沒有任何作用。
SL2 可以通過從0x0C000000 開始的缺省的地址空間訪問,這個(gè)空間總是cacheable,通常它也被配置為prefetchable。SL2 可以通過XMC 的配置被重映射到其它地址空間,通常重映射空間被用作non-cacheable, nonprefetchable 訪問(當(dāng)然它也可以被設(shè)置為cacheable 而且prefetchable)。通過缺省地址空間訪問比通過重映射空間訪問稍微快一點(diǎn),因?yàn)榈刂分赜成湫枰粋€(gè)額外的時(shí)鐘周期。
由于L1D cache 不會(huì)在寫操作時(shí)被分配,并且這里的測試之前cache 都被清空了,所以任何對SL2 的寫操作都通過L1D write buffer (4x16bytes)。對多個(gè)寫操作,如果地址偏移小于16 bytes,這些操作可能在write buffer 中被合并成一個(gè)對SL2 的寫操作,從而獲得比較高的效率。XMC也有類似的寫合并buffer,它可以合并兩個(gè)在32 bytes 內(nèi)的寫操作,所以,對偏移小于32 bytes 的寫操作,XMC 的寫buffer 改善了寫操作的性能。
當(dāng)寫偏移是N*256 bytes 時(shí),每個(gè)寫操作總是訪問SL2 相同的bank (SL2 存儲(chǔ)器組織結(jié)構(gòu)是4 bank x 2 sub-bank x 32 bytes),對相同bank 的連續(xù)訪問間隔是4 個(gè)時(shí)鐘周期。對其它的訪問偏移量,連續(xù)的寫操作會(huì)訪問SL2 不同的bank,這樣的多個(gè)訪問的在流水線上可以被重疊起來,從而使平均的訪問時(shí)延比較小。
圖5 比較了DSP 核訪問SL2 和LL2 的訪問時(shí)延。對地址偏移小于16 bytes 的連續(xù)訪問,訪問SL2 的性能和LL2 幾乎相同。而對地址偏移比較大的連續(xù)訪問,訪問SL2 的性能比LL2 差。因此,SL2 最適合于存放代碼。
圖5 DSP 核訪問SL2 和LL2 的性能比較
3.3 DSP 核訪問外部DDR 存儲(chǔ)器的時(shí)延
DSP 核訪問外部DDR 存儲(chǔ)器高度依賴cache。當(dāng)DSP 核訪問外部存儲(chǔ)器時(shí),一個(gè)傳輸請求會(huì)被發(fā)給XMC。根據(jù)cacheable 和prefetchable 的設(shè)置,傳輸請求可能是下列情況中的一種:
· 一個(gè)數(shù)據(jù)單元 – 如果存儲(chǔ)器空間是non-cacheable,nonprefetchable
· 一個(gè)L1 cache line - 如果存儲(chǔ)器空間是cacheable 而沒有L2 cache,
· 一個(gè)L2 cache line - 如果存儲(chǔ)器空間是cacheable 并且設(shè)置了L2 cache。
如果要訪問的數(shù)據(jù)在L1/L2 cache 或prefetch buffer 中,則不會(huì)有傳輸請求發(fā)出。
如果被訪問的空間是prefetchable 的,可能還會(huì)產(chǎn)生額外的prefetch 請求。
外部存儲(chǔ)器的內(nèi)容可以被緩存在L1 cache 或/和L2 cache,或者都不用。DSP 核之外的每16-MB存儲(chǔ)器塊都可以通過MAR (Memory Attribute Register)的PC (Permit Copy) bit 被配置為是否通過cache 訪問。如果PC 比特為0,這段空間就不是cacheable 的。如果PC 比特是1 而L2 cache 大小為0 (所有LL2 都被用作普通SRAM),那外部存儲(chǔ)器的內(nèi)容只會(huì)被L1 cache 緩存。如果PC比特是1 并且L2 cache 大于0,則外部存儲(chǔ)器的內(nèi)容可以被L1 和L2 cache 同時(shí)緩存。
像訪問SL2 一樣,對外部存儲(chǔ)器的讀操作也可以利用XMC 里的prefetch buffer。它可以通過MAR (Memory Attribute Register)的PFX (PreFetchable eXternally) bit 來配置。
多個(gè)訪問之間的地址偏移(stride)顯著地影響訪問效率,地址連續(xù)的訪問可以充分地利用cache 和prefetch buffer;大于或等于64 字節(jié)的地址偏移導(dǎo)致每次訪問都miss L1 cache 因?yàn)長1D cache行大小是64 bytes;大于或等于128 字節(jié)的地址偏移導(dǎo)致每次訪問都miss L2 cache 因?yàn)長2 cache 行大小是128 bytes。
如果發(fā)生cache miss,DSP 需要等待外部數(shù)據(jù)傳輸完成。等待的時(shí)間是請求發(fā)出時(shí)間,數(shù)據(jù)傳輸時(shí)間或數(shù)據(jù)返回時(shí)間的總和。
圖6 是在1GHz C6678 EVM(64-bit 1333MTS DDR)上測得的DSP 核訪問DDR 的時(shí)延。DSP核執(zhí)行512 個(gè)連續(xù)的LDDW (LoaD Double Word) 或STDW (STore Double Word) 指令所花的時(shí)間被測量,平均下來每個(gè)操作所花的時(shí)間被畫在圖中。測試中,L1D 被配置成32KB cache,LL2的256KB 被設(shè)置為cache。
對LDB/STB 和LDW/STW 的測試表明,它們的時(shí)延與LDDW/STDW 相同。
注意,下面第二和第三個(gè)圖實(shí)際上是第一個(gè)圖左邊的放大。
圖6 DSP 核對DDR Load/Store 的時(shí)延
對地址偏移小于128 bytes 的訪問,性能主要受cache 的影響。
L2 cache 會(huì)在寫操作時(shí)被分配,對任何寫操作,cache 控制器總是先把被訪問的數(shù)據(jù)所在的cache 行(128 bytes)讀進(jìn)L2 cache,然后在cache 中改寫數(shù)據(jù)。被改寫是數(shù)據(jù)會(huì)在發(fā)生cache沖突或手工cache 回寫操作時(shí)被最終寫到外部存儲(chǔ)里。當(dāng)寫操作的地址偏移是1024 bytes 的整數(shù)倍時(shí),多個(gè)訪問在L2 cache 中發(fā)生沖突的概率很大,所以L2 cacheable 寫操作的時(shí)延會(huì)顯著地增加。最壞的情況下,每個(gè)寫操作都會(huì)導(dǎo)致一個(gè)cache 行的回寫 (之前的數(shù)據(jù)因?yàn)闆_突而被替換/回寫)和一個(gè)cache 行的讀入(新的數(shù)據(jù)被分配到cache 中)。
當(dāng)?shù)刂菲拼笥?12 bytes 時(shí),DDR 頁(行)切換開銷成為性能下降的主要因素。C6678 EVM上的DDR 頁(行)大小或bank 寬度是8KB,而DDR3 存儲(chǔ)器包含8 個(gè)banks。最壞的情況是,當(dāng)訪問地址偏移量是64KB 時(shí),每個(gè)讀或?qū)懖僮鞫紩?huì)訪問相同bank 中一個(gè)新的行,而這種行切換會(huì)增加大約40 個(gè)時(shí)鐘周期的時(shí)延。請注意,不同的DDR 存儲(chǔ)器的時(shí)延可能會(huì)不一樣。
評論