【计算机基础】存储器层次 Memory hierarchy
Memory Hierarchy
- 我們是如何構建指令 / 數據存儲器的?
- 內存時序
- 為什么Memory hierarchy有效?
- 存儲器技術
- Cache的基本原理
- Cache訪問
- 訪問缺失
- Cache性能的評估和改進
- 減少cache miss的方法
- 替換塊的選擇
- Cache ABC
- 訪問缺失分類 Classifiying Misses
我們是如何構建指令 / 數據存儲器的?
以64位Arm處理器為例,內部有32個寄存器
-
Register file? Flip-flop構建
- 32個64-bit 寄存器 -> 2Kb = 256Bytes
- 可以使用多端口,bigger and slower but still ok
-
Instruction / data memory? 也是Flip-flop構建
-
each instruciton address has 64 bits
-> 2^64 addressible unit
-> 2^64 bytes -> 2^4 Exbi-bytes = 16EB (不可能的
-
-
“Primary” instruction / data memory 是單端口的SRAM
-
“Primary” = 在數據通路中
-
只包含了一個memory的動態的子集
-
缺失的部分到下一級內存查找
-
內存時序
對于內存元件M來說:
-
Access:從M中讀或寫
-
Hit:從M中獲取所需數據
-
Miss:M中找不到所需數據
- 必須從其他的部分得到
- 沒有“miss in register file” 的概念
-
Fill:將數據放到M
-
%_miss = miss rate(未命中率) :#misses / #access
-
t_hit:從M中讀或寫數據所用時間
-
t_miss:將數據送到M所用時間
-
表現評估:平均訪問時間(average access time)
t_avg = t_hit + %_miss * t_miss
Problem: 很難在同一結構中做到低 t_hit 和低 %_miss
-
大內存的結構 -> 低%_miss、高t_hit
因為內存大所以找到所需數據的概率較高,未命中率低
但尋找數據的時間相應會提高
-
小內存的結構 -> 高%_miss、低t_hit
因為內存小所以找到所需數據的概率較低,未命中率高
尋找數據的時間降低
Solution: 使用Memory hierarchy,即存儲器分層,中間以總線相連
M1 <-> M2 <-> M3 <-> M4 <-> M <->
- 層次越高:內存越小 -> 高%_miss、低t_hit
- 層次越低:內存越大 -> 低%_miss、高t_hit
M1中存儲最頻繁訪問的數據,
M2中存儲M1 + next most frequently 訪問的數據
為什么Memory hierarchy有效?
-
時間局部性
最近被訪問的指令/數據更可能在短時間內被訪問
-
空間局部性
最近被訪問的指令/數據附近的指令/數據更可能在短時間內被訪問
所以,存儲器系統是一個具有不同容量、成本和訪問時間的存儲設備的層次結構。存儲器的容量和訪問時間隨著離處理器距離的增加而增加
存儲器技術
-
DRAM
-
SRAM
-
Flash
是一種電可擦除的可編程制度存儲器(EEPROM)
-
磁盤
Cache的基本原理
直接映射(direct mapped):每個存儲器地址僅僅對應到cache的一個位置。
幾乎所有的直接映射cache都使用以下的映射方法:
? (塊地址) mod (cache中的塊數)
主存地址0-31被映射到cache的相同位置,該cache有8個字,所以地址X被直接映射到cache字X mod 8,即低log2(8) = 3位都被用作cache索引(index)。所以地址00001、01001、10001、11001都對應于cache中第101塊。
由于cache中的每個位置對應于主存中多個不同的地址,所以我們在cache中增加標記(tag) 。標記包含了地址的高位(如上圖的高兩位),用于判斷cache中的字是否就是所請求的字。
還有幾位偏置位(offset bits) 用來確定字中的byte
除此之外,cache中還需要增加一個有效位(valid bit) 來標識一個塊是否含有一個有效地址。
所以,cache的地址可以分為三個部分:
-
offset bit:最低 log2(block-size in bytes) bits
-
Index:接下來log2(number-of-sets) bits
-
Tag: 剩下的所有位
(valid bit不在地址中)
Example cache:
8 sets, 32-bit words = 4-byte blocks, 16 bit address
-> 8 sets = 3 bits index
-> 4-byte blocks = 2 bits offset
-> 16 - 3 - 2 = 11 bits of tag
Cache訪問
下面是對一個容量為8 blocks的空cache進行9次訪問的一個序列(5-bit address, 3-bit index) 暫時不包括offset bits
訪問缺失
當出現訪問缺失(cache miss)的時候,由兩部分來處理:處理器控制單元(Cache controller)和進行初始化主存訪問和重新填充cache的獨立控制器。
如果cache不命中,那么它需要存儲器層次結構中的下一層取出被請求的塊,然后將新的塊存儲在組索引位指示的組中的一個高速緩存行中
Cache性能的評估和改進
減少cache miss的方法
直接映射(direct mapping):一個塊只能放到cache中一個明確的位置。是一種極端的情況
另一種極端的情況:
全相聯(fully associative):一個塊可以被放置在cache中的任何位置,因此需要檢索cache中所有的項,所以全相聯只適合塊數較少的cache。
介于直接映射和全相聯之間的設計是組相聯(set associative):塊可以放置到cache中的部分位置(至少兩個)。一個塊首先被直接映射到一個組,然后檢索該組中所有的塊是否匹配。
For example:在直接映射的方式下,主存塊12只能放置在cache中唯一的塊中,該塊為(12 mod 8)= 4。在兩路組相聯cache中,有四個組,主存塊12必須放在第(12 mod 4)= 0組中,主存塊可以放在該組的任何位置。在全相聯的方式下,塊地址為12的主存塊可以放在cache中8個塊的任意一塊。
提高相聯度的好處在于它通常能夠降低缺失率,缺點則是增加了命中時間。
替換塊的選擇
當直接映射的cache發生缺失時,被請求的塊只能放置于cache的唯一位置,而原先占據那個位置的塊就必須被替換掉。
在組相聯的cache中,被請求的塊放置在什么位置需要進行選擇,因此替換哪一塊也需要進行選擇。
在全相聯cache中,所有的塊都可能被替換。
- 最常用的方法是最近最少使用(Least Recently Used,LRU)法,被替換的塊是最久沒有使用的那一塊。
對于一個兩路組相聯cache,跟蹤組中兩個數據項的使用情況可以這樣實現:在每組中單獨保留一位,通過設置該位指出哪一項被訪問過。
當相聯度提高時,LRU的執行就變得困難。
- Random 隨機選一項被替換
- FIFO
- NMRU(not most recently used)
Cache ABC
- Associativity
Decreases conflict misses
Increases t_hit
- Block size
Increases conflict misses
Decrases compulsory misses
little effect on t_hit, may exacerbate t_miss
- Capacity
Decreases capacity misses
Increases t_hit
訪問缺失分類 Classifiying Misses
Compulsory(cold) : 從來沒見過這個地址 -> block size ??
Capacity :cache太小了 -> cache size ??
Conflict:cache相聯度太低 -> associativity??
總結
以上是生活随笔為你收集整理的【计算机基础】存储器层次 Memory hierarchy的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【计算机基础】 操作系统总结(未完)
- 下一篇: 《Linux高性能服务器编程》学习笔记