一个具有20位地址和32位字长的存储器_存储器层次结构(三):高速缓存
一、高速緩存存儲器組織結(jié)構(gòu)
假設一個計算機系統(tǒng)每個存儲器地址有m位,形成M=2^m個不同的地址。這樣一個機器的高速緩存被組織成一個有S=2^s個高速緩存組(cache set)。每個高速緩存組包含E個高速緩存行(cache line)。每個高速緩存行由一個B=2^b字節(jié)的高速緩存塊(block)、一個有效位(valid bit:指明這個行是否包含有意義的信息),還有t=m-(b+s)個標記位(唯一的標識存儲在這個高速緩存行中的高速緩存塊)。
當一條加載指令指示CPU從主存地址A中讀取一個字時,它將地址A發(fā)送到高速緩存。如果高速緩存正保存著地址A處字的副本,它立即將這個字發(fā)回給CPU。高速緩存的結(jié)構(gòu)能夠通過簡單地檢查地址位,找到所請求的字:
存儲器地址如下所示:
地址A中s個組索引位是一個到S個高速緩存組的索引。組索引位被解釋為一個無符號整數(shù),它告訴我們這個字必須存儲在哪個告訴緩存組中。地址A中的t個標記位告訴我們高速緩存組中的哪一個高速緩存行包含這個字。當且僅當設置了有效位并且該行的標記位與地址A中的標記位相匹配時,組中的這個高速緩存行才包含這個字。地址A中的b個偏移位給出了字在B個字節(jié)的緩存塊中的字偏移。
二、直接映射高速緩存
根據(jù)每個高速緩存組中高速緩存行E的行數(shù),高速緩存被分為不同的類。每個高速緩存組只有一行(E=1)高速緩存行的高速緩存被稱為直接映射高速緩存(direct-mapped cache)。
高速緩存確定一個請求是否命中,然后抽取出被請求的字的過程,分為三步:1、組選擇;2、行匹配;3、字抽取。
2.1 直接映射高速緩存中組選擇
高速緩存從m個地址位中間抽取出s個組索引位。
2.2 直接映射高速緩存中行匹配
當且僅當高速緩存行設置了有效位,并且高速緩存行中的標記與地址中的標記相匹配時,這一高速緩存行包含這個字的一個副本。
2.3 直接映射高速緩存中的字選擇
塊偏移提供了所需要的字的第一個字節(jié)的偏移。本例中塊偏移為100(二進制),它表明字的副本是從塊中的字節(jié)4開始的(我們假設字長為4字節(jié))。
2.4 運行中的直接映射高速緩存
假設我們有一個直接映射高速緩存,描述如下:(S,E,B,m)=(4,1,2,4)。即:高速緩存有4個高速緩存組,每個高速緩存組含有一行高速緩存行,每個高速緩存塊有2個字節(jié),存儲器地址為4位。我們假設每個字都是單字節(jié)的。
我們模擬CPU執(zhí)行一系列讀的時候,高速緩存的執(zhí)行情況,我們假設CPU讀1字節(jié)的字。初始時,高速緩存是空的(即每個有效位都是0);
表中的每一行都代表一個高速緩存行。第一列表明該列所屬的組,但是請記住提供這個位只是為了方便,實際上它并不是高速緩存的一部分。后面四列代表高速緩存行的實際位。
1、讀地址0(0000)的字。因為組0的有效位是0,是緩存不命中。高速緩存從內(nèi)存(或低一級的高速緩存)取出塊0,并把這個塊存儲在組0中。然后,高速緩存返回新取出的高速緩存行的塊[0]的m[0](內(nèi)存位置0的內(nèi)容)。
2、讀地址1(0001)的字。這次會是高速緩存命中。高速緩存立即從高速緩存行的塊[1]中返回m[1]。高速緩存的狀態(tài)沒有變化。
3、讀地址13(1100)的字。由于組2中的高速緩存行不是有效的,所以緩存不命中。高速緩存把塊6加載到組2中,然后從新的高速緩存行的塊[1]中返回m[13]。
4、讀地址8(1000)的字。這會發(fā)生緩存不命中。組0中的高速緩存行確實是有效的,但是標記不匹配。高速緩存將塊4加載到組0中(替換讀地址0時讀入的高速緩存行),然后從新的高速緩存行的塊[0]中返回m[8]。
5、讀地址0(0000)的字。又會發(fā)生緩存不命中,因為前面引用地址8時,我們剛好替換了塊0。這就是沖突不命中的例子。也就是我們有足夠的高速緩存空間,但是卻交替的引用映射到同一組的塊。
三、組相聯(lián)高速緩存
直接映射高速緩存中沖突不命中造成的問題源于每個組只有一行(E=1)這個限制。組相連高速緩存放松了這條限制,一個1<E<C/B的高速緩存成為E路組相連高速緩存。下圖為2路組相聯(lián)高速緩存的結(jié)構(gòu)。
1、組相聯(lián)高速緩存中組的選擇
組索引位標識組
2、組相聯(lián)高速緩存中行匹配和字選擇
組中的任何一行都可以包含任何映射到這個組的內(nèi)存塊。所以高速緩存必須搜索組中的每一行,尋找一個有效行,其標記與地址中的標記相匹配。如果高速緩存找到了這樣一行,那么我們就命中,塊偏移從這個塊中選擇一個字。
3、組相聯(lián)高速緩存中不命中時行替換
最簡單的替換策略是隨機選擇替換。其他更復雜的策略利用了局部性原理,以使在比較近的將來引用被替換的行的概率最小。例如,最不長使用(LFU)策略會替換在過去某個時間窗口內(nèi)引用次數(shù)最少的那一行。最近最少使用(LRU)策略會替換最后一次訪問時間最久遠的哪一行。
四、全相聯(lián)高速緩存
全相聯(lián)高速緩存是由一個包含所有高速緩存行的組(E=C/B)組成的。
1、全相聯(lián)高速緩存中的組選擇
全相聯(lián)高速緩存中的組選擇非常簡單,因為只有一個組。地址中沒有組索引,地址只被劃分為一個標記和一個塊偏移。
2、全相聯(lián)高速緩存中的行匹配和字選擇
全相聯(lián)高速緩存中的行匹配與字選擇與組相聯(lián)高速緩存中的是一樣的,它們的區(qū)別主要是規(guī)模大小的問題。
因為高速緩存電路必須并行地搜索許多相匹配的標記,構(gòu)造一個又大又快的相聯(lián)高速緩存很困難,而且價格昂貴。
五、高速緩存讀與寫
1、高速緩存讀
首先,在高速緩存中查找所需字w的副本。如果命中,立即返回字w給CPU。如果不命中,從存儲器層次結(jié)構(gòu)中較低層中取出包含字w的塊,將這個塊存儲到某個高速緩存行中,然后返回字w。
2、高速緩存寫
寫命中
直寫(write-through),寫一個已經(jīng)緩存了的字w(寫命中,write hit),立即將w的高速緩存塊寫回到緊接著的低一層中。
寫回(write-back),盡可能的推遲更新,只有當替換算法要驅(qū)逐這個更新過的塊時,才把寫到緊接著的低一層中。高速緩存必須為每一個高速緩存行維護一個額外的修改位(dirty bit),表明這個高速緩存塊是否被修改過。
寫不命中
寫分配(write-allocate),加載相應的低一層中的塊到高速緩存中,然后更新這個高速緩存塊。
非寫分配(not-write-allocate),避開高速緩存,直接把這個字寫到低一層中。
六、Intel Core i7處理器的高速緩存層次結(jié)構(gòu)
只保存指令的高速緩存稱為i-cahce,只保存程序數(shù)據(jù)的高速緩存稱為d-cache。即保存指令又保存數(shù)據(jù)的高速緩存稱為統(tǒng)一高速緩存。
Intel Core i7 處理器每個CPU芯片有四個核。每個核有自己私有的L1 i-cache、L1 d-cache和L2統(tǒng)一的高速緩存。所有的核共享片上的L3統(tǒng)一的高速緩存。
參考:
《深入理解計算機系統(tǒng)》是2016年機械工業(yè)出版社的圖書,作者是(美)布賴恩特(Bryant,R.E.)。
《Computer Systems A Programmer's perspective》:CSAPP。
總結(jié)
以上是生活随笔為你收集整理的一个具有20位地址和32位字长的存储器_存储器层次结构(三):高速缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓手机可以连接斑马系统吗_Zebra斑
- 下一篇: python乒乓球比赛规则介绍_乒乓球比