針對不同的使用場景,有不同的cache 策略來影響cache的操作。緩存策略使我們能夠描述何時應(yīng)該將一個cache line寫入給data cache,以及當(dāng)執(zhí)行store指令并發(fā)生cache hit時應(yīng)該發(fā)生什么。cache 策略(policy)主要分為:
- 分配策略 Allocation policy:控制什么操作可以導(dǎo)致 linefill (將外部內(nèi)存的一個cache line大小的數(shù)據(jù)拷貝到cache中)。
- 替換策略 Replacement policy:針對組相聯(lián)cache,當(dāng)發(fā)生linefill時,用于選擇將數(shù)據(jù)放入哪個cache line。如果被選中的cache line上有數(shù)據(jù),舊數(shù)據(jù)將會被替換出去。
- 寫策略 Write policy :當(dāng)CPU 進(jìn)行寫操作時,在cache 中命中,用于決定寫入cache 的行為。
一,分配策略 Allocation policy
當(dāng)CPU 發(fā)起一個read/write 請求后,首先會進(jìn)行 cache look-up,如果出現(xiàn)了 cache miss,即讀寫的地址不在cache 當(dāng)中。這時候就要考慮是否要進(jìn)行 cache linefill,將該地址上的數(shù)據(jù)從外部內(nèi)存中拷貝到cache中了。所以分配策略就是用來決定當(dāng)發(fā)生miss時,是否要進(jìn)行cache linefill的策略。miss 也分為 read miss 和 write miss,所以分配策略也分為WA和RA。
1.1 寫分配 Write allocation (WA)
寫分配策略ARMv8 和 ARMv7略有不同:
ARMv8
在ARMv8中,一個write miss 將會觸發(fā) linefill。這意味著CPU執(zhí)行一個 store指令的時候,會導(dǎo)致一個讀操作發(fā)生。在寫操作發(fā)生前,一個linefill將會相關(guān)數(shù)據(jù)從外部內(nèi)存中讀取,填充到cache line中。cache line是cache 的最小可加載單元,就算CPU寫入只寫一個byte的數(shù)據(jù),也會加載一個cache line size的數(shù)據(jù)到cache中。
ARMv7
在ARMv7下,寫分配 Write allocation (WA)實際上應(yīng)該叫做讀寫分配策略(read-write cache allocate policy)。因為在寫分配策略下,無論是read miss 還是 write miss都會造成 cache linefill。一般和 寫回(write-back)策略組合起來使用(WA+WB)。
1.2 Read allocation (RA)
當(dāng)read miss的時候才會發(fā)生linefill。在RA策略下,如果發(fā)生了write miss,cache 不會受影響,并且該write miss的結(jié)果和動作會被傳遞到下一級內(nèi)存當(dāng)中。
二,替換策略 Replacement policy
當(dāng)發(fā)生cache miss的時候,cache controler將會在set中選擇一個cache line位置用于放置linefill時即將寫入的數(shù)據(jù)。被選中的cache line稱為victim。如果victim中包含有效的、dirty的數(shù)據(jù),在為新數(shù)據(jù)騰出空間之前,該victim cache line上的數(shù)據(jù)必須先寫回到下一級內(nèi)存當(dāng)中。這個過程也成為 eviction。替換策略主要是決定哪個cache line會被當(dāng)做victim。
2.1 循環(huán)替換策略:Round-robin or cyclic replacement
循環(huán)替換策略意味著有個計數(shù)器(victim counter)來記錄可用的 way number,當(dāng)計數(shù)器到了最大的way number,就會回到0,從頭開始。
2.2 偽隨機替換策略:Pseudo-random replacement
使用偽隨機的方式隨機選擇victim cache line。victim counter會以偽隨機的方式遞增,并且可以指向set中的任意一個cache line。
2.3 最近最少使用替換策略:Least Recently Used (LRU)
將最近最少使用的cache line作為victim,替換出去。
ARM的絕大部分處理器都支持循環(huán)替換策略和偽隨機替換策略。Cortex-A15也支持LRU策略。循環(huán)替換策略通常更容易預(yù)測下一個victim,但是如果頻繁讀寫固定pattern的地址數(shù)據(jù)(cache line固定)循環(huán)策略很容易將經(jīng)常使用的cache line替換出去,而LRU替換策略設(shè)計成本較高,所以更推薦使用偽隨機替換策略。
比如常見的cortex-A53,Cortex-R4, Cortex-R5和 Cortex-R7 都使用偽隨機替換策略。
三,寫策略 Write policy
當(dāng)CPU執(zhí)行一個store指令的時候,首先進(jìn)行cache look-up,如果發(fā)生了cache write hit,那接下來將有兩種選擇:
3.1 寫回法-Write-back (WB)
在寫回策略下,寫操作只會發(fā)生在cache 中,而不是主存中。這意味著cache 里的數(shù)據(jù)和主存里的數(shù)據(jù)將會出現(xiàn)不一致的現(xiàn)象:cache 里保存的是最新的數(shù)據(jù),而主存中保存的是舊數(shù)據(jù)(stale data)。所以為了區(qū)分新舊數(shù)據(jù),cache line里有個dirty標(biāo)志位,來表明該cache line里的數(shù)據(jù)是否與下一級內(nèi)存中的數(shù)據(jù)保持一致。當(dāng)新數(shù)據(jù)寫入cache line中而不是主存的時候,該cachle line的dirty bit將會被置位。
什么時候cache里的數(shù)據(jù)才會被寫回到主存呢?主要有兩種方式:
- 當(dāng)發(fā)生cache line eviction時,victim cache line將會被寫回到下一級內(nèi)存。
- 軟件使用顯式的cache 維護(hù)指令時,比如clean/invalidate.
WB的優(yōu)勢:可以顯著地提高性能和節(jié)省能耗,因為在WB策略下,CPU寫操作大部分時間都是與cache 進(jìn)行交互,只有在需要的時候,數(shù)據(jù)才會寫回到主存中,極大地減少了向主存搬運數(shù)據(jù)的動作。
WB的劣勢:cache里的數(shù)據(jù)和主存中的不一致,尤其是在多核場景下,數(shù)據(jù)一致性問題(coherency issues)尤為重要。此外,要實現(xiàn)WB,其硬件結(jié)構(gòu)也比WT更復(fù)雜。
3.2 寫通法-Write-through (WT)
與WB策略不一樣,在WB策略下,每次寫操作都會寫入cache 和主存中。這意味著不需要考慮cache和主存之間的數(shù)據(jù)一致性問題,所以也不會將cache line的dirty bit置位。但是因為每次寫操作都要寫到主存中,所以通常情況下WT的性能是要顯著低于WB的,尤其是當(dāng)頻繁更新一些相同地址上的數(shù)據(jù)的時候。如果一大塊連續(xù)的內(nèi)存被寫入,并且寫入的數(shù)據(jù)進(jìn)入buffer中,WT策略可能有幫助。另外,如果這些數(shù)據(jù)在寫完后就不再被使用、不會被立刻使用或者很少被使用(大規(guī)模的數(shù)據(jù)拷貝或者內(nèi)存初始化),對于這種寫操作,最好就不用填充到cache當(dāng)中了,使用WT直接寫入內(nèi)存可能更有幫助。
WT的優(yōu)勢在于硬件結(jié)構(gòu)簡單,不存在數(shù)據(jù)一致性問題。但是其劣勢在于放棄了部分cache帶來的高性能以及便捷性。
四,緩存維護(hù)策略的組合方式
首先replacement policy根據(jù)不同的架構(gòu)實現(xiàn),可以選擇支持不同的的策略,不會影響到write policy和allocate policy。而write policy和allocate policy之間卻有很深的關(guān)聯(lián)性,首先Write-Through策略和Write-allocate策略就不該組合使用,因為WT策略每一次寫,不僅寫入cache 中,還會寫入主存中,當(dāng)發(fā)生write miss時,不需要進(jìn)行allocation。所以WA策略通常會搭配Write-back使用。常見的緩存維護(hù)策略的組合方式有如下三種:
- 寫回+讀分配+寫分配,Write-Back, Read-Allocate, Write-Allocate. (WB-RA-WA)
- 寫回+讀分配,Write-Back, Read-Allocate only. (WB-RA)
- 寫通+讀分配,Write-Through, Read-Allocate only. (WT-RA)
五,分析,影響cache性能的因素
通過上文關(guān)于緩存策略的描述,我們可以得到緩存性能的關(guān)鍵指標(biāo):
- hit/miss ratio:命中率,或者說時miss的概率。
- miss penalty:當(dāng)發(fā)生miss時,系統(tǒng)需要額外進(jìn)行哪些操作(associated costs of a miss penalty)。
- time for hit :發(fā)生hit/miss所需的時間,cache controler收到一個地址,需要進(jìn)行cache look-up(cache 遍歷查找),才能確定是否hit或者miss,而這個查找的時間與cache的結(jié)構(gòu)(組相聯(lián)、直接映射、全相聯(lián)映射)有關(guān)。
miss penalty和time for hit 與ARM架構(gòu)的具體實現(xiàn)緊密相關(guān),作為軟件層,如果想提高緩存的性能以及系統(tǒng)性能,我們唯一能做的就是提高命中率或者減小miss的概率。
五,分析,軟件層可以配置哪些維護(hù)策略
Allocate policy(讀分配/寫分配),Write policy(寫通/寫回)可以通過配置pagetable,設(shè)置memory的空間屬性來改變。
replacement policy 替換策略和包含策略(inclusion policy,inclusive和exclusive)是硬件定義好的,軟件層無法更改。文章來源:http://www.zghlxwxcb.cn/news/detail-756785.html
六,參考文檔
https://developer.arm.com/documentation/den0042/a/Caches/Cache-policies
https://developer.arm.com/documentation/den0013/d/Caches/Cache-policies
http://users.ece.northwestern.edu/~kcoloma/ece361/lectures/Lec14-cache.pdf
https://blog.feabhas.com/2020/10/introduction-to-the-arm-cortex-m7-cache-part-2-cache-replacement-policy/#D-Cache_Replacement_Policy文章來源地址http://www.zghlxwxcb.cn/news/detail-756785.html
到了這里,關(guān)于ARM 中緩存維護(hù)策略:Allocate policy(讀分配/寫分配),Write policy(寫通/寫回)以及replacement policy基礎(chǔ)知識的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!