本書系統(tǒng)介紹了C66x多核軟件開發(fā)的知識,并基于C6678的設計實例介紹了相關設計經(jīng)驗。系統(tǒng)介紹了C66x DSP器件的基礎概念和多核軟件設計的基礎知識,引領讀者循序漸進地掌握多核軟件設計技術。對于傳統(tǒng)DSP開發(fā)人員比較陌生的一些概念,如Cache、預取、數(shù)據(jù)一致性、數(shù)據(jù)依賴、死鎖等,進行了重點描述。系統(tǒng)介紹了C66x多核器件的存儲器、DMA傳輸、中斷等內(nèi)容,并結合工作實際,介紹了多核軟件優(yōu)化、多核并行設計及任務級優(yōu)化經(jīng)驗。后,以多普勒成像的設計實例描述了如何實現(xiàn)并行設計。 全書共11章,內(nèi)容包括C66x DSP的基本組成,如存儲器組織、DMA傳輸、中斷和異常、Cache緩存和數(shù)據(jù)一致性等,并包含CCS軟件開發(fā)環(huán)境、SYS/BIOS實時操作系統(tǒng)、多核并行設計、軟件設計優(yōu)化等相關知識。 本書的特點是由淺入深、概念齊全、實踐性強、指導性強。本書結合了多年多核軟件開發(fā)的實際經(jīng)驗,對多核設計中常見的問題進行了詳細的描述; 從基本概念出發(fā),層層推進,介紹了多核并行、數(shù)據(jù)傳輸與處理并行和多層次并行設計的經(jīng)驗。 對于從事C66x多核軟件開發(fā)的設計師,本書具有很強的指導意義,本書還適合作為高校計算機、數(shù)據(jù)處理、信號處理、通信等相關專業(yè)的本科和研究生教材。
1.本書由淺入深、概念齊全、實踐性強、指導性強,結合了多年多核軟件開發(fā)的實際經(jīng)驗,對多核設計中常見的問題進行了詳細的描述。 2.本書從基本概念出發(fā),層層推進,介紹了多核并行、數(shù)據(jù)傳輸與處理并行和多層次并行設計的經(jīng)驗,是多核DSP并行軟件開發(fā)者必備的參考書。
目錄
第1章TI多核C66x DSP介紹
1.1C6678處理器
1.1.1C6678概覽
1.1.2外圍設備
1.266AK處理器
1.366AK2H14/12/06和C6678各項功能對比
1.4C66x處理器內(nèi)核
1.5電源休眠控制器
1.5.1C66x內(nèi)核電源休眠管理介紹
1.5.2電源休眠管理特征
1.6鎖相環(huán)及其設置
1.6.1主PLL和PLL控制器
1.6.2DDR3 PLL
1.6.3PASS PLL
1.7C6678處理器接口通信相關外圍設備
1.7.1I2C外圍設備
1.7.2SPI 外圍設備
1.7.3HyperLink 外圍設備
1.7.4UART 外圍設備
1.7.5PCIE 外圍設備
1.7.6TSIP 外圍設備
1.7.7包加速器
1.7.8EMIF16外圍設備
1.7.9安全加速器
1.7.10Gigabit Ethernet開關子系統(tǒng)
1.7.11管理數(shù)據(jù)輸入輸出
1.7.12串行RapidIO端口
1.7.13通用目的輸入輸出
1.8定時器
1.9信號量
1.10多核導航器
1.11設計建議
1.11.1初始化
1.11.2接口驅動程序
1.11.3時間戳的獲取
1.11.4EVM板的使用
第2章C66x存儲器組織
2.1C66x存儲控制器
2.1.1L1P存儲控制器
2.1.2L1D存儲控制器
2.1.3L2存儲控制器
2.1.4外部存儲控制器
2.1.5擴展存儲控制器
2.2多核共享存儲控制器
2.2.1概覽
2.2.2C66x內(nèi)核從接口
2.2.3系統(tǒng)從接口
2.2.4系統(tǒng)主接口
2.2.5外部存儲器主接口
2.2.6MSMC存儲器
2.3擴展存儲控制器XMC
2.3.1存儲器映射寄存器概要
2.3.2XMC 存儲器保護和地址擴展
2.3.3存儲器保護和地址擴展過程
2.3.4地址擴展
2.3.5XMC存儲器保護結構支持
2.3.6預取緩沖
2.4存儲器保護架構
2.4.1存儲器保護的目的
2.4.2特權級別
2.4.3存儲器保護架構
2.5帶寬管理
2.5.1介紹
2.5.2帶寬管理架構
2.5.3帶寬管理寄存器
2.6設計建議
2.6.1合理規(guī)劃使用存儲器
2.6.2存儲器設置成不被Cache緩存和預取
第3章Cache緩存和數(shù)據(jù)一致性
3.1為什么使用Cache
3.2C64x和C66x DSP之間的Cache區(qū)別
3.3Cache 存儲器結構概覽
3.4Cache基礎知識
3.4.1直接映射Cache——L1P Cache
3.4.2Cache缺失的類型
3.4.3組相聯(lián) Cache
3.4.4二級Cache
3.5L1P Cache
3.5.1L1P存儲器和Cache
3.5.2L1P Cache結構
3.5.3L1P凍結模式
3.5.4程序啟動的一致性操作
3.6L1D Cache
3.6.1L1D存儲器和Cache
3.6.2L1D Cache結構
3.6.3L1D 凍結模式
3.6.4程序發(fā)起的Cache一致性操作
3.7L2 Cache
3.7.1L2存儲器和Cache
3.7.2L2 Cache結構
3.7.3L2 凍結模式
3.7.4程序發(fā)起的Cache一致性操作
3.7.5Cache能力控制
3.8使用Cache
3.8.1配置L1 Cache
3.8.2配置L2 Cache
3.9數(shù)據(jù)一致性
3.9.1Snoop 一致性協(xié)議
3.9.2在外部存儲器和Cache之間維持一致性
3.9.3對L2 Cache一致性操作使用指導
3.9.4對L1 Cache一致性操作使用指導
3.10片上Debug支持
3.11在運行中改變Cache配置
3.11.1禁用外部存儲器Cache功能
3.11.2在運行中改變 Cache尺寸
3.12優(yōu)化Cache性能
3.12.1Cache 性能特征
3.12.2阻塞情況
3.12.3優(yōu)化技術概覽
3.12.4應用級優(yōu)化
3.12.5過程級優(yōu)化
3.12.6C66x DSP Cache一致性操作小結
3.13設計建議
3.13.1消除虛假地址
3.13.2數(shù)據(jù)一致性問題
第4章DMA傳輸
4.1IDMA
4.1.1IDMA 結構
4.1.2IDMA通道 0
4.1.3IDMA 通道1
4.2EDMA3 控制器
4.2.1EDMA3 控制器介紹
4.2.2EDMA3 器件特定的信息
4.2.3EDMA3 通道控制器配置
4.2.4EDMA3 傳輸控制器配置
4.2.5EDMA3 通道同步事件
4.2.6EDMA3 通道控制器
4.2.7EDMA3 傳輸控制器
4.3EDMA3傳輸類型
4.3.1A同步傳輸
4.3.2AB同步傳輸
4.4參數(shù)RAM
4.4.1PaRAM參數(shù)集
4.4.2Dummy 與Null傳輸比較
4.4.3參數(shù)集更新
4.4.4連接傳輸
4.4.5常數(shù)地址模式傳輸/對齊問題
4.4.6單元大小
4.5發(fā)起一個 DMA傳輸
4.5.1DMA 通道
4.5.2QDMA 通道
4.5.3完成一個DMA傳輸
4.6提升DMA性能的幾點建議
4.6.1盡量用較大的ACNT
4.6.2線性傳輸
4.6.3地址對齊
4.6.4恰當使用多個CC和TC傳輸
第5章中斷和異常
5.1C6678處理器中斷簡介
5.2芯片中斷控制器
5.3C66x 內(nèi)核中斷控制器概述
5.3.1特征
5.3.2功能塊圖
5.4中斷控制器結構
5.4.1事件寄存器
5.4.2事件合并器
5.4.3中斷選擇器
5.4.4異常合并器
5.5C66x 內(nèi)核事件
5.6中斷控制器與DSP交互
5.6.1DSP 中斷控制器接口
5.6.2DSP 服務中斷事件
5.7中斷設計建議
5.7.1不要過多使用中斷或中斷嵌套
5.7.2中斷服務程序中代碼不宜過長
5.7.3中斷服務程序改變的全局變量要加上volatile標志
第6章如何使用CCS
6.1常用界面
6.1.1Project Explorer
6.1.2程序窗口
6.1.3目標配置窗口
6.1.4Debug 窗口
6.1.5Memory 窗口
6.1.6Expressions窗口
6.1.7Breakpoints窗口
6.1.8Problems窗口
6.1.9Console窗口
6.2新建工程
6.3新建一個目標配置文件
6.3.1新建ccxml文件
6.3.2設置仿真器
6.3.3添加器件
6.4常用操作
6.4.1Launch
6.4.2Group
6.4.3Connect
6.4.4加載程序
6.4.5設置斷點調(diào)試程序
6.4.6復位
6.5常見問題
6.5.1頭文件找不到
6.5.2EVM板未初始化,調(diào)試找不到DDR3
6.5.3選中不了仿真器
6.5.4加斷點調(diào)試錯誤
6.5.5域選擇不正確
6.5.6仿真器連接中斷電
6.6設置字體和代碼風格
6.6.1修改字體
6.6.2代碼風格設置
6.7MCSDK
6.7.1MCSDK架構
6.7.2MCSDK 特點
6.8TI函數(shù)庫調(diào)用
6.8.1格式選擇
6.8.2庫的調(diào)用
6.8.3庫的使用
6.9理解CMD文件
6.9.1CMD文件簡介
6.9.2MEMORY命令
6.9.3SECTIONS命令
第7章SYS/BIOS實時操作系統(tǒng)
7.1什么是SYS/BIOS
7.1.1SYS/BIOS的優(yōu)勢
7.1.2SYS/BIOS和XDC TOOL的關系
7.2SYS/BIOS包
7.3SYS/BIOS中使用C
7.3.1存儲器管理
7.3.2Name Mangling
7.3.3從配置調(diào)用對象方法
7.3.4類構造器和析構器
7.4SYS/BIOS配置和編譯
7.4.1在工程中添加SYS/BIOS支持
7.4.2創(chuàng)建一個獨立的配置工程
7.4.3配置SYS/BIOS 應用
7.4.4用XGCONF打開一個配置文件
7.4.5用XGCONF執(zhí)行任務
7.4.6保存配置
7.4.7關于XCONFG視圖
7.4.8使用可用產(chǎn)品視圖
7.4.9使用概要視圖
7.4.10使用屬性視圖
7.4.11使用問題視圖
7.4.12找到并修正錯誤
7.5編譯一個SYS/BIOS應用
7.5.1了解編譯流程
7.5.2編譯和連接優(yōu)化
7.6線程模塊
7.6.1SYS/BIOS 啟動順序
7.6.2線程模塊的概覽
7.6.3線程類型
7.6.4線程優(yōu)先級
7.6.5讓步和搶占
7.6.6鉤子
7.7硬件中斷
7.7.1創(chuàng)建中斷
7.7.2硬件中斷嵌套和系統(tǒng)堆棧大小
7.7.3硬件鉤子
7.8軟件中斷
7.8.1創(chuàng)建軟件中斷對象
7.8.2設置軟件中斷優(yōu)先級
7.8.3軟件中斷優(yōu)先級和系統(tǒng)堆棧大小
7.8.4軟件中斷執(zhí)行
7.8.5優(yōu)點和折中
7.8.6軟件中斷函數(shù)同步
7.8.7軟件鉤子
7.9任務
7.9.1創(chuàng)建任務
7.9.2任務執(zhí)行狀態(tài)和調(diào)度
7.9.3任務堆棧
7.9.4測試堆棧溢出
7.9.5任務鉤子
7.9.6空閑循環(huán)
7.10SYS/BIOS同步模塊
7.10.1信號量
7.10.2事件模塊
7.10.3門模塊
7.10.4郵箱
7.10.5隊列
7.11定時服務
7.12Memory
7.12.1新建一個Platform
7.12.2棧
7.12.3Cache配置
7.12.4Cache Runtime API
7.12.5動態(tài)存儲器分配
7.12.6Heap的實施
7.13硬件抽象層
7.14典型設計實例和建議
7.14.1典型設計
7.14.2設計建議
第8章多核并行設計
8.1并行粒度和并行級別
8.2并行方式
8.3任務類型
8.3.1相同任務的多個副本
8.3.2多個獨立任務
8.3.3單個任務拆分成多個子任務
8.3.4多個松散耦合任務
8.3.5耦合度高的任務
8.4依賴關系
8.4.1數(shù)據(jù)依賴
8.4.2存儲器依賴
8.5死鎖和活鎖
8.5.1死鎖
8.5.2活鎖
8.6同步
第3章Cache緩存和數(shù)據(jù)一致性
與其他處理器一樣,基于C66x內(nèi)核的處理器也存在內(nèi)核處理能力與存儲器容量不匹配的問題。越靠近內(nèi)核,存儲器的通信帶寬要求越高,但容量也就越小; 越遠離內(nèi)核,處理器容量越大,但帶寬也就越小。C66x處理器內(nèi)核使用寄存器,其用到的存儲器從內(nèi)到外依次是L1(L1P和L1D)、L2 SRAM、MSM SRAM(L3)、DDR3。如前所述,L1和L2位于C66x內(nèi)核中,L3位于處理器中(C66x內(nèi)核外面),DDR3位于處理器外。為了緩解處理器內(nèi)核和外部存儲器的矛盾,采用了Cache機制來實現(xiàn)外部數(shù)據(jù)在靠近處理器內(nèi)核的存儲器中保留一份拷貝,處理器內(nèi)核經(jīng)常與該數(shù)據(jù)拷貝交互數(shù)據(jù),而不是直接和外部存儲器交互數(shù)據(jù)。本章首先介紹了為什么使用Cache、Cache存儲器結構概覽、Cache基礎知識,然后對C66x的各個Cache進行了詳細介紹,并介紹了使用Cache、數(shù)據(jù)一致性、片上Debug支持和運行中改變Cache配置等內(nèi)容,介紹了如何優(yōu)化Cache性能和一些設計建議。3.1為什么使用Cache從DSP應用的角度,擁有一個大容量、快速的片上存儲器是非常重要的。然而,處理器性能的提升比存儲器發(fā)展的步伐更快,導致在內(nèi)核與存儲器速度間出現(xiàn)了一個性能缺口。越靠近內(nèi)核內(nèi)存速度越快,但容量也就越小。Cache的機制是基于位置原理設計的,在講述Cache機制前先介紹一下位置原理。所謂位置原理,即假設如果一個存儲器位置被引用,則其相同或相鄰位置非常可能會很快又被引用。在一段時間內(nèi)訪問存儲器的位置被指為時間位置,涉及相鄰存儲器的位置被指為空間位置。通過利用存儲器訪問位置原理,Cache緩存減少平均存儲器訪問時間。基于位置原理,在一小段時間內(nèi),通常一個程序從相同或相鄰存儲器位置重用數(shù)據(jù)。如果數(shù)據(jù)從一個慢速存儲器映射到一個快速Cache存儲器,在另一組數(shù)據(jù)替代前,盡可能經(jīng)常訪問Cache中的數(shù)據(jù)以提高數(shù)據(jù)訪問效率。3.2C64x和C66x DSP之間的Cache區(qū)別對于使用過C64x內(nèi)核的程序員來說,C66x內(nèi)核Cache的概念與C64x內(nèi)核中的相似,但也有很大不同。本節(jié)介紹C66x內(nèi)核與C64x內(nèi)核之間的Cache區(qū)別,主要有以下幾點。1. 存儲器尺寸和類型對于C66x器件,每個L1D和L1P在Cache之外實現(xiàn)SRAM。Cache的尺寸是用戶配置的,可以被設置成4KB、8KB、16KB或32KB。可用的SRAM數(shù)量是器件相關的,并在器件特性數(shù)據(jù)手冊中明確。而對于C64x器件,Cache被設計成尺寸為固定的16KB。C66x器件相對于C64x器件,L2的尺寸增加了。2. 寫緩沖對于C66x器件,寫緩沖的寬度增加到128位; 對于C64x器件,寬度是64位。3. Cache能力對于C66x器件,外部存儲地址的Cache能力設置(通過MAR位)只影響L1D和L2 Cache緩存; 也就是說,到外部存儲器地址的程序取指令(program fetch)總是被Cache緩存進來。不管Cache能力設置狀況。這和C64x器件上的情況不一樣,在C64x器件上Cache能力設置影響所有Cache,即L1P、L1D和L2。對于C66x器件,外部存儲地址的Cache能力控制覆蓋整個外部地址空間。對于C64x器件,外部存儲地址的Cache能力控制只覆蓋地址空間的一個子集。4. Snooping協(xié)議在C66x器件上的Snooping Cache一致性協(xié)議直接發(fā)送數(shù)據(jù)到L1D Cache和DMA。C64x器件通過invalid和writeback Cache Line來維持一致性。由于減少了由invalidate導致的Cache缺失開支,C66x Snooping機制更加有效。與C64x器件一樣,Snoop協(xié)議在C66x器件中不維護L1P Cache和L2 SRAM之間的一致性,程序員負責維護其一致性。5. Cache一致性操作對于C66x器件,L2 Cache一致性操作總是操作在L1P和L1D,即使L2 Cache功能被禁用。這與C64x器件情況不同,其需要明確調(diào)用L1一致性操作。C66x器件支持一整套的區(qū)域和全局(Range and Global)L1D Cache一致性操作,而C64x器件只支持L1D區(qū)域invalidate和writebackinvalidate操作。在Cache尺寸上有改變,C66x器件在初始設置一個新尺寸前,自動writebackinvalidate Cache。而C64x器件需要執(zhí)行一個完整的writebackinvalidate程序(雖然這些是被一部分CSL函數(shù)處理的)。對于C66x器件,L2 Cache不包括L1D和L1P,兩者不相關。這意味著一個行從L2驅逐(evict),不會導致相應的行在L1P和L1D被驅逐。不相關的優(yōu)勢在于: 由于程序取指令導致的L2中的行分配不會從L1D Cache驅逐數(shù)據(jù); 由于數(shù)據(jù)訪問導致L2中的行分配不會從L1P驅逐程序代碼,這減少Cache緩存缺失的數(shù)量。以下介紹C66x Cache存儲器結構概覽、Cache基礎知識并詳細介紹各級Cache。3.3Cache存儲器結構概覽C66x DSP存儲器由內(nèi)部兩級基于Cache的存儲器和外部存儲器組成。L1P和L1D都可以被配置成SRAM和Cache,Cache較大可以達到32KB。所有Cache和數(shù)據(jù)路徑自動被Cache控制器管理,如圖3.1所示。1級存儲器通過核訪問,不需要阻塞。2級存儲器可以被配置,并可被分成L2 SRAM和Cache。外部存儲器可以為幾MB大小。
圖3.1C66x DSP Cache概覽
C6678器件上電配置如下: 復位后L1P被配置為全為Cache,大小為32KB。復位后L1D被配置為全為Cache,大小為32KB。復位后L2全是SRAM,Cache的容量可以被配置為32KB、64KB、128KB、256KB或全為Cache。訪問時間取決于接口和使用的存儲器技術。3.4Cache基礎知識通常, Cache可以分為直接映射Cache(directmapped Caches)和組相聯(lián)Cache (setassociative Caches)兩種類型。本節(jié)介紹Cache的一些基本知識。為了較好理解Cache機制,首先介紹幾個Cache的基本概念。(1) Cache Line(Cache行): Cache處理的最小單位。Cache Line的尺寸要比內(nèi)存存取的數(shù)據(jù)尺寸要大,一個行的大小為一個行尺寸(Line Size)。例如,C66x內(nèi)核可以訪問單個字節(jié),而L1P Cache行尺寸為32B,L1D Cache行尺寸為64B,L2 Cache行尺寸為128B。但是,如果發(fā)生一次讀失效,則Cache會將整條Cache Line的數(shù)據(jù)讀入。(2) Line Frame(行幀): Cache中用于存儲Cache Line的位置,包含被Cache的數(shù)據(jù)(1行)、一個關聯(lián)的Tag地址和這一行的狀態(tài)信息。這一行的狀態(tài)信息包括是否Valid(有效)、Dirty(臟)和LRU狀態(tài)。(3) Set(集): Line Frame的一個集合。直接映射的Cache中一個Set包含一個Line Frame,n路組相聯(lián)的Cache每個Set包含n個Line Frame。(4) Tag(標簽): Cache中被Cache的物理地址的高位作為一個Tag存儲在Line Frame中,在決定Cache是否命中的時候,Cache控制器會查詢Tag。(5) Valid(有效): 當Cache中的一個Line Frame保存了從下一級存儲器取的數(shù)據(jù),那么這個Line Frame的狀態(tài)就是Valid的,否則,這個Line Frame的狀態(tài)就是無效的(Valid = 0)。(6) Invalidate(失效): 是將Cache中標記為Valid的Line Frame狀態(tài)標記為無效的過程,受影響的Cache Line內(nèi)容被廢棄。為了維持數(shù)據(jù)一致性,與writeback組合成writebackinvalidate,先將標記為Dirty的行寫回到保存有這個地址的下一級存儲器,再標記該行為無效狀態(tài)。(7) Dirty(臟)和Clean(干凈): 當一個Cache Line是Valid并包含更新后的數(shù)據(jù),但還未更新到下一層更低的內(nèi)存,則在Line Frame的Dirty位標志該Cache Line為臟的。一個Valid的Cache Line與下一層更低的內(nèi)存一致,則Line Frame的Dirty位標志該Cache Line是Clean的(Dirty = 0)。(8) Hit(命中)和Miss(缺失): 當請求的內(nèi)存地址的數(shù)據(jù)在Cache中,那么Tag匹配并且相應的Valid有效,則稱為Hit,數(shù)據(jù)直接從Cache中取給DSP。相反,如果請求的內(nèi)存地址的數(shù)據(jù)不在Cache中,Tag不匹配或相應的Valid無效,則稱為Miss。(9) Victim Buffer(Victim緩沖): Cache中的一條Cache Line為新的Line騰出空間的過程稱為驅逐(Evict),被驅逐的Cache Line被稱為Victim(Line)。當Victim Line是Dirty的時,為了保持數(shù)據(jù)一致性,數(shù)據(jù)必須寫回到下一級存儲器中。Victim Buffer保存Vitim直到它們被寫回到下一級存儲器中。(10) Miss Pipelining(缺失流水): 對連續(xù)的缺失進行流水操作,提高對缺失處理的效率,降低阻塞(Stall)周期。(11) Touch: 對一個給定地址的存儲器操作,被稱為Touch那個地址。Touch也可以指的是讀數(shù)組元素或存儲器地址的其他范圍,目的是分配它們到一個特定級別Cache中。一個內(nèi)核中心循環(huán)用作Touch一個范圍的內(nèi)存,是為了分配它到Cache中,經(jīng)常被稱為一個Touch循環(huán)。Touch一個數(shù)組是軟件控制預取數(shù)據(jù)的一種形式。3.4.1直接映射Cache——L1P Cache直接映射Cache的工作原理可以參照C66x L1P Cache。任何時候內(nèi)核訪問L2 SRAM或外部空間中的指令,指令都被調(diào)入L1P Cache。1. 讀缺失如果一個程序從地址0020h取出,假設那個Cache是無效的,意味著Cache中沒有Cache Line包含該數(shù)據(jù)的緩存,這就是一個讀缺失。一個行幀的有效狀態(tài)被Valid (V)位指示: Valid位為0表示相應的Cache Line是無效的,也就是說,不包含被Cache緩存的數(shù)據(jù)。當核請求讀地址0020h, Cache控制器把這個地址分為三塊(Tag、Set和Offset),如圖3.2所示。
圖3.2地址分塊
Set部分(bits 13~5)指示地址映射到哪一個Set (如果是直接映射Cache,一個Set等于一個行幀)。對于地址0020h,Set部分檢測為1。然后控制器檢測Tag (bits 31~14)和Valid位。由于我們假設Valid位為0,控制器寄存器是一個缺失,也就是說被請求的地址沒有包含在Cache中。一個缺失也意味著: 為了容納請求地址的行,一個行幀會被分配。然后控制器從存儲器取行(0020h~0039h),并存數(shù)據(jù)到行幀1。地址的Tag部分存儲在Tag RAM中,Valid位變成1用以指示該Set包含有效數(shù)據(jù)。取出的數(shù)據(jù)同時也發(fā)送給核,訪問結束。一個地址的Tag部分之所以必須被存儲,這是因為當?shù)刂?020h再次被訪問時會更清楚該地址已經(jīng)被Cache緩存。2. 讀命中Cache控制器把地址分割為三個部分: Tag、Set和Offset,如圖3.2所示。Set部分決定地址映射到哪一個Set; 存儲的Tag部分用于與請求的地址Tag部分比較。這個比較是必要的,因為存儲器中多個行映射同一Set,通過Tag可以判斷出請求的地址是否映射到Cache中。如果訪問地址4020h也映射到同一個Set,Tag部分會不同,因而訪問會是一個缺失。如果地址0020h被訪問,Tag比較為真且Valid位為1,那么控制器寄存器為一個命中,并發(fā)送Cache Line中的數(shù)據(jù)到核,該訪問結束。3.4.2Cache缺失的類型在組相聯(lián)被討論之前,好理解不同類型的Cache缺失。Cache較大的目的是減少平均存儲器訪問時間。從存儲器到Cache取一個行幀的數(shù)據(jù),對于每個缺失,都會有損失。因而,對于最常使用的Cache Line,在被其他行替換前,要盡可能多地重復使用。這樣一來,初始損失影響最小且平均存儲器訪問時間變得最短。Cache使用相同行幀來存儲沖突的Cache Line,替換一個行幀將導致從Cache中驅逐另一個行幀。如果后續(xù)驅逐的行幀又被訪問,那么訪問會缺失且這個行幀必須再次從低速存儲器取出。因而,只要一個行幀還會被使用,應避免它被驅逐。1. 沖突和容量缺失一個Set對應的數(shù)據(jù)已經(jīng)被Cache緩沖,隨后同一個Set的其他存儲器位置被訪問,就會由于沖突導致驅逐,這個類型的缺失被稱為沖突缺失。一個沖突缺失的產(chǎn)生是因為一個Cache Line在它被使用前因為沖突被驅逐,更深層次的原因可能是因為Cache容量被耗盡,從而導致沖突發(fā)生。如果Cache容量被耗盡,當缺失發(fā)生時,Cache中的所有行幀被分配,這就是一個容量缺失。如果一個數(shù)據(jù)組超過重用Cache容量,容量缺失發(fā)生。當容量耗盡,新行訪問從數(shù)組開始逐步替代舊行。確認一個缺失的原因有助于選擇相應措施避免缺失。沖突缺失意味著數(shù)據(jù)訪問合乎Cache大小,但是Cache Line因為沖突被驅逐。在這種情況下,我們可能需要改變存儲器布局,以便數(shù)據(jù)訪問被分配到存儲器中Cache沒有沖突的地址中。或者,從硬件設計上,我們可以創(chuàng)建多個Set保持兩個或更多行。因而,存儲器的兩個行映射到相同Set可以都被保持在Cache中,相互不驅逐。這就是組相聯(lián)的Cache。為了避免容量缺失,需要減少一次操作數(shù)據(jù)的數(shù)量。2. 強制性缺失第三類缺失是強制性缺失或首次引用缺失。當數(shù)據(jù)及時次傳入,在Cache中沒有該數(shù)據(jù)的緩存,因而肯定發(fā)生該類型Cache缺失。與其他兩種缺失不同,這種缺失不刻意避免,因而是強制的。3.4.3組相聯(lián)Cache組相聯(lián)Cache具有多路Cache以減少沖突缺失的可能性。C66x L1D Cache是一個2路組相聯(lián)的Cache,具有4KB、8KB、16KB或32KB容量,并且Cache行尺寸為64字節(jié)。L1D Cache的特點在表3.1中描述。表3.2提供了L1D缺失阻塞特征。
表3.1L1D Cache特點
特征C66x DSPC64x DSP組織2路組相聯(lián)2路組相聯(lián)協(xié)議讀分配Read Allocate, Writeback讀分配Read Allocate, Writeback內(nèi)核訪問時間1周期1周期容量4KB、8KB、16KB或32KB16KB行尺寸64字節(jié)64字節(jié)替換策略最近經(jīng)常使用(LRU)最近最少使用(LRU)寫緩沖4 × 128位4 × 64位外部存儲器容量可配置可配置
表3.2L1D缺失阻塞特征
參數(shù)L2類型0 WaitState, 2×128bit Banks1 WaitState, 4×128bit Banks
L2 SRAML2 CacheL2 SRAML2 Cache
單個讀缺失10.512.512.514.52并行讀缺失(流水)10.5 412.5 812.5 414.5 8M連續(xù)的讀缺失(流水)10.5 3×(M-1)12.5 7×(M-1)12.5 3×(M-1)14.5 7×(M-1)M連續(xù)的并行讀缺失(流水)10.5 4×(M/2-1) 3×M/212.5 8×(M/2-1) 7×M/212.5 4×(M-1)14.5 8×(M/2-1) 7×M/2在讀缺失時Victim緩沖清空破壞缺失流水較大11個周期阻塞破壞缺失流水較大11個周期阻塞破壞缺失流水較大10個周期阻塞破壞缺失流水較大10個周期阻塞
寫緩沖流出速度2周期/條目6周期/條目2周期/條目6周期/條目
與直接映射Cache相比,2路組相聯(lián)Cache的每個Set由兩個行幀組成: 一個行幀在路0; 另一個行幀在路1。存儲器中的一條Cache Line仍然映射一個Set,不過現(xiàn)在可以存入兩個行幀中的任一條。從這個意義上講,一個直接映射的Cache也可以被看成一個1路Cache。組相聯(lián)的Cache架構如圖3.3所示。與直接映射類似,除了兩個Tag比較不一樣(組相聯(lián)的Cache中多路都進行Tag比較),Cache命中和缺失的機理相似。
圖3.3組相聯(lián)Cache架構
1. 讀缺失如果兩路都為讀缺失,數(shù)據(jù)首先從存儲器被取出。LRU(Least Recently Used)位決定Cache行幀被分配在哪一路中。每個Set有一個LRU位,可以被認為是一個開關。如果LRU位是0,行幀在路0被分配; 如果LRU位是1,行幀在路1被分配。任何時候只要存在一個到該行幀的訪問,LRU的狀態(tài)位就被改變。當一路被訪問,LRU位總是切換到相反的路,為的是保護最近使用的行幀不被驅逐。基于位置原理,最近最少使用原則(LRU)被用來在同一Set里選擇一個行幀作為被驅逐的行,用于保存新的Cache數(shù)據(jù)。2. 寫缺失L1D是一個讀分配的Cache,意味著在讀缺失時一個行幀被分配到Cache。在一個寫缺失時,數(shù)據(jù)通過一個寫緩沖被寫到更低級存儲器,不會因此而產(chǎn)生新的L1D Cache關系。寫緩沖有4個條目(entry),在C66x器件中每個entry是128位寬。3. 讀命中如果在路0有一個讀命中,該行幀的數(shù)據(jù)在路0被訪問; 如果在路1有一個讀命中,該行幀的數(shù)據(jù)在路1被訪問。4. 寫命中在一個寫命中活動中,數(shù)據(jù)被寫到Cache,但是不是立即傳遞到更低的存儲器。這種類型的Cache被稱為寫回writeback Cache,因為數(shù)據(jù)被一個內(nèi)核的寫訪問修改并且在之后被寫回到存儲器。為了寫回被修改的數(shù)據(jù),哪一行被核寫回必須清楚。為了實現(xiàn)這個目的,每條Cache Line具有一個Dirty位和它相關。最初,Dirty位是0。只要核寫到一個被Cache的行,相應的Dirty位被設置。因為讀缺失沖突,當Dirty的行需要被驅逐,它會被寫回到存儲器。如果那一行沒有被修改(Clean Line),它的內(nèi)容被丟棄。例如,假設行在Set 0,路0被內(nèi)核寫,LRU位指示在下一個缺失時路0將會被替換; 如果內(nèi)核當前產(chǎn)生一個到存儲器位置映射到Set 0的地址的讀訪問,當前的Dirty行首先寫回到存儲器,隨后新數(shù)據(jù)被存儲到這個行幀。一個寫回可能被程序發(fā)起,通過發(fā)送一個寫回命令到Cache控制器。3.4.4二級Cache如果在存儲器尺寸和訪問時間上,Cache和主存儲器之間有較大差別,二級Cache被引進用于減少更多存儲器訪問數(shù)量。二級Cache基本操作方式與1級Cache相同; 然而, 2級Cache在容量上更大。1級和2級Cache相互作用如下: 一個地址在L1缺失就傳給L2處理; L2使用相同的Valid位和Tag比較來決定被請求的地址是否在L2 Cache。L1命中直接從L1 Cache得到服務,并不需要牽涉L2 Cache。與L1P和L1D一樣,L2存儲空間可以被分成一個可尋址的內(nèi)部存儲器(L2 SRAM)和一個Cache (L2 Cache)部分。與L1 Cache只有讀分配(read allocate)不一樣,L2 Cache是讀分配和寫分配(write allocate)的Cache。L2 Cache只被用來Cache緩存外部存儲器地址,然而,L1P和L1D被用于Cache緩存L2存儲器和外部存儲器地址。L2 Cache特征概述如表3.3所示。
表3.3L2 Cache特征
特征C66x DSPC64x DSP
組織方式4路組相聯(lián)4路組相聯(lián)協(xié)議讀分配和寫分配讀分配和寫分配寫回寫回容量32KB、64KB、128KB或256KB32KB、64KB、128KB或256KB行尺寸128B128B替換策略最近使用(LRU)最近最少使用(LRU)外部存儲器容量可配置可配置
1. 讀缺失和讀命中考慮一個內(nèi)核讀請求的場景,即訪問可被Cache緩存的外部存儲器地址,而Cache在L1缺失(可能是L1P或L1D)。如果地址也在L2 Cache缺失,相應的行會引入L2 Cache。LRU位決定了哪路行幀被分配到其中。如果行幀包含Dirty數(shù)據(jù),在新行被取出前,首先會寫回到外部存儲器(如果這一行的數(shù)據(jù)也包含在L1D,在L2 Cache Line被發(fā)送給外部存儲器前,首先會寫回到L2。為保持Cache一致性,這個操作是需要的)。近期分配的一行形成一個L1 Line并包含請求的地址,然后傳送給L1。L1在其Cache存儲器中存儲該行,并發(fā)送請求的數(shù)據(jù)到內(nèi)核。如果在L1中新行替換一個Dirty行,它的內(nèi)容首先寫回到L2。如果地址是一個L2命中,相應的行直接從L2傳到L1 Cache。2. 寫缺失和寫命中如果一個核寫請求到一個外部存儲器地址在L1D中缺失,它將被通過寫緩沖傳送給L2。如果對于這個地址L2檢測到一個缺失,相應的L2 Cache Line被從外部存儲器取出,被用內(nèi)核寫操作修改并被存入分配的行幀中。LRU位決定哪路行幀用于分配給新數(shù)據(jù)。如果行幀包含Dirty數(shù)據(jù),它會在新行取出前首先被寫回到外部存儲器。注意新行沒有存儲進L1D,因為它只是一個readallocate Cache。如果地址是一個L2命中,相應的L2 Cache Line直接更新為核寫的數(shù)據(jù)。3. 外部存儲地址Cache能力L2 SRAM地址總是Cache緩存進L1P和L1D,然而,默認狀態(tài)下,外部存儲地址在L1D和L2 Cache中,被分配為不可Cache緩存的。因此,Cache能力必須首先被用戶明確使能。注意L1P Cache是不被配置影響的,并且總是Cache緩存外部存儲器地址。如果地址是不可Cache緩存的,任何存儲器訪問(數(shù)據(jù)訪問或程序取)無須分配行到L1D或L2 Cache。3.5L1P CacheC66x內(nèi)核中L1P與L1D上電后默認全為Cache,與L1D Cache不同的是L1P Cache為直接映射Cache。本節(jié)描述L1P Cache的相關知識。3.5.1L1P存儲器和CacheL1P存儲器和Cache的目的就是較大化程序執(zhí)行效率。L1P Cache的可配置性為系統(tǒng)設計提供了靈活性。L1P Cache的特點為: L1P Cache可配置成0KB、4KB、8KB和32KB,存儲器保護可配置,Cache塊和全局一致性操作可配置。L1P存儲器支持較大128KB的RAM空間(具體參見器件配置情況)。L1P存儲器不能被同一個核內(nèi)的L1D、L1P和L2 Cache緩存。L1P只能被EDMA和IDMA寫,不能被DSP存儲寫入。L1P可以被EDMA、IDMA和DSP訪問讀取。L1P存儲器較大的等待狀態(tài)為3周期,等待周期不能被軟件配置,這是由具體器件決定的。L1P存儲器等待狀態(tài)通常為0個周期。為了在一個較高的時鐘頻率取程序代碼并維持一個較大的系統(tǒng)空間,L1P Cache是很有必要的,并可以把部分或全部的L1P都作為Cache。從L1P存儲器地址映射的最頂端開始,采用自頂向下的順序,L1P把存儲器轉換為Cache。較高地址的L1P存儲器首先被Cache緩存。用戶可以通過寄存器控制L1P Cache的操作。表3.4列出了這些寄存器概要。
表3.4L1P Cache寄存器概要
地址縮略詞寄存器描述
0184 0020hL1PCFGL1程序配置寄存器0184 0024hL1PCCL1程序Cache控制寄存器0184 4020hL1PIBARL1程序無效基址寄存器0184 4024hL1PIWCL1程序無效計數(shù)(字)寄存器0184 5028hL1PINVL1程序無效寄存器
3.5.2L1P Cache結構L1P Cache是直接映射的Cache,意味著系統(tǒng)中每個物理存儲位置都在Cache中有一個可能歸屬的位置。當DSP想取一段代碼,DSP首先要檢