日本无码免费高清在线|成人日本在线观看高清|A级片免费视频操逼欧美|全裸美女搞黄色大片网站|免费成人a片视频|久久无码福利成人激情久久|国产视频一二国产在线v|av女主播在线观看|五月激情影音先锋|亚洲一区天堂av

  • 手機站
  • 小程序

    汽車測試網(wǎng)

  • 公眾號
    • 汽車測試網(wǎng)

    • 在線課堂

    • 電車測試

Cache基本原理--以TC3xx為例

2024-05-16 15:09:30·  來源:汽車MCU軟件設(shè)計  
 

目錄

1.為什么要使用Cache

2.Memory與Cache如何映射

2.1 地址映射概述

2.2 Cache映射模式

3.DCache的數(shù)據(jù)一致性

4.小結(jié)


為什么要使用Cache?為什么在多核工程里要謹慎使用DCache?Cache里的數(shù)據(jù)、指令是如何與Memory映射?靈魂三連后,軟件工程師應(yīng)該都會有模糊的回答:大概是為了運行更快,減小系統(tǒng)負載。但是再往下深入思考上面問題,我自己發(fā)現(xiàn)對于Cache原理的理解比較欠缺,網(wǎng)上資料紛繁復(fù)雜。因此,梳理并總結(jié)其原理,為后續(xù)系統(tǒng)性能優(yōu)化打下基礎(chǔ)。


1.  為什么要使用Cache


大家都知道,當系統(tǒng)負載較大時,首先要檢查的就是是否打開ICache,那么從硬件層面Cache在MCU\SOC的哪個位置?


這里首先祭出一張包漿的老圖:


圖片


Cache位于CPU和主存之間,分為了L1-Ln Cache,每種cache訪問速度有區(qū)別;



回歸到MCU中,以TC37x為例,Cache分為了PCache(指令緩存)和DCache(數(shù)據(jù)緩存)。那么為什么加了Cache就會提供系統(tǒng)運行速度呢?


以實際生活場景為例:超市里面的東西很豐富,但是所需要的存儲空間很大,而我要去超市買想要的東西,還得走路、選商品、搬回來,這中間耗費的時間和勞動力可想而知;但是因為有了冰箱,一切就方便了許多;不過冰箱容量就那么大,所以會把常用的東西一次性從超市搬過來暫存至冰箱里,下一次我再想用這些物品時從冰箱里拿取,是不是就節(jié)省了很多時間?


圖片


這里,人是CPU,超市就是主存,冰箱就是Cache,冰箱里放置的常用物品,咱們就可以理解為那些被經(jīng)常調(diào)用的函數(shù)、數(shù)據(jù)等等,這就是Cache的局部性原理之一----時間局部性。


時間局部性:當前正在提取的數(shù)據(jù)或指令可能很快就需要,因此將數(shù)據(jù)或指令存儲在緩存中,這樣可以避免再次在主存中搜索相同的數(shù)據(jù)。例如代碼循環(huán)里的數(shù)據(jù)等。


Cache局部性原理之二 ,即空間局部性---主要是指存儲在最近執(zhí)行的指令附近的所有指令都有很高的執(zhí)行機會。同時指的是對存儲位置相對較近的數(shù)據(jù)元素(指令)的使用。我們常常聽到的Cache Hit就是我從冰箱里拿到想要的東西(對應(yīng)CPU),而Cache Miss就是冰箱里沒有目標東西了,得到超市進貨了,但是這個進貨原則需要協(xié)商:這個進貨原則就是Cache替換算法。


好了,關(guān)于Cache的基本概念我們以超市、冰箱做類比應(yīng)該比較容易理解。


不過仔細想想,超市東西這么多,如何保證冰箱里的東西和超市的東西一致呢?這就不得不提分類、編號思想了。


2.Memory與Cache如何映射


以分類編號來思考這個問題,一切迎刃而解。


2.1 地址映射概述


一般來說,主存會以Cache的大小為基本單位劃分為多個塊,如下圖:


圖片


Cache內(nèi)部組成包含Cache控制器和兩塊SRAM(Tag RAM、DATA RAM)。


其中Data RAM用于存放數(shù)據(jù)(指令),其基本單位稱為Cache line,例如TC3xx DCache Line大小為256bit(32Bytes)。


根據(jù)DCache 16KB,可以算出有多少個Cache Line。那么什么是Tag?這就不得不提到主存地址,一般來講,主存地址由tag、set/index和offset組成,如下:


圖片


其中Set\Index用于定位Cache中的哪一個Cache Line,Offset用于定位Cache Line中的哪一個Bytes,Tag用于標識請求的是主存哪一個數(shù)據(jù)塊,假設(shè)現(xiàn)在Cache Line為256Bits,Cache大小為4KB,Cache Line個數(shù)就為4096/32=128,根據(jù)上述地址定義,如下圖:


這個概念搞清楚了,我們就能理解TC3xx UserMannul提到的DCache、DTag。緊接著我們來看,memory與Cache的映射方式。


2.2 Cache映射模式


常見的Cache地址映射模式包括直接映射、組相聯(lián)和全相聯(lián)。直接映射(Direct Mapping):在直接映射中,每個主存地址只能映射到Cache中的唯一一行。這意味著主存中不同塊可能會填充到相同的Cache Line里。如下圖:


圖片


組相聯(lián)(Set Associative Mapping) :Cache被劃分為多個Set,每個Set包含多個Way的Cache Line。主存地址被映射到某個Set,然后在該Set內(nèi)進行查找。每個Set內(nèi)的CacheLine數(shù)量通常是2的冪次方,例如2、4、8等。組相聯(lián)映射通過減少沖突提高了緩存的性能。上面有點暈不要慌,這里就不得不來點術(shù)語了。如下圖所示:


圖片


Way -- 相當于Cache的一頁,如上述示例,Cache就有2 Ways


Set -- 每個Way里的同一Cache Line組成Set

這里理解了,英飛凌描述的2-way set associative DCache是不是就手拿把攥了。

英飛凌每個CPU都有16K DCache,Cache Line為32Bytes,因此總共有512個Cache Line。那么針對memory地址就可以分為:

圖片

我們計算非Tag后的偏移2^14 = 16KB,這也與Cache Size剛好對上。 全相聯(lián)映射(Fully Associative Mapping): 主存地址可以映射
Cache中的任何一行,而不受限制于特定的組。這意味著任何Cache Line都可以存儲任何主存地址的數(shù)據(jù)。全相聯(lián)映射通常需要更多的硬件支
持,如標記比較電路,但可以最大程度地減少沖突,提高緩存的命中率。


3.  DCache的數(shù)據(jù)一致性


談到DCache的數(shù)據(jù)一致性,就不得不先討論Cache的寫策略。常見的Cache寫策略分為Write-Through和Write-Back。Write-Through :修改數(shù)據(jù)時,該修改會同時作用在Cache和Memory中,如下圖:


圖片


Write-Back:修改數(shù)據(jù)時,會先發(fā)生在Cache里,Memory中的母本更新會等待一些時間:


圖片


以英飛凌TC3xx系列為例,我們來看它是如何出現(xiàn)數(shù)據(jù)一致性問題的(注意TC3xx是Write Back Cache)。


圖片


CPU0\1共享LMU0,CPU0和CPU1修改LMU0[3]的值 3->9、LMU0[2]的值 2 -> 8,我們可以看到LMU0里的值確實變?yōu)榱?,但是思考一下,這時候CPU1去獲取LMU0[3],應(yīng)該是幾?當然是Cache里面的3,這里數(shù)據(jù)就不一致了。


緊接著由于CPU1中的Cache數(shù)據(jù)改變也反映到了LMU0中,此時可以發(fā)現(xiàn),LMU0[3]變?yōu)榱?,cpu0的修改出現(xiàn)了丟失了。因為Cache的更新至少得以Cache Line為單位。


那么,如何來避免這些問題呢?翻看TC3xx Aurix 內(nèi)核手冊,可以得到以下幾種方式:


使用cachea指令:cachea.wi將寫策略強制更新為write-through;cachea.i重刷cache;


使用英飛凌提供的Non-cache地址,例如LMU使用0xB開頭;


4.  小結(jié)


以上,我們簡述了cache的基本原理,從軟件工程師角度,了解Cache,知道Cache通常會帶來什么好處,引起什么問題,這對我們在系統(tǒng)層級的性能優(yōu)化是有巨大幫助的。

分享到:
 
反對 0 舉報 0 收藏 0 評論 0
滬ICP備11026917號-25