《超标量处理器设计》---Cache
1. cache存在的意义
- 存储器的速度比处理器的速度慢
- 时间相关性:如果一个数据被访问了,那么以后很有可能还是会被访问
- 空间相关性:如果一个数据现在被访问了,那它周围的数据在以后很可能被访问
2. 超标量处理器里cache 的分类
一般是I-CACHE---- 缓存指令 D-CACHE------缓存数据 ,D-CACHE相对于I-CACHE来说最大的不同是有wite的场景
3. cache的三种实现方式
- 直接映射
每个数据块只能被映射到固定的位置
eg:火车坐票,一人一票一位置
直接映射主要用到三个参数,Tag,Index,Block offset
举例:
模拟访问过程(初始缓存为空)
一共有4个set
index:告诉 CPU 这次访问必须去缓存里哪一行(直接映射,地址到行号一一对应)。
比如:0x40 和 0x1000_0040 虽然 Tag 不同,但索引都是 0,所以它们只能竞争同一个缓存行。
tag:存放在该行里,用于验证当前行存储的到底是哪个主存块。
访问时 CPU 取地址的 Index 找到行,取出该行的 Tag,与地址中的 Tag 比较:
相等 → 命中(Hit),直接从该行读取数据(用 Offset 选字节)。
不等 → 未命中(Miss),将新的数据块(含新 Tag)加载进来,旧数据被覆盖
因此,如果两个index相同的存储地址交互访问cache,就会一直导致cache缺失,影响执行效率
全相连
每个数据块可以被映射到任何一个空闲的位置
eg:公交车,有票有位置,随便坐
全相连相当于在整个cache中使用tag在寻址,因此寻找一个cacheline是否在cache中需要有大量的内容进行比较组相联
将Cache分为若干个组(Set),每个组包含多个路(Way)。一个数据块可以放到该组内的任意一路(即组内的任意一个位置),但不能跨组。
假设是2set 2way的cache
4. cahce的写入
write through:执行一条store指令,数据写到D-CACHE的同时也写到下级存储器中
non-write allocate:写未命中时不会将对应的内存行分配到缓存中。写操作会直接穿透缓存,更新到下一级内存,同时通常会使缓存中可能存在的旧副本无效(如果该行已在缓存中则更新,但不会新建一个缓存行)
一般write through和non-write allocate搭配使用
write back:当 CPU 执行写操作且数据已经hit时,只更新缓存中的数据,而不立即写入主存。只有当该缓存行被替换出缓存时,才将其修改过的内容(称为“脏数据”)写回到主存
write allocate:写miss时,把下级存储的整块数据搬到D-CACHE中,然后将修改的数据合并进去
实际修改的时word1,但是不用allocate直接把整个 cacheline写到下级存储会污染下级存储word0/word2/word3的data
5. cache的性能提升方式
- 写缓存
对于下级cache只有一个读写端口的情况,如果是write_back+write_allocate,读写口可能发生冲突,因此可以将脏状态的cacheline先写入write buffer,先从下级cache读出要写的cache,然后待下级存储的读写口idle,再写回去上次放到write buffer中的数据 - 多级cache
- victim cache
这个和写缓存类似,会把最近被踢掉的cacheline放到victim cache中,以备用,比如2 way的cache,但是有三个数据都用同一个set,则3个cacheline会被不断替换掉,就可以把替换的那个放到victim cache,用的时候直接从victim cache里拿 - prefetch
特别是在I-CACHE中指令的取值比较有规律,所以用预取的方式提前把数据放到cache中
prefetch分为硬件prefetch和sw prefetch
硬件prefetch:针对指令fetch的cacheline,主动再多fetch几个cacheline
软件prefetch:软件知道自己后面可能要用一些数据,就提前用指令把这段数据取出来
6.cache PERF验证时需要统计的参数
| frequency | hit ratio | 统计窗口 | 该窗口下的发包总数 | 发包的Bytes | Latency(min/max/avg) | 折合成cyclle(min/max/avg) | max outstanding |
