日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Cache Memory技术示例

發(fā)布時間:2023/11/28 生活经验 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cache Memory技术示例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Cache Memory技術(shù)示例
為什么需要cache?如何判斷一個數(shù)據(jù)在cache中是否命中?cache的種類有哪些,區(qū)別是什么?
為什么需要cache memory
先思考第一個問題:程序是如何運行起來的?應(yīng)該知道程序是運行在 RAM之中,RAM 就是常說的DDR(例如 DDR3、DDR4等)。稱為main memory(主存)當需要運行一個進程時,先從Flash設(shè)備(例如,eMMC、UFS等)中,將可執(zhí)行程序load到main memory中,然后開始執(zhí)行。在CPU內(nèi)部存在一堆的通用寄存器(register)。如果CPU需要將一個變量(假設(shè)地址是A)加1,一般分為以下3個步驟:
CPU 從主存中讀取地址A的數(shù)據(jù)到內(nèi)部通用寄存器 x0(ARM64架構(gòu)的通用寄存器之一)。
通用寄存器 x0 加1。
CPU 將通用寄存器 x0 的值寫入主存。
這個過程可表示如下:

CPU通用寄存器的速度和主存間存在著太大的差異。兩者間的速度大致如下關(guān)系:

CPU register的速度一般小于1ns,主存的速度一般是65ns左右。速度差異近百倍。因此,上面舉例的3個步驟中,步驟1和步驟3實際上速度很慢。當CPU試圖從主存中l(wèi)oad/store 操作時,由于主存的速度限制,CPU不得不等待這漫長的65ns時間。如果可以提升主存的速度,系統(tǒng)將會獲得很大的性能提升。如今的DDR存儲設(shè)備,動不動就是幾個GB,容量很大。如果采用更快材料制作更快速度的主存,擁有幾乎差不多的容量。成本將會大幅度上升。試圖提升主存的速度和容量,又期望成本很低,這就有點難為人了。因此,有一種折中的方法,就是制作一塊速度極快但是容量極小的存儲設(shè)備。成本也不會太高。這塊存儲設(shè)備稱為cache memory。在硬件上,將cache放置在CPU和主存間,作為主存數(shù)據(jù)的緩存。 當CPU試圖從主存中l(wèi)oad/store數(shù)據(jù)時,CPU會先從cache中查找對應(yīng)地址的數(shù)據(jù)是否緩存在cache 中。如果數(shù)據(jù)緩存在cache中,直接從cache中拿到數(shù)據(jù)并返回給CPU。當存在cache時,以上程序如何運行的例子的流程將會變成如下:

CPU與主存間直接數(shù)據(jù)傳輸?shù)姆绞睫D(zhuǎn)變成CPU和cache間直接數(shù)據(jù)傳輸。cache負責(zé)和主存間數(shù)據(jù)傳輸。
多級cache memory
cahe的速度在一定程度上同樣影響著系統(tǒng)的性能。一般情況cache的速度可以達到1ns,幾乎可以和CPU寄存器速度媲美。但是,滿足人們對性能的追求了嗎?沒有。當cache中沒有緩存想要的數(shù)據(jù)時,依然需要漫長的等待從主存中l(wèi)oad數(shù)據(jù)。為了進一步提升性能,引入多級cache。前面提到的cache,稱為L1 cache(第一級cache)。在L1 cache 后面連接L2 cache,在L2 cache 和主存間連接L3 cache。等級越高,速度越慢,容量越大。但是速度相比較主存,依然很快。不同等級cache速度間關(guān)系如下:

經(jīng)過3級cache的緩沖,各級cache和主存間的速度最萌差也逐級減小。在一個真實的系統(tǒng)上,各級cache間硬件上是如何關(guān)聯(lián)的呢?看下Cortex-A53架構(gòu)上各級cache間的硬件抽象框圖如下:

在Cortex-A53架構(gòu)上,L1 cache分為單獨的instruction cache(ICache)和data cache(DCache)。L1 cache是CPU私有的,每個CPU都有一個L1 cache。一個cluster 內(nèi)的所有CPU共享一個L2 cache,L2 cache不區(qū)分指令和數(shù)據(jù),都可以緩存。所有cluster間共享L3 cache。L3 cache通過總線和主存相連。
多級cache間的配合工作
首先引入兩個名詞概念,命中和缺失。 CPU要訪問的數(shù)據(jù)在cache中有緩存,稱為“命中” (hit),反之稱為“缺失” (miss)。多級cache間是如何配合工作的呢?假設(shè)現(xiàn)在考慮的系統(tǒng)只有兩級cache。

當CPU試圖從某地址load數(shù)據(jù)時,首先從L1 cache中查詢是否命中,如果命中,把數(shù)據(jù)返回給CPU。如果L1 cache缺失,繼續(xù)從L2 cache中查找。當L2 cache命中時,數(shù)據(jù)會返回給L1 cache以及CPU。如果L2 cache也缺失,很不幸,需要從主存中l(wèi)oad數(shù)據(jù),將數(shù)據(jù)返回給L2 cache、L1 cache及CPU。這種多級cache的工作方式稱為inclusive cache。某一地址的數(shù)據(jù)可能存在多級緩存中。與inclusive cache對應(yīng)的是exclusive cache,這種cache保證某一地址的數(shù)據(jù)緩存只會存在于多級cache中一級。也就是說,任意地址的數(shù)據(jù)不可能同時在L1和L2 cache中緩存。
直接映射緩存(Direct mapped cache)
繼續(xù)引入一些cache相關(guān)的名詞。cache的大小稱為cahe size,代表cache可以緩存最大數(shù)據(jù)的大小。將cache平均分成相等的很多塊,每一個塊大小稱為cache line,大小是cache line size。如一個64 Bytes大小的cache。如果將64 Bytes平均分成64塊,cache line就是1字節(jié),總共64行cache line。如果將64 Bytes平均分成8塊,那么cache line就是8字節(jié),總共8行cache line。現(xiàn)在的硬件設(shè)計中,一般cache line的大小是4-128 Byts。為什么沒有1 byte呢?
cache line是cache和主存間數(shù)據(jù)傳輸?shù)淖钚挝弧J裁匆馑寄?#xff1f;當CPU試圖load一個字節(jié)數(shù)據(jù)時,如果cache缺失,cache控制器會從主存中一次性的load cache line大小的數(shù)據(jù)到cache中。例如,cache line大小是8字節(jié)。CPU即使讀取一個byte,在cache缺失后,cache會從主存中l(wèi)oad 8字節(jié)填充整個cache line。又是因為什么呢?
假設(shè)下面都是針對64 Bytes大小的cache,cache line大小是8字節(jié)??梢灶愃瓢堰@塊cache想想成一個數(shù)組,數(shù)組總共8個元素,每個元素大小是8字節(jié)。就像下圖這樣。

現(xiàn)在考慮一個問題,CPU從0x0654地址讀取一個字節(jié),cache控制器是如何判斷數(shù)據(jù)是否在cache中命中呢?cache大小相對于主存,可謂是小巫見大巫。所以cache肯定是只能緩存主存中極小一部分數(shù)據(jù)。如何根據(jù)地址在有限大小的cache中查找數(shù)據(jù)呢?現(xiàn)在硬件采取的做法是對地址進行散列(可以理解成地址取模操作)。如何做到?

一共有8行cache line,cache line大小是8 Bytes。所以可以利用地址低3 bits(如上圖地址藍色部分)用來尋址8 bytes中某一字節(jié),這部分bit組合稱為offset。同理,8行cache line,為了覆蓋所有行。需要3 bits(如上圖地址黃色部分)查找某一行,這部分地址部分稱為index。如果兩個不同的地址,地址的bit3-bit5如果完全一樣,這兩個地址經(jīng)過硬件散列后,都會找到同一個cache line。所以,當找到cache line后,只代表訪問的地址對應(yīng)的數(shù)據(jù)可能存在這個cache line中,但是也有可能是其它地址對應(yīng)的數(shù)據(jù)。所以,又引入tag array區(qū)域,tag array和data array一一對應(yīng)。每一個cache line都對應(yīng)唯一一個tag,tag中保存的是整個地址位寬去除index和offset使用的bit剩余部分(如上圖地址綠色部分)。tag、index和offset三者組合就可以唯一確定一個地址了。因此,當根據(jù)地址中index位找到cache line后,取出當前cache line對應(yīng)的tag,然后和地址中的tag進行比較,如果相等,說明cache命中。如果不相等,說明當前cache line存儲的是其它地址的數(shù)據(jù),這就是cache缺失。在上述圖中,看到tag的值是0x19與地址中的tag部分相等,在本次訪問會命中。由于tag的引入,因此解答了之前的一個疑問“為什么硬件cache line不做成一個字節(jié)?”。這樣會導(dǎo)致硬件成本的上升,因為原本8個字節(jié)對應(yīng)一個tag,現(xiàn)在需要8個tag,占用了很多內(nèi)存。
可以從圖中看到tag旁邊還有一個valid bit,這個bit用來表示cache line中數(shù)據(jù)是否有效(例如:1代表有效;0代表無效)。當系統(tǒng)剛啟動時,cache中的數(shù)據(jù)都應(yīng)該是無效的,因為還沒有緩存任何數(shù)據(jù)。cache控制器可以根據(jù)valid bit確認當前cache line數(shù)據(jù)是否有效。所以,上述比較tag確認cache line是否命中前,還會檢查valid bit是否有效。只有在有效的情況下,比較tag才有意義。如果無效,直接判定cache缺失。
上面的例子中,cache size是64 Bytes并且cache line size是8 bytes。offset、index和tag分別使用3 bits、3 bits和42 bits(假設(shè)地址寬度是48 bits)?,F(xiàn)在再看一個例子:512 Bytes cache size,64 Bytes cache line size。根據(jù)之前的地址劃分方法,offset、index和tag分別使用6 bits、3 bits和39 bits。如下圖所示。

直接映射緩存的優(yōu)缺點
直接映射緩存在硬件設(shè)計上會更加簡單,因此成本上也會較低。根據(jù)直接映射緩存的工作方式,可以畫出主存地址0x00-0x88地址對應(yīng)的cache分布圖。

可以看到,地址0x00-0x3f地址處對應(yīng)的數(shù)據(jù),可以覆蓋整個cache。0x40-0x7f地址的數(shù)據(jù),同樣是覆蓋整個cache。現(xiàn)在思考一個問題,如果一個程序試圖依次訪問地址0x00、0x40、0x80,cache中的數(shù)據(jù)會發(fā)生什么呢?首先應(yīng)該明白0x00、0x40、0x80地址中index部分是一樣的。因此,這3個地址對應(yīng)的cache line是同一個。所以,當訪問0x00地址時,cache會缺失,然后數(shù)據(jù)會從主存中加載到cache中第0行cache line。當訪問0x40地址時,依然索引到cache中第0行cache line,由于此時cache line中存儲的是地址0x00地址對應(yīng)的數(shù)據(jù),所以此時依然會cache缺失。然后從主存中加載0x40地址數(shù)據(jù)到第一行cache line中。同理,繼續(xù)訪問0x80地址,依然會cache缺失。相當于每次訪問數(shù)據(jù)都要從主存中讀取,所以cache的存在并沒有對性能有什么提升。訪問0x40地址時,就會把0x00地址緩存的數(shù)據(jù)替換。這種現(xiàn)象叫做cache顛簸(cache thrashing)。針對這個問題,引入多路組相連緩存。首先研究下最簡單的兩路組相連緩存的工作原理。
兩路組相連緩存(Two-way set associative cache)
依然假設(shè)64 Bytes cache size,cache line size是8 Bytes。什么是路(way)的概念。將cache平均分成多份,每一份就是一路。因此,兩路組相連緩存就是將cache平均分成2份,每份32 Bytes。如下圖所示。

cache分成2路,每路包含4行cache line。將所有索引一樣的cache line組合在一起稱為組。例如,上圖中一個組有兩個cache line,總共4個組。依然假設(shè)從地址0x0654地址讀取一個字節(jié)數(shù)據(jù)。由于cache line size是8 Bytes,因此offset需要3 bits,與前面直接映射緩存一樣。不一樣的地方是index,在兩路組相連緩存中,index只需要2 bits,因為一路只有4行cache line。上面的例子根據(jù)index找到第2行cache line(從0開始計算),第2行對應(yīng)2個cache line,分別對應(yīng)way 0和way 1。因此index也可以稱作set index(組索引)。先根據(jù)index找到set,然后將組內(nèi)的所有cache line對應(yīng)的tag取出來和地址中的tag部分對比,如果其中一個相等就意味著命中。
因此,兩路組相連緩存較直接映射緩存最大的差異就是:第一個地址對應(yīng)的數(shù)據(jù)可以對應(yīng)2個cache line,直接映射緩存一個地址只對應(yīng)一個cache line。究竟有什么好處呢?
兩路組相連緩存優(yōu)缺點
兩路組相連緩存的硬件成本相對于直接映射緩存更高。因為每次比較tag時需要比較多個cache line對應(yīng)的tag(某些硬件可能還會做并行比較,增加比較速度,這就增加了硬件設(shè)計復(fù)雜度)。為什么還需要兩路組相連緩存呢?因為可以有助于降低cache顛簸可能性。如何降低的呢?根據(jù)兩路組相連緩存的工作方式,可以畫出主存地址0x00-0x4f地址對應(yīng)的cache分布圖。

依然考慮直接映射緩存一節(jié)的問題“如果一個程序試圖依次訪問地址0x00、0x40、0x80,cache中的數(shù)據(jù)會發(fā)生什么呢?”。現(xiàn)在0x00地址的數(shù)據(jù)可以被加載到way 1,0x40可以被加載到way 0。這樣是不是就在一定程度上避免了直接映射緩存的尷尬境地呢?在兩路組相連緩存的情況下,0x00和0x40地址的數(shù)據(jù)都緩存在cache中。如果是4路組相連緩存,后面繼續(xù)訪問0x80,也可能被緩存。
因此,當cache size一定的情況下,組相連緩存對性能的提升最差情況下也和直接映射緩存一樣,在大部分情況下組相連緩存效果比直接映射緩存好。同時,降低了cache顛簸的頻率。從某種程度上來說,直接映射緩存是組相連緩存的一種特殊情況,每個組只有一個cache line。因此,直接映射緩存也可以稱作單路組相連緩存。
全相連緩存(Full associative cache)
既然組相連緩存那么好,如果所有的cache line都在一個組內(nèi)。豈不是性能更好?是的,這種緩存就是全相連緩存。依然以64 Byts大小cache為例說明。

由于所有的cache line都在一個組內(nèi),因此地址中不需要set index部分。因為,只有一個組可選擇,就是沒得選。根據(jù)地址中的tag部分和所有的cache line對應(yīng)的tag進行比較(硬件上可能并行比較也可能串行比較)。哪個tag比較相等,就意味著命中某個cache line。因此,在全相連緩存中,任意地址的數(shù)據(jù)可以緩存在任意的cache line中??梢宰畲蟪潭鹊慕档蚦ache顛簸的頻率。但是硬件成本上也是更高。
一個四路組相連緩存實例問題
考慮這么一個問題,32 KB大小4路組相連cache,cache line大小是32 Bytes。思考一下問題:
1). 多少個組? 2). 假設(shè)地址寬度是48 bits,index、offset及tag分別占用幾個bit?
總共4路,因此每路大小是8 KB。cache line size是32 Bytes,因此一共有256組(8 KB / 32 Bytes)。由于cache line size是32 Bytes,所以offset需要5位。一共256組,所以index需要8位,剩下的就是tag部分,占用35位。這個cache可以繪制下圖表示。

Cache分配策略(Cache allocation policy)
cache的分配策略是指什么情況下應(yīng)該為數(shù)據(jù)分配cache line。cache分配策略分為讀和寫兩種情況。
讀分配(read allocation):
當CPU讀數(shù)據(jù)時,發(fā)生cache缺失,都會分配一個cache line緩存從主存讀取的數(shù)據(jù)。默認情況下,cache都支持讀分配。
寫分配(write allocation):
當CPU寫數(shù)據(jù)發(fā)生cache缺失時,才會考慮寫分配策略。當不支持寫分配的情況下,寫指令只會更新主存數(shù)據(jù),然后就結(jié)束了。當支持寫分配時,首先從主存中加載數(shù)據(jù)到cache line中(相當于先做個讀分配動作),然后會更新cache line中的數(shù)據(jù)。
Cache更新策略(Cache update policy)
cache更新策略是指當發(fā)生cache命中時,寫操作應(yīng)該如何更新數(shù)據(jù)。cache更新策略分成兩種:寫直通和回寫。
寫直通(write through):
當CPU執(zhí)行store指令在cache命中時,更新cache中的數(shù)據(jù),更新主存中的數(shù)據(jù)。cache和主存的數(shù)據(jù)始終保持一致。

寫回(write back):
當CPU執(zhí)行store指令并在cache命中時,只更新cache中的數(shù)據(jù)。每個cache line中會有一個bit位記錄數(shù)據(jù)是否修改過,稱為dirty bit(前面的圖例,cache line旁邊有一個D就是dirty bit)。會將dirty bit置位。主存中的數(shù)據(jù)只會在cache line替換或者顯示clean操作時更新。因此,主存中的數(shù)據(jù)可能是未修改的數(shù)據(jù),而修改的數(shù)據(jù)躺在cache line中。
為什么cache line大小是cache控制器和主存間數(shù)據(jù)傳輸?shù)淖钚挝荒?#xff1f;因為每個cache line只有一個dirty bit。這一個dirty bit代表著整個cache line時修改的狀態(tài)。

實例
假設(shè)有一個64 Bytes大小直接映射緩存,cache line大小是8 Bytes,采用寫分配和寫回機制。當CPU從地址0x2a讀取一個字節(jié),cache中的數(shù)據(jù)將會如何變化呢?假設(shè)當前cache狀態(tài)如下圖所示。

根據(jù)index找到對應(yīng)的cache line,對應(yīng)的tag部分valid bit是合法的,但是tag的值不相等,因此發(fā)生缺失。此時需要從地址0x28地址加載8字節(jié)數(shù)據(jù)到該cache line中。但是,發(fā)現(xiàn)當前cache line的dirty bit置位。因此,cache line里面的數(shù)據(jù)不能被簡單的丟棄,由于采用寫回機制,所以需要將cache中的數(shù)據(jù)0x11223344寫到地址0x0128地址(這個地址根據(jù)tag中的值及所處的cache line行計算得到)。這個過程如下圖所示。

當寫回操作完成,將主存中0x28地址開始的8個字節(jié)加載到該cache line中,清除dirty bit。然后根據(jù)offset找到0x52返回給CPU。

參考鏈接:https://blog.csdn.net/l471094842/article/details/99673449

總結(jié)

以上是生活随笔為你收集整理的Cache Memory技术示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。