0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解計(jì)算機(jī)緩存Cache以及Cache Line

SoC芯片 ? 來源:CSDN技術(shù)社區(qū) ? 作者:MasterT-J ? 2021-06-19 09:15 ? 次閱讀

1.計(jì)算機(jī)存儲(chǔ)體系簡介

存儲(chǔ)器是分層次的,離CPU越近的存儲(chǔ)器,速度越快,每字節(jié)的成本越高,同時(shí)容量也因此越小。寄存器速度最快,離CPU最近,成本最高,所以個(gè)數(shù)容量有限,其次是高速緩存(緩存也是分級(jí),有L1,L2等緩存),再次是主存(普通內(nèi)存),再次是本地磁盤。

寄存器的速度最快,可以在一個(gè)時(shí)鐘周期內(nèi)訪問,其次是高速緩存,可以在幾個(gè)時(shí)鐘周期內(nèi)訪問,普通內(nèi)存可以在幾十個(gè)或幾百個(gè)時(shí)鐘周期內(nèi)訪問。

存儲(chǔ)器分級(jí),利用的是局部性原理。我們可以以經(jīng)典的閱讀書籍為例。我在讀的書,捧在手里(寄存器),我最近頻繁閱讀的書,放在書桌上(緩存),隨時(shí)取來讀。當(dāng)然書桌上只能放有限幾本書。我更多的書在書架上(內(nèi)存)。如果書架上沒有的書,就去圖書館(磁盤)。我要讀的書如果手里沒有,那么去書桌上找,如果書桌上沒有,去書架上找,如果書架上沒有去圖書館去找。可以對(duì)應(yīng)寄存器沒有,則從緩存中取,緩存中沒有,則從內(nèi)存中取到緩存,如果內(nèi)存中沒有,則先從磁盤讀入內(nèi)存,再讀入緩存,再讀入寄存器。

2.計(jì)算機(jī)緩存 Cache

本系列的文章重點(diǎn)介紹緩存cache。了解如何獲取cache的參數(shù),了解緩存的組織結(jié)構(gòu)。

2.1 Cache 概述

cache,中譯名高速緩沖存儲(chǔ)器,其作用是為了更好的利用局部性原理,減少CPU訪問主存的次數(shù)。簡單地說,CPU正在訪問的指令和數(shù)據(jù),其可能會(huì)被以后多次訪問到,或者是該指令和數(shù)據(jù)附近的內(nèi)存區(qū)域,也可能會(huì)被多次訪問。因此,第一次訪問這一塊區(qū)域時(shí),將其復(fù)制到cache中,以后訪問該區(qū)域的指令或者數(shù)據(jù)時(shí),就不用再從主存中取出。

cache分成多個(gè)組,每個(gè)組分成多個(gè)行,linesize是cache的基本單位,從主存向cache遷移數(shù)據(jù)都是按照linesize為單位替換的。比如linesize為32Byte,那么遷移必須一次遷移32Byte到cache。這個(gè)linesize比較容易理解,想想我們前面書的例子,我們從書架往書桌搬書必須以書為單位,肯定不能把書撕了以頁為單位。書就是linesize。當(dāng)然了現(xiàn)實(shí)生活中每本書頁數(shù)不同,但是同個(gè)cache的linesize總是相同的。

所謂8路組相連( 8-way set associative)的含義是指,每個(gè)組里面有8個(gè)行。

我們知道,cache的容量要遠(yuǎn)遠(yuǎn)小于主存,主存和cache肯定不是一一對(duì)應(yīng)的,那么主存中的地址和cache的映射關(guān)系是怎樣的呢?

拿到一個(gè)地址,首先是映射到一個(gè)組里面去。如何映射?取內(nèi)存地址的中間幾位來映射。

舉例來說,data cache: 32-KB, 8-way set associative, 64-byte line size

Cache總大小為32KB,8路組相連(每組有8個(gè)line),每個(gè)line的大小linesize為64Byte,OK,我們可以很輕易的算出一共有32K/8/64=64 個(gè)組。

對(duì)于32位的內(nèi)存地址,每個(gè)line有2^6 = 64Byte,所以地址的【0,5】區(qū)分line中的那個(gè)字節(jié)。一共有64個(gè)組。我們?nèi)?nèi)存地址中間6為來hash查找地址屬于那個(gè)組。即內(nèi)存地址的【6,11】位來確定屬于64組的哪一個(gè)組。組確定了之后,【12,31】的內(nèi)存地址與組中8個(gè)line挨個(gè)比對(duì),如果【12,31】為與某個(gè)line一致,并且這個(gè)line為有效,那么緩存命中。

OK,我們可以將cache分成三類,

直接映射高速緩存,這個(gè)簡單,即每個(gè)組只有一個(gè)line,選中組之后不需要和組中的每個(gè)line比對(duì),因?yàn)橹挥幸粋€(gè)line。

組相聯(lián)高速緩存,這個(gè)就是我們前面介紹的cache。S個(gè)組,每個(gè)組E個(gè)line。

全相聯(lián)高速緩存,這個(gè)簡單,只有一個(gè)組,就是全相聯(lián)。不用hash來確定組,直接挨個(gè)比對(duì)高位地址,來確定是否命中??梢韵胍娺@種方式不適合大的緩存。想想看,如果4M 的大緩存linesize為32Byte,采用全相聯(lián)的話,就意味著4*1024*1024/32 = 128K 個(gè)line挨個(gè)比較,來確定是否命中,這是多要命的事情。高速緩存立馬成了低速緩存了。

描述一個(gè)cache需要以下參數(shù):

cache分級(jí),L1 cache, L2 cache, L3 cache,級(jí)別越低,離CPU越近

cache的容量

cache的linesize

cache 每組的行個(gè)數(shù)。

2.2 Cache 結(jié)構(gòu)

假設(shè)內(nèi)存容量為M,內(nèi)存地址為m位:那么尋址范圍為000…00~FFF…F(m位)

倘若把內(nèi)存地址分為以下三個(gè)區(qū)間:

tag, set index, block offset三個(gè)區(qū)間有什么用呢?再來看看Cache的邏輯結(jié)構(gòu)吧:

參數(shù)如下:

B = 2^b

S = 2^s

現(xiàn)在來解釋一下各個(gè)參數(shù)的意義:

一個(gè)cache被分為S個(gè)組,每個(gè)組有E個(gè)cacheline,而一個(gè)cacheline中,有B個(gè)存儲(chǔ)單元,現(xiàn)代處理器中,這個(gè)存儲(chǔ)單元一般是以字節(jié)(通常8個(gè)位)為單位的,也是最小的尋址單元。因此,在一個(gè)內(nèi)存地址中,中間的s位決定了該單元被映射到哪一組,而最低的b位決定了該單元在cacheline中的偏移量。

valid通常是一位,代表該cacheline是否是有效的(當(dāng)該cacheline不存在內(nèi)存映射時(shí),當(dāng)然是無效的)。tag就是內(nèi)存地址的高t位,因?yàn)榭赡軙?huì)有多個(gè)內(nèi)存地址映射到同一個(gè)cacheline中,所以該位是用來校驗(yàn)該cacheline是否是CPU要訪問的內(nèi)存單元。

當(dāng)tag和valid校驗(yàn)成功是,我們稱為cache命中,這時(shí)只要將cache中的單元取出,放入CPU寄存器中即可。

當(dāng)tag或valid校驗(yàn)失敗的時(shí)候,就說明要訪問的內(nèi)存單元(也可能是連續(xù)的一些單元,如int占4個(gè)字節(jié),double占8個(gè)字節(jié))并不在cache中,這時(shí)就需要去內(nèi)存中取了,這就是cache不命中的情況(cache miss)。當(dāng)不命中的情況發(fā)生時(shí),系統(tǒng)就會(huì)從內(nèi)存中取得該單元,將其裝入cache中,與此同時(shí)也放入CPU寄存器中,等待下一步處理。注意,以下這一點(diǎn)對(duì)理解linux cache機(jī)制非常重要:

3.計(jì)算機(jī)緩存行 ChaceLine

高速緩存其實(shí)就是一組稱之為緩存行(cache line)的固定大小的數(shù)據(jù)塊,其大小是以突發(fā)讀或者突發(fā)寫周期的大小為基礎(chǔ)的。

每個(gè)高速緩存行完全是在一個(gè)突發(fā)讀操作周期中進(jìn)行填充或者下載的。即使處理器只存取一個(gè)字節(jié)的存儲(chǔ)器,高速緩存控制器也啟動(dòng)整個(gè)存取器訪問周期并請(qǐng)求整個(gè)數(shù)據(jù)塊。緩存行第一個(gè)字節(jié)的地址總是突發(fā)周期尺寸的倍數(shù)。緩存行的起始位置總是與突發(fā)周期的開頭保持一致。

當(dāng)從內(nèi)存中取單元到cache中時(shí),會(huì)一次取一個(gè)cacheline大小的內(nèi)存區(qū)域到cache中,然后存進(jìn)相應(yīng)的cacheline中。

例如:我們要取地址 (t, s, b) 內(nèi)存單元,發(fā)生了cache miss,那么系統(tǒng)會(huì)取 (t, s, 00…000) 到 (t, s, FF…FFF)的內(nèi)存單元,將其放入相應(yīng)的cacheline中。

下面看看cache的映射機(jī)制:

當(dāng)E=1時(shí), 每組只有一個(gè)cacheline。那么相隔2^(s+b)個(gè)單元的2個(gè)內(nèi)存單元,會(huì)被映射到同一個(gè)cacheline中。(好好想想為什么?)

當(dāng)1《E《C/B時(shí),每組有E個(gè)cacheline,不同的地址,只要中間s位相同,那么就會(huì)被映射到同一組中,同一組中被映射到哪個(gè)cacheline中是依賴于替換算法的。

當(dāng)E=C/B,此時(shí)S=1,每個(gè)內(nèi)存單元都能映射到任意的cacheline。帶有這樣cache的處理器幾乎沒有,因?yàn)檫@種映射機(jī)制需要昂貴復(fù)雜的硬件來支持。

不管哪種映射,只要發(fā)生了cache miss,那么必定會(huì)有一個(gè)cacheline大小的內(nèi)存區(qū)域,被取到cache中相應(yīng)的cacheline。

現(xiàn)代處理器,一般將cache分為2~3級(jí),L1, L2, L3。L1一般為CPU專有,不在多個(gè)CPU中共享。L2 cache一般是多個(gè)CPU共享的,也可能裝在主板上。L1 cache還可能分為instruction cache, data cache. 這樣CPU能同時(shí)取指令和數(shù)據(jù)。

下面來看看現(xiàn)實(shí)中cache的參數(shù),以Intel Pentium處理器為例。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19118

    瀏覽量

    228865
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7440

    瀏覽量

    163529
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7383

    瀏覽量

    87641

原文標(biāo)題:計(jì)算機(jī)緩存Cache以及Cache Line詳解

文章出處:【微信號(hào):gh_9d9a609c9302,微信公眾號(hào):SoC芯片】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Cache和內(nèi)存有什么區(qū)別

    Cache(高速緩存)和內(nèi)存(Memory,通常指主存儲(chǔ)器或RAM)是計(jì)算機(jī)存儲(chǔ)系統(tǒng)中兩個(gè)重要的組成部分,它們?cè)?b class='flag-5'>計(jì)算機(jī)的性能和數(shù)據(jù)處理中扮演著不同的角色。以下是對(duì)
    的頭像 發(fā)表于 09-26 15:28 ?836次閱讀

    計(jì)算機(jī)存儲(chǔ)系統(tǒng)的構(gòu)成

    計(jì)算機(jī)存儲(chǔ)系統(tǒng)是計(jì)算機(jī)中用于存放程序和數(shù)據(jù)的設(shè)備或部件的集合,它構(gòu)成了計(jì)算機(jī)信息處理的基礎(chǔ)。一個(gè)完整的計(jì)算機(jī)存儲(chǔ)系統(tǒng)通常包括多個(gè)層次的存儲(chǔ)器,從高速
    的頭像 發(fā)表于 09-26 15:25 ?481次閱讀

    寄存器和高速緩存有什么區(qū)別

    寄存器和高速緩存Cache)都是計(jì)算機(jī)系統(tǒng)中用于存儲(chǔ)數(shù)據(jù)的重要組成部分,但它們?cè)诠δ堋⑽恢?、容量、速?b class='flag-5'>以及使用方式上存在著顯著的區(qū)別。
    的頭像 發(fā)表于 09-10 14:32 ?828次閱讀

    晶體管計(jì)算機(jī)和電子管計(jì)算機(jī)有什么區(qū)別

    晶體管計(jì)算機(jī)和電子管計(jì)算機(jī)作為計(jì)算機(jī)發(fā)展史上的兩個(gè)重要階段,它們?cè)诙鄠€(gè)方面存在顯著的區(qū)別。以下是對(duì)這兩類計(jì)算機(jī)在硬件、性能、應(yīng)用以及技術(shù)發(fā)展
    的頭像 發(fā)表于 08-23 15:28 ?1249次閱讀

    什么是CPU緩存?它有哪些作用?

    CPU緩存Cache Memory)是計(jì)算機(jī)系統(tǒng)中一個(gè)至關(guān)重要的組成部分,它位于CPU與內(nèi)存之間,作為兩者之間的臨時(shí)存儲(chǔ)器。CPU緩存的主要作用是減少CPU訪問內(nèi)存所需的時(shí)間,從而提
    的頭像 發(fā)表于 08-22 14:54 ?2146次閱讀

    Cortex R52內(nèi)核Cache的具體操作(2)

    本節(jié)內(nèi)容主要講述CortexR52內(nèi)核Cache的具體操作包括使緩存無效(invalidate)操作,清除(clean)緩存。有的時(shí)候客戶可能需要對(duì)cache做一些清理,比如inval
    的頭像 發(fā)表于 07-15 15:44 ?1185次閱讀
    Cortex R52內(nèi)核<b class='flag-5'>Cache</b>的具體操作(2)

    Cortex R52內(nèi)核Cache的相關(guān)概念(1)

    在開始閱讀本系列文章之前,請(qǐng)先參閱《有關(guān)CR52 MPU配置說明》。因?yàn)檫@篇文章講述了,cache配置所涉及到的寄存器的設(shè)置和MPU的一些基本概念。如果讀者都已經(jīng)理解了上述內(nèi)容,可以跳過。本章內(nèi)容主要講述cache屬性的具體含意、注意事項(xiàng)、
    的頭像 發(fā)表于 07-15 10:37 ?1269次閱讀
    Cortex R52內(nèi)核<b class='flag-5'>Cache</b>的相關(guān)概念(1)

    CortexR52內(nèi)核Cache的具體操作

    本節(jié)內(nèi)容主要講述CortexR52內(nèi)核Cache的具體操作包括使緩存無效(invalidate)操作,清除(clean)緩存。有的時(shí)候客戶可能需要對(duì)cache做一些清理,比如inval
    的頭像 發(fā)表于 07-15 10:32 ?1130次閱讀
    CortexR52內(nèi)核<b class='flag-5'>Cache</b>的具體操作

    工業(yè)計(jì)算機(jī)與普通計(jì)算機(jī)的區(qū)別

    在信息化和自動(dòng)化日益發(fā)展的今天,計(jì)算機(jī)已經(jīng)成為了我們?nèi)粘I詈凸ぷ髦胁豢苫蛉钡墓ぞ?。然而,?b class='flag-5'>計(jì)算機(jī)領(lǐng)域中,工業(yè)計(jì)算機(jī)和普通計(jì)算機(jī)雖然都具備基本的計(jì)算
    的頭像 發(fā)表于 06-06 16:45 ?1114次閱讀

    STM32h7開啟Cache后,串口發(fā)送DMA會(huì)導(dǎo)致中斷觸發(fā)如何解決?

    STM32h7 開啟Cache后,串口使用發(fā)送DMA發(fā)送數(shù)據(jù)會(huì)導(dǎo)致中斷觸發(fā)(只開啟接收空閑中斷),接收和發(fā)送的緩存指定在手動(dòng)分配的內(nèi)存區(qū)域(此區(qū)域通過MPU配置,關(guān)閉了Cache功能),此問題有辦法解決嗎?
    發(fā)表于 03-12 07:37

    【量子計(jì)算機(jī)重構(gòu)未來 | 閱讀體驗(yàn)】+量子計(jì)算機(jī)的原理究竟是什么以及有哪些應(yīng)用

    本書內(nèi)容從目錄可以看出本書主要是兩部分內(nèi)容,一部分介紹量子計(jì)算機(jī)原理,一部分介紹其應(yīng)用。 其實(shí)個(gè)人也是抱著對(duì)這兩個(gè)問題的興趣來看的。 究竟什么是量子計(jì)算機(jī)相信很多讀者都是抱著這個(gè)疑問
    發(fā)表于 03-11 12:50

    先楫HPM片上Cache使用指南經(jīng)驗(yàn)分享

    高速緩存Cache)主要是為了解決CPU運(yùn)算速度與內(nèi)存(Memory)讀寫速度不匹配的矛盾而存在, 是CPU與存儲(chǔ)設(shè)備之間的臨時(shí)存貯器,容量小,但是交換速度比內(nèi)存快。內(nèi)置高速緩存通常對(duì)CPU的性能提升具有較大作用。
    的頭像 發(fā)表于 01-22 16:07 ?1181次閱讀
    先楫HPM片上<b class='flag-5'>Cache</b>使用指南經(jīng)驗(yàn)分享

    buffer和cache的區(qū)別

    buffer和cache的區(qū)別 緩沖區(qū)(Buffer)和緩存Cache)是計(jì)算機(jī)系統(tǒng)中用于提高數(shù)據(jù)讀寫效率的兩個(gè)關(guān)鍵概念,它們雖然功能有所重疊,但在實(shí)際應(yīng)用中存在一些差異。在下文中,
    的頭像 發(fā)表于 12-07 11:00 ?786次閱讀

    CPU Cache是如何保證緩存一致性的?

    我們介紹`CPU Cache`的組織架構(gòu)及其進(jìn)行**讀操作**時(shí)的尋址方式,但是緩存不僅僅只有讀操作,還有 **寫操作** ,這會(huì)帶來一個(gè)新的問題
    的頭像 發(fā)表于 12-04 15:05 ?1285次閱讀
    CPU <b class='flag-5'>Cache</b>是如何保證<b class='flag-5'>緩存</b>一致性的?

    Spring Cache緩存常規(guī)配置

    作者最近在開發(fā)公司項(xiàng)目時(shí)使用到 Redis 緩存,并在翻看前人代碼時(shí),看到了一種關(guān)于 @Cacheable 注解的自定義緩存有效期的解決方案,感覺比較實(shí)用,因此作者自己拓展完善了一番后分享給各位。
    的頭像 發(fā)表于 11-28 10:44 ?562次閱讀
    Spring <b class='flag-5'>Cache</b><b class='flag-5'>緩存</b>常規(guī)配置