回覆列表
-
1 # 使用者6662162826421
-
2 # 使用者5007521561936
Cache 用來減少cpu記憶體的時間。
cache的訪問速度要比記憶體快的多,容量較小,價格貴。
cache暫存記憶體中的資料, 例如 cpu要訪問記憶體中某個位元組10次, 第一次訪問的時候,資料從記憶體搬運到cache,花費較長的時間,後面9次,資料在cache中已有複製, 可以直接訪問cache,速度快。
題主把CPU與Cache分的太開了, Cache已經是現代CPU的一部分. 從記憶體的角度來看, Cache發來的讀資料請求就是CPU發來的讀資料請求. 實際上CPU所有關於Load和Store的請求, 都會由MOB(Memory Order Buffer) - L1D - L2 - L3 -DRAM這條路徑來完成, Cache只是這條路上的幾個驛站而已.關於副標題內的疑問, 只用把問題邏輯順一下就解決了。既然CPU速率高, 記憶體速率慢,那麼中間加一個Cache的目的就是為了讓儲存體系可以跟上CPU的速度.普通的CPU+DRAM記憶體的結構, 如果沒有設計Cache, 每一次CPU都要找記憶體要資料, 這個延遲估計在80個時鐘週期左右. 這是因為CPU要從內部運算核心將請求發到CPU邊緣的總線上, 從總線上電路板, 到達北橋, 再上電路板到達DRAM. DRAM搜尋到資料後如此再送回去. CPU動作那麼快, 等的黃花菜都涼了.如果加了Cache會怎樣? L1 Cache, 訪問延遲在4個週期左右, L2 Cache, 延遲在15個週期左右, L3Cache, 延遲在50個週期左右. 但是由於添加了很多Cache, CPU訪問記憶體的速度被降低了, 需要120個週期左右. 如果CPU需要的內容, 90%在L1 Cache裡有, 6%在L2 Cache裡有, 3%在L3 Cache裡有, 1%要去找DRAM拿. 那麼整個儲存體系的等效延遲就是: 7.2個時鐘週期.這不是爽歪了麼??預先讀取,為什麼cpu不能做呢?預取(prefetch)這件事cpu的確不做, 是Cache在做, 每一集的Cache都會有自己的prefetcher. 而實際上L1 Cache已經被融合進CPU內部裡了, L1I和L1D和CPU流水線簡直就是緊挨在一起, L2 Cache又緊挨著CPU的L1D. 所以L1I, L1D, L2它們做預取, 和CPU自己做是一回事! 而且CPU跑多快, 預取的速度就有多快!上面憑什麼說"CPU需要的內容, 90%在L1 Cache裡有, 6%在L2 Cache裡有"? 就是因為Cache中資料大多是複用的, 而且Cache基於歷史資料還一直在預取! 而CPU和prefetcher像極了老總和小秘的關係, 比如:每次CPU缺什麼資料, 找記憶體拿了一次, 但是這被prefetcher記住了, 等一有空prefetcher就把頁(Page)中其他相關資料都從記憶體裡拿出來. 這就等於把他七大姑八大姨街坊鄰居全叫了出來, CPU提取資料一般是有範圍的, 橫豎不超過這麼多, 所以CPU第二次再缺資料, 就不用去找記憶體了, 都在Cache裡! 實際上Cache可以同時監控很多個頁, 這個過程反覆幾次, CPU就基本不再找記憶體要東西了.