前言:
这几天把现代CPU的缓存相关技术做了一个大概的了解,下面总结下一些比较基本以及可以在编写代码时可以优化自己的程序的要点.
- 每个核心都有独立的数据,指令缓存。
- 默认情况下CPU核心所有的数据读写都存储在缓存中。
- 现在AMD和VIA处理器采用的独占型缓存,Intel采用的包容型缓存(有时也采用独占型缓存)。
- 在对称多处理器中,内存视图为 高速缓存一致性!
- 一个脏缓存线不存在于任何其他处理器的缓存之中。
- 同一缓存线中的干净拷贝可以驻留在任意多个其他缓存之中。
- 现在的处理器都使用不同长度的内部管道,在管道内指令解码,并准备运行。
- 对于写操作,CPU并不需要等待数据被安全的放入内存。
- 全关联: 每个高速缓存段都可以容纳任何内存位置的一个副本。
- 全关联高速缓存对小缓存实用。对于L1i,L1d和更好级别的缓存,需要采用限制搜索。
- 组关联 结合了高速缓存的全关联和直接映射高速缓存的特点。
- 元素大小对预取的约束是根源于硬件预取的限制,它无法跨越页边界。
- TLB是存储虚实地址映射的缓存。为保持快速,TLB只有很小的容量,如果有大量页被反复访问,超出了TLB缓存容量,就会导致反复进行地址翻译!
- 最末级缓存越大,停留在L2访问耗时区的时间越长。处理器能够利用L1d到L2之间的预取消除访问主存,甚至是访问L2的时延。
- 在处理器随机访问时,处理器自动预取会导致反效果。
- 当工作集大小超过L2时,未命中率开始上升。
- 写通: 当缓存线被修改时,处理器立即将它写入主存。当缓存线被替代时,只需要简单的将它丢弃。
- FSB(前端总线) 是将CPU连接到北桥芯片的总线.
- 写回: 当修改缓存线时,处理器不再马上将它写回主存,而是打上dirty的标记,当以后某个时间点缓存线被丢弃时,这个已弄脏的标记会通知处理器把数据写回到主存中。
- 写入合并是一种有限的缓存优化策略,更多的用于显卡等设备之上的内存。
- MESI(modified,exclusive,shared,invalid)缓存一致性协议: 变更的(本地处理器修改了缓存线,同时暗示它是所有缓存中唯一的拷贝),独占的(缓存线没有被修改,而且没有被装入其他处理器缓存),共享的(缓存线没有被修改,但可能已被装入其他处理器缓存),无效的(缓存线无效,即未被使用)。
- 在MESI协议中,通过处理器监听其他处理器的活动,处理器将操作发布在外部引脚上,使外部可以了解到处理过程,目标的缓存线地址则可以在地址总线上看到。
- 请求所有权(RFO) 在两种情况下是必须的:线程从一个处理器迁移到另一个处理器,需要将所有缓存线移到新处理器;某条缓存线确实需要被两个处理器使用。
- 多线程或多进程程序总是需要同步,而这种同步要依赖内存来实现。
- 对于大缓存(L2,L3)需要以物理地址作为标签,因为这些缓存的时延比较大,虚拟到物理地址的映射可以在允许的时间里完成,而且由于主存时延的存在,重新填充这些缓存会消耗比较长的时间,刷新的代价比较大。
- 追踪缓存,统一缓存。
- 关键字优先级较早重启技术 在预取操作时无法运用,因为并不知道哪个是关键字。在关键字优先技术生效的情况下,关键字的位置会影响性能。
- 虽然缓存放置的位置与超线程,内核,处理器之间的关系不在程序员的控制范围之内,但程序员可以决定线程执行的位置,这样高速缓存与使用的CPU的关系将变得非常重要。