Cache學習(2):Cache結構 命中與缺失 多級Cache結構 直接映射緩存

1 Cache名詞解釋

  • 命中(hit): CPU要訪問的數據在Cache中有緩存
  • 缺失(miss): CPU要訪問的數據在Cache中沒有緩存
  • Cache Size:Cache的大小,代表Cache可以緩存最大數據的大小
  • Cache Line:Cache會被平均分成很多相等的塊,每一個塊大小稱之為Cache Line Size;Cache Line是Cache和主存之間數據傳輸的最小單位。當CPU試圖load一個字節數據的時候,如果Cache缺失,那么Cache控制器會從主存中一次性的load一個Cache Line大小的數據到Cache中。例如,Cache Line大小是8字節。CPU即使讀取一個Byte,在Cache 出現miss后,Cache會從主存中load 8字節填充整個Cache Line。

Cache Size 為 64 Bytes的Cache舉兩個例子:

  • 將64 Bytes平均分成64塊,那么Cache Line就是1字節,總共64行Cache Line
  • 將64 Bytes平均分成8塊,那么Cache Line就是8字節,總共8行Cache Line

現在的硬件設計中,一般Cache Line的大小是4-128 Byts。會有如下兩個問題:

  • Cache如何判斷是否命中
  • 這個值為什么不是更低,低至1字節,這樣就可以更加靈活的映射,從而沒有刷新整個cache line的開銷
  • 這個值為什么不是更高或者更低
  • 為什么一次要讀取整個Cache Line

將在后文中進行解釋說明。

2 多級Cache之間的配合工作

當CPU試圖從某地址load數據時,下圖為只有兩級Cache的系統舉例:

  • 從L1 Cache中查詢是否命中,如果命中則把數據返回給CPU(藍色實線)
  • L1 Cache缺失,則繼續從L2 Cache中查找。當L2 Cache命中時,數據會返回給L1 Cache以及CPU(綠色實線&綠色虛線)
  • L2 Cache也缺失,需要從主存中load數據,將數據返回給L2 Cache、L1 Cache及CPU(紅色實線&紅色虛線)

image-20231123002418504

這種多級Cache的工作方式稱之為inclusive Cache。某一地址的數據可能存在多級緩存中。與Inclusive Cache對應的是Exclusive Cache,這種Cache保證某一地址的數據緩存只會存在于多級Cache其中一級。也就是說,任意地址的數據不可能同時在L1和L2 Cache中緩存。

3 直接映射緩存(Direct Mapped Cache)

3.1 舉例1

以一個Cache Size 為 128 Bytes 并且Cache Line是 16 Bytes的Cache為例。首先把這個Cache想象成一個數組,數組總共8個元素,每個元素大小是 16 Bytes,如下圖:

image-20231123010312213

現在考慮一個問題,CPU從0x0654地址讀取一個字節,由于Cache大小相對于主存來說,是非常小的。所以Cache只能緩存主存中極小一部分數據。如何根據地址在有限大小的Cache中查找數據呢?現在硬件采取的做法是對地址進行散列(可以理解成地址取模操作)。

3.2 命中與缺失

經過如下計算:

  • 假設地址總線是16位,目標地址為0x0654,轉換為二進制為 0000,0110,0101,0100
  • Offset:由于每個Cache Line中有16 Byte,所以地址最低4位,即為每一個Cache Line中的偏移Offset,標記在這個Cache Line中的具體位置是哪個字節,舉例中為0100,即為圖中地址段的藍色背景部分
  • Index:由于一共有8個Cache Line,所以地址除去最低4位的后3位,即為不同Cache Line的索引Index,標記具體在整個Cache 中的那一個Cache Line,舉例中為101,即為圖中地址段的綠色背景部分

image-20231124003425693

如果兩個不同的地址,其地址的Index部分完全一樣,這兩個地址經過硬件散列之后都會找到同一個Cache Line。所以,根據地址確定到Cache Line之后,只代表所需要訪問的目標地址中存儲的對應數據可能存在這個Cache Line中,但是該Cache Line也有可能存儲其他地址對應的數據。

所以,獨立于Data Array,又引入Tag Array區域,Tag Array和Data Array中的每一個Cache Line都有著一一對應關系。每一個Cache Line都對應唯一一個tag,tag中保存的是整個地址位寬去除index和offset使用的bit剩余部分(如上圖地址粉色背景部分)。tag、index和offset三者組合就可以唯一確定一個地址了。

因此,根據地址中index位找到Cache Line后,取出當前Cache Line對應的tag,然后和目標地址的tag進行比較,如果相等,這說明Cache命中。如果不相等,說明當前Cache Line存儲的是其他地址的數據,這就是Cache缺失。

在上述圖中,我們看到tag的值是0,0000,1100,和地址中的tag部分相等,因此在本次訪問會命中。

我們可以從圖中看到tag旁邊還有一個valid bit,這個bit用來表示Cache Line中數據是否有效(例如:1代表有效;0代表無效)。當系統剛啟動時,Cache中的數據都應該是無效的,因為還沒有緩存任何數據。Cache控制器可以根據valid bit確認當前Cache Line數據是否有效。所以,上述比較tag確認Cache Line是否命中之前還會檢查valid bit是否有效。只有在有效的情況下,比較tag才有意義。如果無效,直接判定Cache缺失。

此時回答,前文提出的第二個問題:這個值為什么不是更低,低至1字節,這樣就可以更加靈活的映射,從而避免了因為部分所需要的數據而刷新整個Cache Line的開銷

由于tag的引入。這樣會導致硬件成本的上升,將兩種情況進行對比:

  • 原本Cache Line 設置為16 Byte:每16 Byte對應一個tag,需要8個tag
  • 假設Cache Line設置為1 Byte:需要128個Tag同時每一個Tag的長度也會更長,因為Offest縮短了

因此可以發現這樣做占用了很多內存。需要注意:tag也是Cache的一部分,但是談到Cache size的時候并不考慮tag占用的內存部分。

上面的例子中,總結如下:Cache Size是128 Byte并且Cache Line size是16 Byte,共計8個Cache Line。

  • offset:4bit
  • index:3bit
  • tag:9bits(假設地址寬度是16 bit)

3.3 直接映射緩存的優缺點

  • 優點1:直接映射緩存在硬件設計上會更加簡單
  • 優點2:因為優點1,所以成本上也會較低

根據直接映射緩存的工作方式,可以計算出不同主存地址段和對應的Cache

地址段Cahce Line Index
0x0000-0x000F,0x0080-0x008F,…0
0x0010-0x001F,0x0090-0x009F,…1
0x0020-0x002F,0x00A0-0x00AF,…2
0x0030-0x003F,0x00B0-0x00BF,…3
0x0040-0x004F,0x00C0-0x00CF,…4
0x0050-0x005F,0x00D0-0x00DF,…5
0x0060-0x006F,0x00E0-0x00EF,…6
0x0070-0x007F,0x00F0-0x00FF,…7

可以看到,地址0x0000-0x007F地址(0x0000-0x000F~0x0070-0x007F)處對應的數據可以覆蓋整個Cache。0x0080-0x00FF地址的數據也同樣是覆蓋整個Cache。

現在思考一個問題,如果一個程序試圖依次訪問地址0x0000、0x0080、0x0100,Cache中的數據會發生什么呢?首先應該明白0x0000、0x0080、0x0100地址中index部分是一樣的。因此,這3個地址對應的Cache Line是同一個。所以,當訪問0x0000地址時,Cache會缺失,然后數據會從主存中加載到Cache中第0行Cache Line。當我們訪問0x0080地址時,依然索引到Cache中第0行Cache Line,由于此時Cache Line中存儲的是地址0x0000地址對應的數據,所以此時依然會Cache缺失。然后從主存中加載0x0080地址數據到第一行Cache Line中。同理,繼續訪問0x0100地址,依然會Cache缺失。這就相當于每次訪問數據都要從主存中讀取,所以Cache的存在并沒有對性能有什么提升。訪問0x0080地址時,就會把0x00地址緩存的數據替換。這種現象叫做Cache顛簸(Cache thrashing)。針對這個問題,在后面的文章中引入多路組相連緩存優化規避這一問題。

image-20231124012346869

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165219.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165219.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

快速在WIN11中本地部署chatGLM3

具體請看智譜倉庫github:GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 開源雙語對話語言模型 或者Huggingface:https://huggingface.co/THUDM/chatglm3-6b 1. 利用Anaconda建立一個虛擬環境: conda create -n chatglm3 pyt…

2023全球數字貿易創新大賽-人工智能元宇宙-11-12,數據二十條,數字產業化和產業數字化

目錄 長沙千博信息技術有限公司-手語翻譯 數據二十條 數字產業化和產業數字化

java--static的應用知識:單例設計模式

1.什么是設計模式(Design pattern) ①一個問題通常有n中解法,其中肯定有一種解法最優的,這個最優的解法被人總結出來了,稱之為設計模式。 ②設計模式有20多種,對應20多種軟件開發中會遇到的問題。 2.單例設計模式 確保一個類只…

Linux安裝與配置Maven

案例中Linux版本為CentOS7.9,安裝目錄為 /root/software/ 1、使用 wget 命令從官網下載安裝包(https://maven.apache.org/download.cgi) wget https://dlcdn.apache.org/maven/maven-3/3.9.5/binaries/apache-maven-3.9.5-bin.tar.gz2、解壓…

搭建線上jvm監控

這里寫目錄標題 Springboot項目配置maven依賴application.properties添加監控JVM的配置類啟動springboot項目 Prometheus配置配置grafana Springboot項目配置 maven依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring…

mac mysql連接中斷重新啟動辦法

遇到如圖所示問題&#xff0c;可以用下面的命令重啟mysql服務 sudo /usr/local/mysql/support-files/mysql.server start

詳解分布式微服務架構

目錄 一、微服務簡介 1、分布式微服務架的誕生 2、微服務架構與SOA架構的區別 3、微服務框架引來的問題 二、服務通信 RESTful API&#xff1a; 消息隊列&#xff08;如RabbitMQ、Kafka&#xff09;&#xff1a; gRPC&#xff1a; GraphQL&#xff1a; Service Mesh&…

Vector - CANoe - Vector Hardware Manager以太網

前面的文章中有介紹過基于Network based mode和channel base mode的環境配置&#xff0c;不過我們都是使用比較舊的辦法&#xff0c;在我使用了一段時間Vector Hardware Manager配置之后發現這個更加好用結合之前的配置方法&#xff0c;使用起來也更加的靈活&#xff0c;今天就…

HTML的學習

知己知彼百戰不殆 打算學習一下javascript 所以先從基礎的html語言開始 其實就是頭部 和身體 頭部控制整個 html的語言 title等 <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"width…

61 權限提升-RedisPostgre令牌竊取進程注入

目錄 演示案例:Redis數據庫權限提升-計劃任務PostgreSQL數據庫權限提升Windows2008&7令牌竊取提升-本地Windows2003&10進程注入提升-本地pinjector進程注入工具針對-win2008以前操作系統pexec64 32進程注入工具針對-win2008及后操作系統- (佛系) 涉及資源: postgersql是…

面試送分題!“商品分類瀏覽”如何測試?

電商項目無論是工作中&#xff0c;還是面試中&#xff0c;都是一個高頻出現的詞。 面試官非常熱衷提問關于電商項目的問題。例如商品分類怎么測試&#xff1f;購物車怎么測試&#xff1f;訂單怎么測試&#xff1f;優惠券怎么測試&#xff1f;支付怎么測試&#xff1f;等等。 …

深度學習技術前沿:探索與挑戰

深度學習技術前沿&#xff1a;探索與挑戰 一、引言 近年來&#xff0c;深度學習作為人工智能領域的重要分支&#xff0c;取得了令人矚目的成就。它憑借強大的學習能力和出色的性能&#xff0c;在圖像識別、語音識別、自然語言處理等眾多任務中展現出巨大潛力。本文將深入探討深…

Vue 2.0源碼分析-new Vue 發生了什么?

從入口代碼開始分析&#xff0c;我們先來分析 new Vue 背后發生了哪些事情。我們都知道&#xff0c;new 關鍵字在 Javascript 語言中代表實例化是一個對象&#xff0c;而 Vue 實際上是一個類&#xff0c;類在 Javascript 中是用 Function 來實現的&#xff0c;來看一下源碼&…

Hive csv文件導入Hive

一、如何把csv文件導入Hive (1) 在Hive中建立與csv相對應的表 create table if not exists tmp.tmp_wenxin_20231123 (redeem_code_id string comment ) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE;創建了一張名為tmp_wenxin_20231123的hive表&am…

Ubuntu 22.04安裝vscode

要在Ubuntu 22.04安裝vscode&#xff0c;請完成這些步驟。 首先apt命令更新軟件包索引并安裝導入微軟GPG密鑰的依賴軟件。 更新&#xff0c;近期內執行過可忽略 sudo apt update安裝工具包 sudo apt install software-properties-common apt-transport-https curl當導入GPG后…

jupyter notebook 不知道密碼,怎么登錄解決辦法

jupyter notebook 不知道密碼&#xff0c;怎么登錄解決辦法 1、 windows下&#xff0c;打開命令行&#xff0c;輸入jupyter notebook list &#xff1a; C:\Users\tom>jupyter notebook list Currently running servers: http://localhost:8888/?tokenee8bb2c28a89c8a24d…

【LeetCode刷題-鏈表】--61.旋轉鏈表

61.旋轉鏈表 方法&#xff1a; 記給定的鏈表的長度為n,注意當向右移動的次數k>n時&#xff0c;僅需要向右移動k mod n次即可&#xff0c;因為每n次移動都會讓鏈表變為原狀 將給定的鏈表連接成環&#xff0c;然后將指定位置斷開 /*** Definition for singly-linked list.*…

Nginx模塊開發之http handler實現流量統計(1)

文章目錄 一、handler簡介二、Nginx handler模塊開發2.1、示例代碼2.2、編寫config文件2.3、編譯模塊到Nginx源碼中2.4、修改conf文件2.5、執行效果 三、Nginx的熱更新總結 一、handler簡介 Handler模塊就是接受來自客戶端的請求并產生輸出的模塊。 配置文件中使用location指令…

HBuilderX前端軟件社區+Thinkphp后端源碼

HBuilderX前端軟件社區thinkphp后端源碼&#xff0c;搭建好后臺在前端找到 util 這個文件把兩個js文件上面的填上自己的域名&#xff0c;登錄HBuilderX賬號沒有賬號就注冊賬號然后上傳文件即可。打包選擇發行 可以打包app或h5等等 后端設置運行目錄為public(重要)&#xff0c;…

大語言模型——BERT和GPT的那些事兒

前言 自然語言處理是人工智能的一個分支。在自然語言處理領域&#xff0c;有兩個相當著名的大語言模型——BERT和GPT。兩個模型是同一年提出的&#xff0c;那一年BERT以不可抵擋之勢&#xff0c;讓整個人工智能屆為之震動。據說當年BERT的影響力是GPT的十倍以上。而現在&#…