【前言】
cache是利用局部性原理(时间、空间),更好的解决硬件间速率不匹配的问。
现代CPU的Cache一般分为三级:
L1,Cache生产成本最高,容量最小,但是速度最快,处理器访问一级Cache中的数据一般只需要3~5个指令周期,一级Cache又分为数据Cache和指令Cache,分别缓存数据和指令;
L2,Cache不区分数据和指令,容量较大,速度较慢;
L3,Cache也称LLC(Last Level Cache),容量最大,而速度更慢。.
在多核时代,一般一颗CPU中,每核都有独立的一级和二级Cache,而多核之间共享三级Cache。
【Cache overview】
【 Multi-Cache】
CPU try load data from addr(inclusive cache 大范围cache):
- Find data in L1,if hit,then read data.
- If miss,Find in L2,if hit,return data to L1 and cpu.
- If miss,Find in L3,if hit, return data to L2 L1 and cpu.
- If miss,Find in DRAM, if hit,return data to L3 L2 L1 and cpu.
【 Cache策略—— 读写】
1. 读分配(read allocation):CPU读取数据时,cache发生miss,系统分配一个cache line从主存中读取数据,并将数据返回CPU。
2.写分配(write allocation):CPU写入数据时:a.直接更新主存数据。b.将数据先读入cache line,然后更新cache line中数据。
【 Cache策略—— 更新】
1. Write through:数据同时写入cache 与 DRAM(主存)
2. Write Back:数据只写入cache,仅当数据块被替换才写回主存(多CPU都在操作一块地址,其他CPU要操作地址了,就把数据写回主存)
【Cache Coherence Protocol —— MESI】
【Cache miss】
- Conflict miss:多个存储器映射到同一cache位置,首先加载A数据,然后加载B数据时,就会出现B cache miss,因为现在cache里面存着A。
- Capacity miss:cache容量不足,只能保存1234,但是程序循环12345,就会导致cache miss,最好方法:修改程序,因为cache是一定量的。
- Compulsory Miss:第一次访问失效,cold start miss(冷启动失效)。
- Communication Miss:同一片memory地址被多个CPU缓存,就会出现miss。
【Cache 结构】
哈希表:类似哈希表 + 链表形式。
【Cache 查找方式】
cache控制器在查找cache的时候,通常我们有3种方法,分别是:直接映射缓存、两路组相连缓存、全相连缓存。
cache line大小是16字节(bytes)。CPU即使读取1byte,在cache缺失后,cache会从主存中load 16字节填充整个cache line。
从0x0654读取数据,0x0654成方式c:
010:index 100: offset
tag(0000011001):每一个cache line都对应唯一tag,tag中保存的是整个地址位宽去除index和offset使用的bit剩余部分。
valid bit:这个bit用来表示cache line中数据是否有效(例如:1代表有效;0代表效)。
过程:我们根据index --> 找到cache line,取出tag然后与tag相比较,相等:hit,if not miss
【Cache 替换算法】
- Random:硬件随机选择一个cache块替换。
- RR(Round-Robin):按照预先设定顺序依次选择cache块替换
- LRU:最少使用,替换历史最少使用cache替换
【Cache False Sharing例子: 优化】
slab 着色技术
global param A/B or class:
volatile int A;
volatile int B;
【Cache 应用】
前提:CPU频繁访问某一段内存,访问率占90%。
1.时间局限性:循环程序中的循环体。
2.空间局限性:顺序程序的执行。
此外,我们可以利用编译器做到分支结构的预读取。