編者按:1月8日晚上,《深入理解cache訓(xùn)練營(yíng)》講師甄建勇和閱碼場(chǎng)資深用戶wisen圍繞Cache和性能優(yōu)化展開(kāi)了一場(chǎng)線上圓桌討論。本文是對(duì)圓桌內(nèi)問(wèn)題的解答整理,不一而詳,供大家參考。感謝閱碼場(chǎng)用戶王建峰對(duì)于問(wèn)題的整理。
圖:wisen整理的Cache和性能優(yōu)化的思維導(dǎo)圖
1、能不能舉個(gè)日常生活的例子來(lái)理解什么是Cache?
例如,我在商場(chǎng)購(gòu)物時(shí),把要買(mǎi)的東西先把它放到小推車(chē)中,最后統(tǒng)一結(jié)賬。此時(shí),把 自己想象成芯片中的 CPU,購(gòu)物車(chē)是芯片中 Cache,柜臺(tái)是芯片的輸出口。再例如,我在圖書(shū)館看書(shū),隨手將喜歡看的書(shū)放到柜子里,這里某一些書(shū)我會(huì)反復(fù)看,不想看時(shí)把書(shū)放回書(shū)架上。此時(shí),我是 CPU,書(shū)柜是 Cache,書(shū)架是下一級(jí)存儲(chǔ)器。
2、關(guān)于 Cache和硬件設(shè)計(jì)的問(wèn)題:在具體的 SOC和 CPU實(shí)現(xiàn)的時(shí)候,Cache占用面積給 Cache設(shè)計(jì)的限制有多大?
占用非常大的面積,大概在一半以上,而且一個(gè)好的 Cache 的設(shè)計(jì)復(fù)雜度非常高,可能比較 CPU 的 Pipeline 還要復(fù)雜。這里要考慮成本,設(shè)計(jì)復(fù)雜度,或者其他方面的考慮。你知道 L1 Cache 為什么一般是 32K 嗎?如果畫(huà)出曲線的話它會(huì)有一個(gè)拐點(diǎn)。另外一個(gè)角度是根據(jù)業(yè)務(wù)的場(chǎng)景,來(lái)設(shè)計(jì) Cache Size,包括 Cache 的規(guī)格的定義。
3、像現(xiàn)在有很多的服務(wù)器的芯片,一上來(lái)就有 128個(gè)核,做這種 SOC設(shè)計(jì)的時(shí)候有需要特別考慮的點(diǎn)嗎?
像這種設(shè)計(jì)的內(nèi)存模型一般是 NUMA 和 UMA 的混合,考慮平衡性和靈活性。
刷 Cache時(shí)沒(méi)有一致性協(xié)議保證。比如有兩個(gè) Core,其中一個(gè) Core刷 Cache,(要保證一致性)另外個(gè) Core也要刷。這個(gè)時(shí)候時(shí)一個(gè) Core發(fā)中斷,另一個(gè) Core收到中斷以后在去執(zhí)行。有遇到過(guò)這種場(chǎng)景嗎?
情況比較復(fù)雜,如果是一個(gè)主核和一個(gè)從核刷的話,需要這種方式來(lái)刷。如果運(yùn)行虛擬機(jī)的話,只能刷自己的。
4、為什么需要 Cache Line Size對(duì)齊?
提高對(duì) cache 的利用率,避免浪費(fèi)。我們假設(shè)一個(gè) Cache Line 的 Size 是 64 Byte,例如
?如果有 32 Byte 的數(shù)據(jù)要存入 Cache ,在 Cache Line 內(nèi)部沒(méi)有對(duì)齊的話(比如存放到中間的某一個(gè)區(qū)域),這時(shí)在想要向這個(gè) Cache Line 繼續(xù)存儲(chǔ) 32 Byte 的數(shù)據(jù)時(shí),剩余 32 Byte 的空間卻無(wú)法存儲(chǔ)這一部分?jǐn)?shù)據(jù),那么就會(huì)造成資源浪費(fèi)。
?如果有 64 Byte 的數(shù)據(jù)要存入 Cache ,在 Cache Line 起始地址沒(méi)有對(duì)齊的話(地址沒(méi)有按照 size 的倍數(shù)對(duì)齊),實(shí)際上占用2個(gè) Cache Line Size ,可能就會(huì)多造成一個(gè) Cache Line 的浪費(fèi)。
5、Cache指令預(yù)取和 BTB預(yù)取有什么區(qū)別嗎?
BTB 根據(jù)硬件自己的算法做預(yù)測(cè)的,和 Cache 指令預(yù)取(likely 函數(shù))相互補(bǔ)充,使得整體效益最大。
6、L1/L2/L3/SYSTEM/Cache相互是之間的聯(lián)系是怎么樣的?
它們是一個(gè)金字塔類型,一般情況越往下的 capacity 越大,速度越慢。它們之間關(guān)系的話有兩種:inclusive 和 exclusive。inclusive 表示是一個(gè)包含關(guān)系; exclusive 相反的關(guān)系,例如 L1 里有的 在 L2 一定沒(méi)有。
7、我們主要針對(duì) L2/L3/Cache做的代碼優(yōu)化吧?
不僅僅是這些。課程在詳細(xì)展開(kāi)討論。
8、System Cache一般是 DDR前面的是吧?
結(jié)論正確。這個(gè)提問(wèn)方式不是特別的好,可以問(wèn) System Cache 干嘛用的呢? 一般來(lái)說(shuō) L1/L2/L3 是給 CPU 來(lái)用的,而 System 中的一些 IP ,比如 GPU 也需要緩存的話,可以使用 System Cache 。
9、單 Cache的優(yōu)化方向。除 Cache Line的按場(chǎng)景分配,對(duì)齊,之外,在內(nèi)存本身上還有什么樣的優(yōu)化方向?
其中一個(gè)是結(jié)合程序本身的行為進(jìn)行優(yōu)化,不同場(chǎng)景的分配算法;其中另一個(gè)方向 Cache Line 的壓縮。
10、各級(jí)Cache大小如何選擇,有哪些選擇標(biāo)準(zhǔn)?不同大小組合對(duì)不同性能影響怎樣?
例如 PPA 、PPAC 、PPACY。
11、以 VIPT為例,Cache訪問(wèn)時(shí)候 Index到底是怎么從虛擬地址里取出來(lái)的,Tag又是取了物理地址的那部分?
地址到達(dá) Cache 之前,假設(shè)是 VIPT ,Index 查找直接跨過(guò) MMU 到達(dá) L1 Cache ,Index 直接從虛擬地址取出對(duì)應(yīng)的位就可以了。Tag 的話看 Cache 的組織,幾路組相連,知道 Cache Size 就能知道 Tag 大小。實(shí)際上這個(gè)地方,在實(shí)際的 Cache 中還要考慮 MMU,考慮虛擬機(jī),考慮不同的進(jìn)程。
12、如何提升 Cache命中率,有哪些方式方法?
如圖片歸納的方法。如果用一句話總結(jié)的話,局部性越好一般(Cache命中率)越高的。局部性是指時(shí)間的局部性和空間的局部性,就是說(shuō) CPU 越是頻繁的訪問(wèn)相同的物理地址,Cache 的命中率是越高的。
13、請(qǐng)問(wèn)下做 Cache性能優(yōu)化的常用手段有哪些啊。Perf采集?
如圖片歸納的方法。Perf 采集時(shí)其中的一部分。我們的邏輯時(shí)這樣,我們做 Cache 性能優(yōu)化,(前提是)要先了解它,當(dāng)我們了解之后,甚至是非常熟悉和通透之后,很多優(yōu)化的算法思路就會(huì)涌現(xiàn)出來(lái)。
14、exclusive有什么好處與代價(jià)?
如果從上層看它的等價(jià)的 Cache Size 是變大的,因?yàn)槭腔コ獾穆铩@缒阌袃蓚€(gè)桶,雨水從屋子上留下來(lái),這兩個(gè)桶是重疊呢還是不重疊呢? 此時(shí)桶就是 Cache,雨水就是流入的數(shù)據(jù),exclusive 不重疊會(huì)讓局部變大一些。
15、請(qǐng)問(wèn) ARM64架構(gòu)下,如何理解 Cache refill和 Cache allocate的異同?謝謝
Cache allocate 策略是什么樣子的,怎么去走 refill 策略。這里做法有很多,比如是直接去拿,還是等一等,如果等的話要等多久。課程在詳細(xì)展開(kāi)討論。
這個(gè)壓縮是平臺(tái)硬件設(shè)計(jì)的行為還是軟件算法?
軟硬件結(jié)合設(shè)計(jì)。
17、VIPT也有 Cache的重名問(wèn)題。這個(gè)一般要怎么解決啊?
ASID
18、Cache設(shè)計(jì)時(shí)遇到什么嚴(yán)重問(wèn)題?
兩個(gè)比較嚴(yán)重的問(wèn)題,其中一個(gè)時(shí)物理地址和虛擬地址發(fā)生錯(cuò)亂,一個(gè)物理地址對(duì)應(yīng)到兩個(gè)虛擬地址,或者一個(gè)虛擬地址對(duì)應(yīng)到兩個(gè)物理地址;另外一個(gè)時(shí)同一塊數(shù)據(jù)存放到兩個(gè)不同的 Cache Line 里面。課程在詳細(xì)展開(kāi)討論。
19、請(qǐng)問(wèn)關(guān)于 Cache壓縮之類的配置是看 Cache的 datasheet還是 armarchtrm?
armarchtrm
20、為什么要避免在棧上用數(shù)組?
有兩個(gè)原因,第一個(gè)是在棧里面分配數(shù)組,數(shù)組分配的初始化,對(duì) Cache 是一個(gè)操作。然后再多進(jìn)程切換時(shí),棧的數(shù)組(在Cache中)還會(huì)被刷掉。所以對(duì)于比較大的數(shù)組,用全局變量分配比較好。如果在棧上分配的話,在初始化的時(shí)候(Cache)被沖刷。
21、老師課程會(huì)講 innersharebale/outershareable/pou/poc嗎?
會(huì)。課程中深入討論。
22、課程會(huì)講 CPU/GPU/NPU架構(gòu)方面的內(nèi)容嗎?
會(huì)。講師個(gè)人經(jīng)歷過(guò)多年的 CPU/GPU/NPU 的架構(gòu)設(shè)計(jì)。課程中深入討論。
23、請(qǐng)問(wèn)同一個(gè) SoC/L1/L2/L3/Cache的組織方式相同么?會(huì)不會(huì) L1用 vipt,L2用 pipt?
其中 PIVT 很少見(jiàn)之外,其他三種都會(huì)用。有很多 L2 用 PIPT。課程中深入討論。
L1主要負(fù)責(zé)速度, L2主要負(fù)責(zé)廣度
正確。
24、inclusive與 exclusive在 Cache一致性維護(hù)上有什么區(qū)別?
inclusive 與 exclusive 在設(shè)計(jì)的時(shí)候,它們的要求是不一樣的,硬件行為是不一樣的。
25、L1中的數(shù)據(jù)在 L2中的位置是固定的么?
不固定。
26、CPU訪問(wèn) Cache和訪問(wèn) DDR在 Power上的消耗比例?
1000倍量級(jí)。
27、有啥工具可以分析不同 NUMA節(jié)點(diǎn)核的 Cache invalidate的延遲嗎?
芯片規(guī)格說(shuō)明書(shū)里一般會(huì)提供。
28、編譯器優(yōu)化會(huì)做自動(dòng)的 Cacheline對(duì)齊嗎?
向編譯器里加一些編譯選項(xiàng)。
29、有哪些專門(mén)測(cè)試 Cache性能測(cè)試的 benchmark嗎?
非常多。
30、Snoop啥時(shí)候工作呢?
是一個(gè) Standby 的機(jī)制,一直在工作。
31、Cache怎么仿真?
僅在 Cache 的設(shè)計(jì)階段。
32、什么情況下會(huì)將 Cache invalid之后,然后 flush到 DDR中?
Cache Line 一般放置處理的數(shù)據(jù),flush 為了將 Cache 騰空
33、什么情況下會(huì)將 Cache invalid之后,然后 flush到 DDR中?例如數(shù)據(jù)從外設(shè)(用DMA)搬進(jìn)來(lái),這時(shí)候數(shù)據(jù)在 DDR中,此時(shí) CPU想要不過(guò) Cache直接讀 DDR中的數(shù)據(jù)。
直接設(shè)置 non-cached 的地址去讀寫(xiě)就可以了。這種情況是申請(qǐng)的時(shí)候是帶 cache 的地址空間,然后直接就用的話,訪問(wèn)數(shù)據(jù)是帶 cache 的。
34、busrtmemaccess導(dǎo)致同一個(gè) Cacheline多次連續(xù) miss,一般 pmu會(huì)重復(fù)計(jì)算嗎?
看 pmu 的 spec。
35、監(jiān)聽(tīng)式和目錄式一致性維護(hù)有什么區(qū)別?
完全兩套不同的機(jī)制。監(jiān)聽(tīng)式是一個(gè)廣播的機(jī)制,適合核比較小的情況。目錄式完全相反。
36、CPU內(nèi)存和外設(shè)共享,外設(shè)寫(xiě)到 DDR中,然后 CPU讀。之前遇到個(gè)這樣的問(wèn)題,有兩個(gè)Cache,在一個(gè) Cache中可能因?yàn)轭A(yù)取一些數(shù)據(jù)。那么在另外一個(gè) Cache中做無(wú)效,那么在原來(lái) Cache已經(jīng)預(yù)取的那一部分?jǐn)?shù)據(jù)沒(méi)有辦法做處理,這樣 CPU就讀不到外設(shè)搬到 DDR上新的數(shù)據(jù)。因?yàn)?Cache預(yù)取的緣故,在另外 Cache中做無(wú)效是沒(méi)有用的這種情況,怎么處理呢?
原來(lái) Cache 讀的時(shí)候,將預(yù)取功能 disable 掉。但是預(yù)取不能一直關(guān)掉,只有代碼在危險(xiǎn)區(qū)的時(shí)候,才關(guān)掉。
37、什么場(chǎng)景要用到 RSB?
動(dòng)態(tài)指令修改。
38、DSB的原理是什么?
原理很簡(jiǎn)單,實(shí)際上在硬件上結(jié)構(gòu)里面,它是有先后順序的。只不過(guò)在為了某種性能的考慮,允許它亂序。但是有些特殊的指令,比如你提到 Barrier 指令,出現(xiàn)這類指令的時(shí)候,決定這條指令的完成。CPU 內(nèi)部 Pipeline 里面,核里面,是有一定的順序的。所有的指令都有一個(gè)提交態(tài),我們會(huì)知道單條指令的取指、譯碼、執(zhí)行,寫(xiě)回是誰(shuí)給他的呢? 實(shí)際上是 Cache 給它的。Cache 是誰(shuí)給他的呢? 實(shí)際上是下面的 DDR 給它的。所以實(shí)際上這里是一個(gè)非常大的環(huán),看起來(lái)這個(gè)指令在 CPU Core 里面,一級(jí)一級(jí)來(lái),最終這個(gè)指令才能提交。硬件上要保證它的順序,通過(guò)它的 FIFO。FIFO 里面你怎么 POP 出來(lái),POP 出來(lái)之后,怎么釋放,要等它的下一級(jí)。
審核編輯 :李倩
-
芯片
+關(guān)注
關(guān)注
456文章
50919瀏覽量
424582 -
cpu
+關(guān)注
關(guān)注
68文章
10876瀏覽量
212124 -
Cache
+關(guān)注
關(guān)注
0文章
129瀏覽量
28363
原文標(biāo)題:Cache與性能優(yōu)化精彩問(wèn)答38條
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論