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