摘要 TMS320C6678 有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ù)也可以存放程序。它的總線寬度也可以被配置成32bits或16bits。 存儲(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ě)操作,如果地址偏移小于16bytes,這些操作可能在write buffer中被合并成一個(gè)對(duì)LL2的寫(xiě)操作,從而獲得接近平均每個(gè)寫(xiě)操作用1個(gè)時(shí)鐘周期的效率。 當(dāng)多個(gè)寫(xiě)操作之間的偏移是128bytes整數(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ě)操作,如果地址偏移小于16bytes,這些操作可能在write buffer中被合并成一個(gè)對(duì)SL2的寫(xiě)操作,從而獲得比較高的效率。XMC也有類(lèi)似的寫(xiě)合并buffer,它可以合并兩個(gè)在32 bytes內(nèi)的寫(xiě)操作,所以,對(duì)偏移小于32bytes的寫(xiě)操作,XMC的寫(xiě)buffer改善了寫(xiě)操作的性能。 當(dāng)寫(xiě)偏移是N*256 bytes時(shí),每個(gè)寫(xiě)操作總是訪問(wèn)SL2相同的bank(SL2存儲(chǔ)器組織結(jié)構(gòu)是4 bankx2sub-bankx 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ì)地址偏移小于16bytes的連續(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ù)刂菲拼笥?12bytes時(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ì)不一樣。 |