cache子系统
1. 为什么需要cache子系统?
处理器执行指令的速度远大于一次访存miss造成的阻塞,两者的时间不在一个数量级。所以处理器的性能瓶颈在于数据从DISK到DDR到ALU的速度。内存墙是限制处理器发挥性能的主要瓶颈。
cache是利用程序局部性原理减轻memory wall的影响。
-
时间局部性
如果某条指令被执行,那么不久后再次被执行的可能性较大。指令不存在空间局部性,所有I-CACHE不能对memory-wall的影响有限。
-
空间局部性
如果程序访问了内存的某个单元,那当前内存单元相邻的内存单元短期内可能被访问的概率较大。D-cache主要利用空间局部性原理,加快cpu的访存数据的速度,同时通过一系列方法降低cache-miss造成的等待来提高CPU效率。
2.cache子系统的基本架构
多核系统中cache结构大致如下:
其中L1包含D-cahce和I-cache。各层cache的规律如下:
访问速度:L1>L2>L3,容量大小:L1<L2<L3。L1的访存速度最快,但是容量也最小,为核独有。L2,L3一般为共享cache,可以多核使用。L3访存速度最慢,但是容量最大。通过多级cache的机制,降低cache-miss的概率,提高数据/指令的访存速度。
3.cache系统如何建立地址映射规则
cache的地址映射主要有三种:全相连,直接映射,多路组相连。cache的地址映射是操作系统看不到的,软件不可见,由硬件维护。
-
全相连
主存中的任意一块数据可以映射到cache中的任意一块cacheline中。全相连的地址映射灵活度最高,cache利用率最高(全部cacheline都可以被使用),程序性能提升最大。但是控制电路复杂度极大,只能小规模使用。
-
直接映射
主存中一块数据只能映射到cache中的唯一特定块。电路实现最简单,只需要使用mod操作即可。但是容易产生cache震荡产生性能问题。例如有1024条cacheline,block0和block1024使用同一条cacheline0,如果block0和block1024经常被使用,则cacheline0则会被频繁的写入,换出。
-
多路组相连
全相连和直接映射的折中,多路组相连将整个cacheline空间氛围大小相同的n个way,每一个way包含2^m条cacheline,对于每个block,可在一个way中由直接映射或者n选1的方式进行替换。
目前CPU的主数据cache多采用多路组相连的地址映射方式。
这里再多探讨下不同场景下cache的使用策略:
-
刚被替换出去的cacheline,马上又被使用
因为cache-set的数量通常比可以映射到其中的地址数量少,会出现刚被淘汰的数据马上需要使用的情况。这时候为了避免性能下降,在实际设计中会使用一个小规模的全相连的victim cache来缓解这种冲突,并且victim cache中的数据和主cache中的数据互斥。victim-cache为全相连的,可以存储任意block,并且如果其中的数据马上需要被访问,可以从victim cache获取,可以提高该场景下的性能。
-
页表的cache
页表是操作系统维护虚拟地址和物理地址的一个映射表,页表一般存储在硬盘中,在需要的时候load到内存中。虚拟地址需要通过mmu进行地址转换才能对物理存储器进行寻址,此时就需要使用到页表。所以为了加快地址转换的效率,MMU内部有一个TLB(translation lookaside buffer)。TLB为页表cache,具备时间相关性。空间相关性弱,即未必会访问当前页的相邻页,因此预取等方法无法使用到TLB中。现代处理器一般使用两级TLB,第一级分为I-TLB和D-TLB,采用全相连结构。第二级指令数据共用,采用组相连。此处的TLB规模小,所以采用全相连的结构。
现代处理器中一般支持大小可变的页,由操作系统进行管理,很久不同应用选择不同大小的页,最大限度利用TLB。页太小,多级页表转换效率低;页太大,如果程序数据较小,则容易造成页浪费,整体效率低。
4.cpu核如何从cache中获取数据
cpu从cache中取数据的过程就是查找数据所在cacheline是否在N-way组相连中存在的过程。
通过tag-set-ofst三部分进行译码寻址。cache-hit时从cacheline中直接获取数据;cache-miss时需要从DDR中读取数据,替换cacheline。
5.cache系统如何替换数据
常用的替换算法有:随即替换,轮转替换,最近最少使用替换,最近使用替换,最不经常使用替换。
6.cache数据写回策略
cache数据写回策略为:write-through和write-back两种策略。
write-through:同时更新cache和DDR中的数据。此时cache和DDR中的数据是一致的,但是需要等待DDR回写完成,降低效率。
write-back:只更新cache,不刷新DDR。当替换cacheline时再写回到DDR。此时cache和DDR中的数据是不一致的,根据一致性协议维护数据一致性。
7.多核系统如何保证cache一致性
通过MOESI一致性协议维护多核之间cache一致性。