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