天天看點

詳解高速緩存存儲器的3種映射方式

開始的計算機系統中存儲器層次包括CPU寄存器、主存(DRAM)和硬碟,後來為了緩解寄存器與主存間速度的差異,系統設計者在它們之間增加了高速緩存(SRAM),它的通路速度幾乎可以和寄存器一樣快。

詳解高速緩存存儲器的3種映射方式

随着CPU和主存的性能差距逐漸拉大,後來在原高速緩存(L1高速緩存)和記憶體之間有增加了L2和L3級高速緩存。一般通路寄存器需要1個時鐘周期,通路L1級高速緩存需要4個時鐘周期,通路L2級高速緩存需要10個時鐘周期,通路L3級高速緩存需要50個時鐘周期。

Intel Core i7的高速緩存層次結構如下圖所示:

詳解高速緩存存儲器的3種映射方式

下文的介紹以簡單的L1級高速緩存來介紹。

1.通用高速緩存存儲器組織結構

假設系統的存儲器位址共有m位,形成M = 2m 個不同的位址。該機器的高速緩存被組織成一個有S = 2m個高速緩存組,每組包含E個高速緩存行,每行包含B = 2b個位元組組成。

詳解高速緩存存儲器的3種映射方式
參數 描述
S 組數
E 每組的行數
B 塊的大小(位元組)
m 實體位址位數

高速緩存的大小可以用C=S * E * B來表示。

2.直接映射高速緩存

當E=1,也即每組隻有一行時,我們稱之為直接映射(direct-mapped cache)。

2.1組的選擇

高速緩存從位址中間抽取出s位組成高速緩存的組索引。

詳解高速緩存存儲器的3種映射方式

2.2行比對和字選擇

  • 上一步已經找到了高速緩存組,現在要先确定你要找的資料是否已經被緩存了,這由高速緩存結構中的一個有效位來決定。若為1則有效,繼續比對标記字段,反之為0就無效,直接判斷緩存不命中。
  • 接下來再由高速緩存檢查從該位址高t位(标記字段)是否和高速緩存中的标記段一緻。若一緻則緩存命中,否則緩存不命中。
詳解高速緩存存儲器的3種映射方式
  • 若行已經比對,我們就知道所需要的字已經在這個塊中的某個地方了。我們把塊看成是一個位元組數組的話,那麼位址低位的b位塊偏移字段就是所需字的索引值。

2.3 抖動沖突不命中

當程式通路大小為2的幂的數組時,直接映射高速緩存中通常會發生沖突不命中。考慮一個計算兩個向量點積的函數:

float dotprod(float x[8], float y[8])
{
    float sum = 0.0;
    int i;
    for(i=0; i<8; i++){
        sum += x[i] * y[i];
    }
    return sum;
}      

假設浮點數占4個位元組,x被加載到位址0開始的32連續記憶體中,y被加載到緊随其後的32連續位元組。為了說明問題,假設一個塊是16個位元組,高速緩存由2個組組成。sum實際上會被存放在寄存器中,然後完成第一次循環時,為了取得x[0]的值,x首先被全部加入到高速緩存并占滿整個高速緩存;然後為了取得y[0]的值,x會被換出,y又被全部加入到高速緩存并占滿整個高速緩存;這樣來回往複,形成抖動(thrash),造成速度下降2到3倍。

是以為了避免發生以上的抖動問題,在定義數組大小時盡量不要取2的幂大小。例如在上例中,我們在x數組的末尾添加4位元組的空間。這樣y數組的位址就不會和x一樣映射到同一個高速緩存組了。

詳解高速緩存存儲器的3種映射方式

上圖解釋了為什麼選擇位址的中間位來作為高速緩存的索引。

3.組相聯高速緩存

它的組選擇與直接映射的一樣,而它的行比對要比直接映射複雜,因為他要檢查多個行的标記字段和有效位,以确定所請求的字是否在集合中。

詳解高速緩存存儲器的3種映射方式

其中,組裡的任何一行都可以包含任何映射到該組的記憶體塊。

詳解高速緩存存儲器的3種映射方式

4.全相聯高速緩存

全相聯的結構隻包含一個組,裡面包含了所有的緩存行。

繼續閱讀