1. 程式人生 > >計算機組成與設計(十二)—— 儲存層次結構(二)

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

 快取記憶體的原理

cpu和記憶體的速度差距越來越大,計算機的效能受到影響,而快取記憶體的出現挽救了這一局面。

為什麼在cpu和主存直接新增一個容量很小、速度更快的快取記憶體能增加計算機的效能呢?

程式的區域性性原理

這是一個經驗性結論:計算機程式從時間和空間都表現出區域性性。

時間區域性性Temporal Locality):最近被訪問的儲存單元(指令或資料)很快會被訪問

例如:

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

其中的sum、判斷指令、加法指令、遞增指令都會馬上被訪問

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

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

 

Cache對區域性性的利用

Cache對空間區域性性的利用

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

Cache對時間區域性性的利用

  • 儲存最近被頻繁訪問的資料元素

 

Cache的訪問過程

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

1、由於是16個位元組對齊,所以從2010H開始讀取資料。每個塊16個位元組,所以最低位剛好表示在塊中的索引,倒數第二位表示塊的索引。所以第一次是分配表項1,為命中,將標籤設為20H,有效位改為1

2、對應的表項已經有資料且不是當前資料,當前表項資料和標籤都要替換

3、未命中,將資料存到cache的表項三,並返回32H

4、對應的表項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