計算機組成與設計(十二)—— 存儲層次結構(二)

 高速緩存的原理

cpu和內存的速度差距愈來愈大,計算機的性能受到影響,而高速緩存的出現挽救了這一局面。緩存

爲何在cpu和主存直接添加一個容量很小、速度更快的高速緩存能增長計算機的性能呢?ide

程序的局部性原理

這是一個經驗性結論:計算機程序從時間和空間都表現出局部性。性能

時間局部性Temporal Locality):最近被訪問的存儲單元(指令或數據)很快會被訪問spa

例如:設計

for(int i = 0;i < 100;i++) for(int j = 0;j < 100;j++) sum += a[i][j];

其中的sum、判斷指令、加法指令、遞增指令都會立刻被訪問3d

空間局部性Spatial Locality):正在被訪問的存儲單元附近單元很快會被訪問code

例如,a[i][j]的附近的元素很快會被訪問blog

 

Cache對局部性的利用

Cache對空間局部性的利用

  • 從主存中取出待訪問的數據時,會同時取回相鄰位置的主存單元的數據
  • 以數據塊爲單位與主存進行數據交換

Cache對時間局部性的利用

  • 保存最近被頻繁訪問的數據元素

 

Cache的訪問過程

具體是如何實現的呢?示例過程:索引

一、因爲是16個字節對齊,因此從2010H開始讀取數據。每一個塊16個字節,因此最低位恰好表示在塊中的索引,倒數第二位表示塊的索引。因此第一次是分配表項1,爲命中,將標籤設爲20H,有效位改成1內存

二、對應的表項已經有數據且不是當前數據,當前表項數據和標籤都要替換

三、未命中,將數據存到cache的表項三,並返回32H

四、對應的表項1有數據(有效位爲1),且標籤也相同,命中,根據低位找到數據並放回

 

看完了讀操做,咱們再來看cache的寫操做。

 

Cache的寫策略

cache命中時

  • 寫穿透(Write Through):數據同時寫入cache和主存(這樣保證了cache和內存中始終保持一致)
  • 寫返回(Write Back):數據只寫入cache,僅當該數據塊被替換時纔將數據寫回內存

cahce失效時

  • 寫不分配(Write Non-allocate):直接將數據寫入內存
  • 寫分配(Write Allocate):將該數據所在的塊讀入cache後,再將數據寫入cache

寫分配須要將數據讀入cache中再寫入,看起來比寫不分配要慢,可是根據局部性的原理,如今寫入的數據等下極可能要使用,提早寫入cache能使後面的訪存性能大大提高。

 

因此在如今cache的設計中,寫創投和寫不分配每每是配套使用的,用於那些對性能要求不高但設計簡單的系統,對性能要求較高的,一般使用寫返回和寫分配。

對於如何去查找、替換cache中的表項,與讀操做是相似的

 

平均訪存時間

因此能夠獲得平均訪存時間的計算公式:

平均訪存時間(Average Memrory Access Time) = 命中時間(Hit time) + 缺失率(Miss Rate) x 缺失代價(Miss Penalty)

減小平均訪存時間的三個途徑:

  • 下降Hit Time:要求cache的容量小一點,cache的結構簡單一點
  • 減小Miss Penalty:提高主存的性能、再增長一層cache
  • 下降Miss Rate:增大cache的容量

 

Cache的映射策略

直接映射

例如,若是有一個8表項的cache,直接映射的情形如圖:

至關於模8

特色:計算規則簡單,缺點是若是交替的訪問兩個數據a,b(差能整除8),將會一直miss

二路組相聯

若是跟剛纔同樣,交替訪問a,b,a被放在第一行第一個位置,而後b被放在第一行第二個,以後在訪問a,b時都能hit。

若是是交替訪問a,b,c呢?二路組相連也不行了

不增長cache總的容量的狀況下,還能夠進一步切分,好比四路組相聯

是否是能夠無限切分下去呢?最多所有展開,像這裏的八路組相聯。內存當中任一個數據塊均可以放到這個Cache當中的任何一個行中, 而不用經過地址的特徵來約定固定放在哪個行,那這樣結構的Cache就叫作全相聯的cache。

 

是否是組數越多越好呢?固然不是,組數越多,肯定行以後要比較的標籤也會變增長。這樣下降了缺失率,卻增長了命中時間。且話又說回來,增長了路數,還不必定可以下降失效率,還跟替換策略有關。

 

 

參考資料:https://www.bilibili.com/video/av12666021/?p=45

相關文章
相關標籤/搜索