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

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

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

關(guān)于Cache的其它內(nèi)容

Linux閱碼場(chǎng) ? 來源:Linux閱碼場(chǎng) ? 作者:甄建勇 ? 2021-11-21 11:12 ? 次閱讀

關(guān)于Cache的其它內(nèi)容

上面我們所描述情況,在訪問cache前,已經(jīng)將虛擬地址轉(zhuǎn)換成了物理地址,其實(shí),不一定,也可是是虛擬地址直接訪問cache,倒底是使用物理地址還是虛擬地址,這就是翻譯方式的選擇。

(1)虛緩存

一個(gè)簡單的方案就是緩存的標(biāo)簽索引均使用虛擬地址。這種緩存稱為虛緩存(virtualcache)。這種緩存的優(yōu)點(diǎn)是僅在緩存失效時(shí)才需要進(jìn)行頁面翻譯。由于緩存命中率很高,需要翻譯的次數(shù)也相對(duì)較少。

但是這種技術(shù)也存在嚴(yán)重的問題。

第一,引入虛擬地址的一個(gè)重要原因是在軟件(操作系統(tǒng))級(jí)進(jìn)行頁面保護(hù),以防止進(jìn)程間相互侵犯地址空間。由于這種保護(hù)是通過頁表和翻譯旁視緩沖器(TLB)中的保護(hù)位(protectionbit)實(shí)現(xiàn)的,直接使用虛擬地址來訪問數(shù)據(jù)等于繞過了頁面保護(hù)。一個(gè)解決辦法是在緩存失效時(shí)查看TLB對(duì)應(yīng)表項(xiàng)的保護(hù)位以確定是否可以加載缺失的數(shù)據(jù)。

第二,由于不同進(jìn)程使用相同的虛擬地址空間,在切換進(jìn)程后會(huì)出現(xiàn)整個(gè)緩存都不再對(duì)應(yīng)新進(jìn)程的有效數(shù)據(jù)。如果前后兩個(gè)進(jìn)程使用了相同的地址區(qū)間,就可能會(huì)造成緩存命中,確訪問了錯(cuò)誤的地址,導(dǎo)致程序錯(cuò)誤。有兩個(gè)解決辦法:其一,進(jìn)程切換后清空緩存。代價(jià)過高。其二,使用進(jìn)程標(biāo)識(shí)符(PID)作為緩存標(biāo)簽的一部分,以區(qū)分不同進(jìn)程的地址空間。

第三,別名問題(Alias)。由于操作系統(tǒng)可能允許頁面別名,即多個(gè)虛擬頁面映射至同一物理頁面,使用虛擬地址做標(biāo)簽將可能導(dǎo)致一份數(shù)據(jù)在緩存中出現(xiàn)多份拷貝的情形。這種情況下如果對(duì)其中一份拷貝作出修改,而其他拷貝沒有同步更新,則數(shù)據(jù)喪失整合性,導(dǎo)致程序錯(cuò)誤。有兩個(gè)解決辦法:其一,硬件級(jí)反別名。當(dāng)緩存載入目標(biāo)數(shù)據(jù)時(shí),確認(rèn)緩存內(nèi)沒有緩存塊的標(biāo)簽是此地址的別名。如果有則不載入,而直接返回別名緩存塊內(nèi)的數(shù)據(jù)。其二,頁面著色(PageColoring)。這種技術(shù)是由操作系統(tǒng)對(duì)頁面別名作出限制,使指向同一頁面的別名頁面具有相同的低端地址。這樣,只要緩存的索引范圍足夠小,就能保證在緩存中決不會(huì)出現(xiàn)來自不同別名頁面的數(shù)據(jù)。

第四,輸入輸出問題。由于輸入輸出系統(tǒng)通常只使用物理地址,虛緩存必須引入一種逆映射技術(shù)來實(shí)現(xiàn)虛擬地址到物理地址的轉(zhuǎn)換。

(2)實(shí)緩存

實(shí)緩存(physicalcache)完全使用物理地址做緩存塊的標(biāo)簽和索引,故地址翻譯必須在訪問緩存之前進(jìn)行。這種傳統(tǒng)方法所以可行的一個(gè)重要原因是TLB的訪問周期非常短(因?yàn)楸举|(zhì)上TLB也是一個(gè)緩存),因而可以被納入流水線。

但是,由于地址翻譯發(fā)生在緩存訪問之前,會(huì)比虛緩存更加頻繁地造成TLB。(相比之下,虛緩存僅在本身失效的前提下才會(huì)訪問TLB,進(jìn)而有可能引發(fā)TLB失效)實(shí)緩存在運(yùn)行中存在這樣一種可能:首先觸發(fā)了一個(gè)TLB失效,然后從頁表中更換TLB表項(xiàng)(假定頁表中能找到)。然后再重新訪問TLB,翻譯地址,最后發(fā)現(xiàn)數(shù)據(jù)不在緩存中。

(3)虛索引、實(shí)標(biāo)簽緩存

一個(gè)折中方案是同時(shí)使用虛索引和實(shí)標(biāo)簽(virtuallyindexed, physically tagged)。這種緩存利用了頁面技術(shù)的一個(gè)特征,即虛擬地址和物理地址享有相同的頁內(nèi)偏移值(pageoffset)。這樣,可以使用頁內(nèi)偏移作為緩存索引,同時(shí)使用物理頁面號(hào)作為標(biāo)簽。這種混合方式的好處在于,其既能有效消除諸如別名引用等純虛緩存的固有問題,又可以通過對(duì)TLB和緩存的并行訪問來縮短流水線延遲。

這種技術(shù)的一個(gè)缺點(diǎn)是,在使用直接匹配緩存的前提下,緩存大小不能超過頁面大小,否則頁面偏移范圍就不足以覆蓋緩存索引范圍。這個(gè)弊端可以通過提高組相聯(lián)路數(shù)來改善。

(4)多級(jí)cache

介于處理器和內(nèi)存二者之間的緩存有兩個(gè)天然沖突的性能指標(biāo):速度和容量。如果只向處理器看齊而追求速度,則必然要靠減少容量來換取訪問時(shí)間;如果只向內(nèi)存看齊而追求容量,則必然以增加處理器的訪問時(shí)間為犧牲。這種矛盾促使人們考慮使用多級(jí)緩存。

在一個(gè)兩級(jí)緩存體系中,一級(jí)緩存靠近處理器一側(cè),二級(jí)緩存靠近內(nèi)存一側(cè)。當(dāng)一級(jí)緩存發(fā)生失效時(shí),它向二級(jí)緩存發(fā)出請(qǐng)求。如果請(qǐng)求在二級(jí)緩存上命中,則數(shù)據(jù)交還給一級(jí)緩存;如失效,二級(jí)緩存進(jìn)一步向內(nèi)存發(fā)出請(qǐng)求。對(duì)于三級(jí)緩存可依此類推。

通常,更接近內(nèi)存的緩存有著更大容量,但是速度也更慢。

值得注意的是,無論如何,低級(jí)緩存的局部命中率總是低于高級(jí)緩存。這是因?yàn)閿?shù)據(jù)的時(shí)空局部性在一級(jí)緩存上基本上已經(jīng)利用殆盡。

對(duì)于各級(jí)cache,雖然功能類似,但不同級(jí)別的緩存在設(shè)計(jì)和實(shí)現(xiàn)上也有不同之處。

一般而言,在存儲(chǔ)體系結(jié)構(gòu)中低級(jí)存儲(chǔ)總是包含高級(jí)存儲(chǔ)的全部數(shù)據(jù),但對(duì)于多級(jí)緩存則未必。相反地,存在一種多級(jí)排他性(Multilevelexclusion)的設(shè)計(jì)。此種設(shè)計(jì)意指高級(jí)緩存中的內(nèi)容和低級(jí)緩存的內(nèi)容完全不相交。這樣,如果一個(gè)高級(jí)緩存請(qǐng)求失效,并在次級(jí)緩存中命中的話,次級(jí)緩存會(huì)將命中數(shù)據(jù)和高級(jí)緩存中的一項(xiàng)進(jìn)行交換,以保證排他性。

多級(jí)排他性的好處是在存儲(chǔ)預(yù)算有限的前提下可以讓低級(jí)緩存更多地存儲(chǔ)數(shù)據(jù)。否則低級(jí)緩存的大量空間將不得不用于覆蓋高級(jí)緩存中的數(shù)據(jù),這無益于提高低級(jí)緩存的命中率。

當(dāng)然,也可以如內(nèi)存對(duì)緩存般,使用多級(jí)包容性(Multilevelinclusion)設(shè)計(jì)。這種設(shè)計(jì)的優(yōu)點(diǎn)是比較容易方便查看緩存和內(nèi)存間的數(shù)據(jù)一致性,因?yàn)閮H檢查最低一級(jí)緩存即可。對(duì)于多級(jí)排他性緩存這種檢查必須在各級(jí)上分別進(jìn)行。這種設(shè)計(jì)的一個(gè)主要缺點(diǎn)是,一旦低級(jí)緩存由于失效而被更新,就必須相應(yīng)更新在高級(jí)緩存上所有對(duì)應(yīng)的數(shù)據(jù)。因此,通常令各級(jí)緩存的緩存塊大小一致,從而減少低級(jí)對(duì)高級(jí)的不必要更新。

此外,各級(jí)緩存的寫策略也不相同。對(duì)于一個(gè)兩級(jí)緩存系統(tǒng),一級(jí)緩存可能會(huì)使用寫通來簡化實(shí)現(xiàn),而二級(jí)緩存使用寫回確保數(shù)據(jù)一致性。orpsoc正是這樣設(shè)計(jì)的。

(5)關(guān)于cache的優(yōu)化

優(yōu)化緩存可從三個(gè)方面入手:減少命中時(shí)間,降低失效率,減輕失效代價(jià)。此外,增加緩存訪問帶寬也能有效較低AMAT(平均內(nèi)存訪問時(shí)間,AverageMemory Access Time)。

理論上,完全使用虛擬地址可以獲得更快的緩存訪問速度,因?yàn)檫@樣僅在緩存失效時(shí)才會(huì)進(jìn)行地址翻譯。但是,如前所述,這種純虛地址緩存由于繞開了操作系統(tǒng)對(duì)進(jìn)程訪問地址的軟件控制,會(huì)存在不少問題。

為了能接近虛緩存的訪問速度,又能避開虛緩存帶來的種種問題,引入了所謂虛索引、實(shí)標(biāo)簽緩存(virtuallyindexed, physically tagged)。這種結(jié)構(gòu)的緩存可以令地址翻譯和緩存查詢并發(fā)進(jìn)行,大大加快了緩存的訪問速度。

由于電路延遲很大程度上取決于存儲(chǔ)芯片的大小,所以可考慮使用較小容量的緩存以保證最短的訪問周期。這么做的另一個(gè)好處是,由于一級(jí)緩存足夠小,可以把二級(jí)緩存的全部或部分也集成到CPU芯片上,從而減少了二級(jí)緩存的命中時(shí)間。

AMD從K6到Opteron連續(xù)三代CPU的一級(jí)緩存容量都沒有任何增長(均為64KB)正是基于這個(gè)原因。

另一方面,考慮使用簡單的緩存,如直接匹配緩存,也可較組相聯(lián)緩存減少命中時(shí)間。

路預(yù)測(cè):

所謂路預(yù)測(cè)(Wayprediction),是指在組相聯(lián)緩存中,跟蹤同一組內(nèi)不同緩存塊的使用情況,然后在訪問到來時(shí),不經(jīng)比較直接返回預(yù)測(cè)的緩存塊。當(dāng)然,標(biāo)簽比較仍然會(huì)進(jìn)行,并且如果發(fā)現(xiàn)比較結(jié)果不同于預(yù)測(cè)結(jié)果,就會(huì)重新送出正確的緩存塊。也就是說,錯(cuò)誤預(yù)測(cè)會(huì)造成一個(gè)緩存塊長度的延遲。

模擬表明路預(yù)測(cè)的準(zhǔn)確率超過85%[6]。這種技術(shù)非常適合于投機(jī)執(zhí)行(SpeculativeExecution)處理器,因?yàn)檫@種處理器有完善的機(jī)制來保證在投機(jī)失敗之后取消已經(jīng)派發(fā)的指令。

追蹤緩存:

與一般的指令緩存存儲(chǔ)靜態(tài)連續(xù)地址不同,追蹤緩存(TraceCache)存儲(chǔ)的是基于執(zhí)行歷史的動(dòng)態(tài)地址序列。這實(shí)際上是把分支預(yù)測(cè)的結(jié)果用在了緩存上。由于只存儲(chǔ)沿某一特定分支路徑才會(huì)遇到的指令,這種緩存可比傳統(tǒng)緩存更節(jié)省空間。

追蹤緩存的缺點(diǎn)是實(shí)現(xiàn)復(fù)雜,因?yàn)楸仨氃O(shè)法連續(xù)存儲(chǔ)的數(shù)據(jù)并不會(huì)按照2的冪次字長對(duì)齊。此外,對(duì)于不同執(zhí)行路徑要分開存儲(chǔ)。如果這些執(zhí)行路徑中存在相同地址的指令,這些指令就只好被分別存到兩個(gè)地方。這反而造成了低效的空間利用。

Intel的Pentium4處理器使用了這一復(fù)雜技術(shù)。值得一提的是,Pentium4追蹤緩存存儲(chǔ)的不是從內(nèi)存抓取的原始指令,而是已經(jīng)過解碼的微操作,從而進(jìn)一步節(jié)省掉了指令解碼上要花的時(shí)間。

增加訪問帶寬。

緩存流水線化:

將一級(jí)緩存并入流水線是一般做法。這種做法可行性在于一級(jí)緩存的訪問時(shí)間通常都極短,可能只有一到數(shù)個(gè)CPU周期。此外,由于TLB也是一種高速緩存硬件,所以也可以納入流水線。

非阻塞緩存:

一般而言,當(dāng)緩存發(fā)生失效時(shí),處理器必須停滯(stall),等待緩存將數(shù)據(jù)從次級(jí)存儲(chǔ)中讀取出來。

對(duì)于跨序執(zhí)行(Out-of-orderExecution)處理器,由于多條指令在不同處理單元中并發(fā)執(zhí)行,某一條指令引發(fā)的緩存失效應(yīng)該只造成其所在處理單元的停滯,而不影響其他處理單元和指令派發(fā)單元繼續(xù)流水。因此,有必要設(shè)計(jì)這樣一種緩存,使之能夠在處理緩存失效的同時(shí),繼續(xù)接受來自處理器的訪問請(qǐng)求。這稱為非阻塞緩存(Non-blockingcache)。

降低失效率。

使用更大的數(shù)據(jù)塊:

使用大數(shù)據(jù)塊有助于利用空間局部性降低失效率,但其代價(jià)是更高的失效代價(jià)。這是因?yàn)?,一旦失效,就必須把整個(gè)數(shù)據(jù)塊都重新填滿。

使用更大的緩存:

單純?cè)龃缶彺娴娜萘恳彩墙档褪实囊粋€(gè)辦法。不過顯然這也增大了命中時(shí)間。

高組相聯(lián)緩存:

使用多路組相聯(lián)可以減少?zèng)_突失效。但其后果是緩存電路邏輯復(fù)雜化,故增大了命中時(shí)間。

編譯器優(yōu)化:

存在多種編譯器優(yōu)化技術(shù)來間接影響緩存的使用模式。

責(zé)任編輯:haq

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

    關(guān)注

    0

    文章

    117

    瀏覽量

    21226
  • 軟件
    +關(guān)注

    關(guān)注

    69

    文章

    4945

    瀏覽量

    87509
  • Cache
    +關(guān)注

    關(guān)注

    0

    文章

    129

    瀏覽量

    28346

原文標(biāo)題:甄建勇:五分鐘搞定Cache(下)

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是緩存(Cache)及其作用

    緩存(Cache)是一種高速存儲(chǔ)器,用于臨時(shí)存儲(chǔ)數(shù)據(jù),以便快速訪問。在計(jì)算機(jī)系統(tǒng)中,緩存的作用是減少處理器訪問主存儲(chǔ)器(如隨機(jī)存取存儲(chǔ)器RAM)所需的時(shí)間。 緩存(Cache)概述 緩存是一種位于
    的頭像 發(fā)表于 12-18 09:28 ?617次閱讀

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

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

    解析Arm Neoverse N2 PMU事件L2D_CACHE_WR

    有客戶希望我們幫忙分析 Eigen gemm 基準(zhǔn)測(cè)試的一些執(zhí)行情況。具體來說是為什么 L1D_CACHE_WR 的值會(huì)低于 L2D_CACHE_WR,這種情況令人費(fèi)解。
    的頭像 發(fā)表于 09-03 11:42 ?1291次閱讀
    解析Arm Neoverse N2 PMU事件L2D_<b class='flag-5'>CACHE</b>_WR

    2k1000LA中關(guān)于IODMA請(qǐng)求的描述

    。此處關(guān)于cache的概念我并不是非常清楚,此處的cache指的是什么cache? 而DMA的訪存屬性由*_coherent配置,我在通用配置寄存器2中找到了定義,如圖。 其中包含了c
    發(fā)表于 08-15 21:52

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

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

    為什么HAL庫在操作Flash erase的時(shí)候,需要把I-Cache和D-Cache關(guān)閉呢?

    請(qǐng)問為什么HAL庫在操作Flash erase的時(shí)候,需要把I-Cache和D-Cache關(guān)閉呢? 這有什么原因呢? 有人可以解答嗎?
    發(fā)表于 04-07 09:08

    STM32F429使用外部SPI flash,只要執(zhí)行Bitmap::cache(id)就進(jìn)入硬件錯(cuò)誤怎么解決?

    我使用的是STM32F429,使用外部SPI flash,在繪圖前,需要先把圖片緩存 使用函數(shù)Bitmap::cache(id)。 我遇到的問題是,當(dāng)id>13的時(shí)候,只要執(zhí)行這個(gè)函數(shù)
    發(fā)表于 03-27 07:39

    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

    請(qǐng)問STM32MP13X的MMU和Cache如何使能?

    STM32MP13X的MMU和Cache如何使能?修改了hal_conf里的DATA_CACHE_ENABLE的宏console里還是顯示沒開,在設(shè)置里的Define symbols把NO_CACHE_USE刪了好像還是不行。。
    發(fā)表于 03-12 06:46

    關(guān)于PSDR和DSPR遇到的兩個(gè)問題求解

    PSPR 主要用途放置靜態(tài)函數(shù),提示高函數(shù)數(shù)執(zhí)行效率 DSPR 主要用途于全局變量、場(chǎng)景保護(hù)的上下文管理與等數(shù)據(jù) 以上是我找到的關(guān)于 PSPR 和 DSPR 的解析,我有兩個(gè)問題: 1。PSPR
    發(fā)表于 02-26 07:57

    Tc38x中全局變量訪問只能是不帶cache的地址嗎?

    全局變量只能放置在不帶cache的地址么?
    發(fā)表于 02-06 08:17

    Cache中的data在不同核間獲取數(shù)據(jù)的時(shí)候如何保證拿到的數(shù)據(jù)是最新的?

    1. Cache 中的data在不同核間獲取數(shù)據(jù)的時(shí)候如何保證拿到的數(shù)據(jù)是最新的? 2.如果關(guān)閉了Cache ,運(yùn)行速度就變好慢,但是core0取core1的數(shù)據(jù)又想要保持是最新的數(shù)據(jù)值,此時(shí)沒法打開cache ,這種情況該怎么
    發(fā)表于 01-31 06:49

    先楫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 ?1317次閱讀
    先楫HPM片上<b class='flag-5'>Cache</b>使用指南經(jīng)驗(yàn)分享