news 2026/6/16 19:41:04

《超标量处理器设计》---Cache

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《超标量处理器设计》---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验证时需要统计的参数

frequencyhit ratio统计窗口该窗口下的发包总数发包的BytesLatency(min/max/avg)折合成cyclle(min/max/avg)max outstanding
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 19:00:31

3分钟快速上手:如何零成本接入OpenAI API的完整开源项目指南

3分钟快速上手:如何零成本接入OpenAI API的完整开源项目指南 【免费下载链接】FREE-openai-api-keys collection for free openai keys to use in your projects 项目地址: https://gitcode.com/gh_mirrors/fr/FREE-openai-api-keys 对于追求高效AI开发工具的…

作者头像 李华
网站建设 2026/6/16 18:46:31

大模型没有终局:Scaling Law、具身智能与中国AI的路径选择

大模型没有终局:Scaling Law、具身智能与中国AI的路径选择 先说结论Scaling Law未失效,但已从纯语言转向多模态和具身智能,数据源头从互联网文本扩展到合成数据、人类视频。具身智能的护城河在于数据闭环、软硬协同和完整交付体系&#xff0c…

作者头像 李华
网站建设 2026/6/16 18:44:06

一根线搞定!双向Type-C转DP线让你轻松连接大屏

选对一根线,解锁8K与高刷:你的Type-C设备与DP显示器之间,其实只差一个支持DisplayPort Alt Mode的转接方案。如今电子设备的接口五花八门,Type-C凭借正反盲插、高速传输、一线多用等特性已成为主流标配,而DP接口在高清…

作者头像 李华
网站建设 2026/6/16 18:40:59

__shfl_down_sync()用法理解

这是理解 __shfl_down_sync() 最好的方法。 假设 Warp 中 32 个线程: Lane0 lane(0) Lane1 lane(1) Lane2 lane(2) ... Lane31 lane(31)这里的 lane(i) 表示线程 i 最初持有的数据。 例如: val lane(threadIdx.x);那么: val: 0 1 2…

作者头像 李华
网站建设 2026/6/16 18:25:51

烟台中老年缺牙修复,怎样选才靠谱不踩雷?

不少港城朋友之前看牙都有过类似糟心经历:咬着硬邦邦的硅橡胶印模忍不住干呕,拍完全口影像要等大半小时才能拿到胶片,取完的石膏模型还要专门送外加工点中转,一来二去多跑好几趟冤枉路。作为烟台较早落地全链路数字化口腔体系的国…

作者头像 李华