-
局部性原理
- 時間局部性
- 如果一個數據項被訪問,那麼不久後它可能再次被訪問
- 循環 - 空間局部性
- 如果一個數據項被訪問,那麼與他地址相鄰的數據項也很有可能被訪問
- 數組 - 局部性原理是cache產生的基礎
- 時間局部性
-
cache地址組成
- 索引位
- n位索引表示cache有 個塊
- 塊大小位
- m位表示有字
- 額外的兩位用來表示byte偏移
- 標記位
- 假設地址爲32位
- tag = 32 - (m + n + 2)
- 索引位
-
cache大小
- 索引 * (塊大小 + tag大小 + 有效位大小)
- 2^n * (2^{m+ 2 + 3} + (32 - n - m -2 ) + 10 )
- 一般只計算數據大小
-
cache 缺失
- 導致流水線阻塞
- 指令cache缺失
- PC = PC - 4
- 讀取主存並等待數據
- 寫入cache,設置有效位
- 重新執行指令
- 數據cache缺失
- 阻塞IF到MEM階段
- 下面的過程和指令缺失一樣
- 強制缺失
- cache中第一次出現的塊產生的缺失,又叫做冷啓動缺失
- 容量缺失
- cache容納不了一個程序執行所需要的所有塊
- 當某些塊被調換出去,隨後又被調入產生的缺失
- 衝突缺失
- 組相聯或者直接映射的cache中,多個塊競爭同一組產生的缺失
- 全相聯cache中不存在
-
寫操作
- 直寫法
- 同時寫入cache和主存
- 缺點
- 使得寫操作花費時間長
- 通過寫緩衝解決時間過長問題
- 寫入一個buffer中然後直接執行後面的過程,同時buffer寫入主存
- 當緩衝區滿的時候任然會堵塞
- 如果寫入buffer的速度大於寫入主存的速度,buffer很有可能會滿
- 回寫法
- 標記該塊爲髒塊,但是不直接寫會
- 只有當該塊有cache缺失被替換的時候才寫會主存
- 寫缺失
- 直寫法下的寫缺失
- 寫分配
- 直接寫入cache中對應的組中而不用預先判斷是否是對應的塊
- 如果是對應的塊,則寫入buffer等待寫回,程序繼續
- 如果不是,則從主存中取出對應的塊剩餘的部分
- 只需要一個執行週期
- 寫不分配
- 直接改寫主存中對應的數據塊,而不寫cache
- 原因是有時我們會將整個塊清零,此時寫入cache沒有意義
- 寫分配
- 回寫法下的寫缺失
- 一般是寫分配的
- 第一個執行週期需要判斷是否是寫缺失
- 因爲如果是寫缺失,需要首先將cache中的塊寫回主存,否則內容會丟失
- 第二個週期執行寫操作
- 或者可以通過加buffer的方式減少一個週期
- 在第一個週期直接將要被修改的數據寫入buffer並執行寫操作,同時又從主存中取出剩下的部分塊
- 直寫法下的寫缺失
- 直寫法
-
減少缺失代價
- 減少讀取第一個字的延遲比較困難,但是我們可以通過增加主存和cache之間的帶寬來使得加較大容量的塊和較小容量的塊擁有相近的損失代價
- 帶寬即每個時鐘週期傳輸的字節數
- 加寬方法
- 第一種就是加寬總線每次傳動的數據數
- 第二種是加寬儲存器每次讀取的數據數
-
更多的cache組織方式
-
組相聯
- 每個組包含n個塊
- 一個組爲一個索引,組中根據tag判斷應該讀哪個塊
- cache可以放到組中的任意位置
-
全相聯
- 一個cache只有一個組,沒有索引位,全部通過tag判斷
- 塊可以放在cache中的任意位置
- 一般應用於較小的cache,否則搜索時間過長
- 當然也可以像後面的虛擬存儲器一樣通過外置一個頁表的方法免去搜索
-
提高關聯度,即增加組中塊的個數,優點是降低了損失率,缺點是增加了命中時間(來自於tag的比較)
-
-
L1和L2cache
- L1cache一般較小
- 更低的命中時間
- 原因是從L2取出數據的缺失代價較小
- L2cache一般較大
- 更低的缺失率
- 原因是從主存中取出數據的缺失代價很大
- L1cache一般較小
《計算機組成與設計》閱讀筆記——cache
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.