《超标量处理器设计》---Cache 📅 2026/6/16 19:41:14 1. cache存在的意义存储器的速度比处理器的速度慢时间相关性如果一个数据被访问了那么以后很有可能还是会被访问空间相关性如果一个数据现在被访问了那它周围的数据在以后很可能被访问2. 超标量处理器里cache 的分类一般是I-CACHE---- 缓存指令 D-CACHE------缓存数据 D-CACHE相对于I-CACHE来说最大的不同是有wite的场景3. cache的三种实现方式直接映射每个数据块只能被映射到固定的位置eg:火车坐票一人一票一位置直接映射主要用到三个参数Tag,Index,Block offset举例模拟访问过程初始缓存为空一共有4个setindex告诉 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的cache4. 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的data5. cache的性能提升方式写缓存对于下级cache只有一个读写端口的情况如果是write_backwrite_allocate,读写口可能发生冲突因此可以将脏状态的cacheline先写入write buffer先从下级cache读出要写的cache然后待下级存储的读写口idle再写回去上次放到write buffer中的数据多级cachevictim 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验证时需要统计的参数frequencyhit ratio统计窗口该窗口下的发包总数发包的BytesLatencymin/max/avg折合成cyclle(min/max/avg)max outstanding