lecture18_Caches
Caches
Memory Hierarchy (层次化内存)
- 寄存器离 CPU 最近,使用也最快;但是很贵;每个 CPU 只有少量寄存器
- DRAM 更适合存储大量数据,但是速度更慢
- 需要数据总线进行传输
加速方式
Hardware Multithreaing
- 在等待数据的过程中,切换到另一个进行去执行任务
- 每个物理核含有两个 PC 核寄存器组,所以上下文切换很快
Prefetching
- 每个周期预取指令和数据
Caching
利用空间局部性和时间局部性,减少和主存之间的数据传输
缓存中存放被主存使用的数据副本
主存中存放磁盘上的数据副本
层次化管理
- Registers <—> Memory
- 通过编译器或者汇编级别编程
- Cache <—> 主存
- 通过缓存控制硬件
- Main Memory <—> Disks
- 通过操作系统(虚拟内存)
- 通过编程者 (files)
Cache 三种映射
全相联映射
每个数据可以被映射到 n 个位置
物理地址被分为 tag and offset
直接映射
- 每个数据只能映射到固定的一个位置
组相联映射
- 分为 m 个组;每个数据可以被映射到每个组组内的任意位置
- 每个地址被分为 tag + index(组的索引) + offset(块大小)
替换策略
- LRU
- 最近最少用的块被驱逐出缓存
- MRU
- 最近使用过的块被驱逐
- FIFO
- 最老的块被驱逐(queue)
- LIFO
- 最新的块被驱逐(stack)
写策略
- 回写策略
- 数据改变,马上更新 cache 和 memory 的数据
- 写回
- 每次只更新 cache 的数据
- 直到该块被驱逐,检查 dirty flag,将改变写回 main memory
- 比回写快
多级缓存
- 每级缓存比前一级更大,缓存的数据更多
caching with multithreading
每个核有自己的 L1、L2 缓存
不同的核进行读取核写入时可能发生缓存的不一致问题
MSI Protocol (缓存一致性)
- 读取时,检查其他的核心该块是否是脏块,如果是回写该改动
- 写入时,如果该块在其他核中可用,使其不可用(如果是脏块,回写数据)
- Invalid:该块不在缓存
- Shared:该块在其他核心;还未进行更改,如果要更改,驱逐每个人缓存中的该块,转化为 modified
- Modified:该块已经被读和修改;稍后其他缓存不在拥有该块
MOESI
Exclusive: Same as valid bit on, dirty bit off in regular cache
The block has been read, but not modified
Further, no other cache has this block
Owner:
- The block is in some other cache
- If we make modifications, it’s our responsibility to tell all the other caches in shared state about thesechanges
- Allows for writing while other threads read the same data.
Coherence Missed (一致性 miss)
- 两个线程同时写相同的块
- 可能造成错误共享
- The entire block is invalidated and must be reloaded, even though technically no data is shared.
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LZY的Code生活!