儲存器 cpu快取記憶體1

2021-10-10 23:36:47 字數 2248 閱讀 1979

現代儲存器一共包括以下幾種:

暫存器直接和cpu進行互動資料的儲存器   (速度最快)與cpu1級快取記憶體互動

cpu 1級快取記憶體

直接嵌在cpu內部,每個cpu獨有的 

cpu 2級快取記憶體

在cpu外部,也是每個cpu獨有

cpu 3快取記憶體

所有cpu共享的快取

記憶體與快取記憶體互動、通過cpu控制dma與記憶體做互動

硬碟通過cpu控制dma與記憶體做互動

上圖的儲存器速度,從上到下依次遞減。

我們通過命令 sysctl -a 檢視一二**快取的大小 

一級快取的大小為 32k,二級256k  3級 6m

快取記憶體的內部結構:

由於cpu的速度太快了,記憶體完全跟不上cpu的運算速度,所以我們引入了乙個cpu高階快取的儲存器。20ghz的cpu一秒能有20億個時鐘週期,也就是執行20億個指令。光靠記憶體傳輸,速度完全跟不上

由上圖,我們可以看出訪問1級快取的速度和訪問記憶體速度差了100倍。

首先快取之所以快。其中乙個原因是因為它離cpu近,物理方面的限制

快取的成本比記憶體成本貴太多了。

綜合上面兩個原因,我們只能限制快取的大小。

為了讓快取記憶體能更有效的利用,引入了時間區域性性原理和空間區域性性原理。

即使用了lru演算法,保證熱點資料一直在快取記憶體中,我們就不用頻繁去訪問記憶體

lru是least recently used的縮寫,即最近最少使用,是一種常用的頁面置換演算法,選擇最近最久未使用的頁面予以淘汰              

假設我們訪問了載入了當前的資料,一定會載入下一條資料。有了空間區域性性就會把下一條資料載入到快取記憶體中。

我們來看一段**,分析其效能:

public static void main(string args)
輸出結果為   

time spent is 31ms

time spent is 26ms

我們首先來分析 迴圈1,執行了64 * 1024 * 1024次arr[i] *= 3

第二個迴圈,每次+16,意味著執行了4*1024*1024次arr[i] *= 3

兩者執行arr[i] *= 3的次數相差了16倍,但是執行時間卻只差了5ms,有問題!

我們來看下面這個圖

為了合理分配我們的快取記憶體,我們把快取分為塊,其中每個塊cache line 64個位元組(乙個位元組等於8位)。

我們使用了如上圖的方法,我們的快取塊一共有8塊,取記憶體中的位址後3位作為快取塊的位址,與之類似的方法,5%8=0,21%8=5,那麼此時的快取都命中在5這個快取塊中。

所以如果我們查詢的記憶體資料在快取塊中,那麼就不用再去查詢記憶體了。

我們在每個cache line中放置乙個標誌位,標誌當前是屬於哪個組的,block5還是block21的。實際上我們取記憶體位址的高二位來判斷該cache line屬於哪個記憶體塊

根據記憶體位址,取後三位 定位到cache line。

cache line中還有資訊是標識當前資訊是否是有效的,如果一開始並沒有從記憶體讀資料的情況

判斷cache line 是否為要查詢的組,也就是取記憶體高二位和cache line中的組資訊進行對比。

根據記憶體位址的offset位,從data block 資料中讀取資料

上圖就是記憶體和快取記憶體的對映關係,cpu直接從cache line中拿實際資料就行了。

接下來就可以解釋 為什麼上面的**-迴圈1中執行了31ms,迴圈2中執行了26ms。

假設只用到了一級快取: 1kb能儲存16個cache line(1024/64) ,一級快取有 16*32=512個cache line 

因為每個int型別占用4個位元組,所以當它執行16次的時候,已經執行了64個位元組,也就是乙個cache line,每64個位元組從記憶體中拿一次block到cache line ,所以速度是差不多的。

CPU的快取記憶體儲存器的理解

參考 cpu的快取記憶體儲存器知識整理 基於快取的儲存器層次結構行之有效,是因為較慢的儲存裝置比較快的儲存裝置更便宜,還因為程式往往展示區域性性 1.通用快取記憶體儲存器結構介紹 乙個通用的快取記憶體儲存器會有s 2 s個set 組 每個set含有e個line 既通常所說的cache line 每個...

CPU的快取記憶體儲存器知識整理

基於快取的儲存器層次結構行之有效,是因為較慢的儲存裝置比較快的儲存裝置更便宜,還因為程式往往展示區域性性 時間區域性性 被引用過一次的儲存器的位置很可能在不遠的將來被再次引用。空間區域性性 如果乙個儲存器位置被引用了一次,那麼程式很可能在不遠的將來引用附近的乙個儲存器位置。乙個通用的快取記憶體儲存器...

CPU快取記憶體行

cpu 為了更快的執行 於是當從記憶體中讀取資料時,並不是唯讀自己想要的部分。而是讀取足夠的位元組來填入快取記憶體行。根據不同的 cpu,快取記憶體行大小不同。如 x86是 32bytes 而alpha 是64bytes 並且始終在第 32個位元組或第 64個位元組處對齊。這樣,當 cpu訪問相鄰的...