1. cache 介绍
影响Cache缺失的情况有3种:
- Compulsory: 第一次被访问的指令或者数据肯定不会在cache中,需要通过预取来减少这种缺失
- Capcity: Cache容量越大,缺失就可以更少, 程序频繁使用的三个数据来源于3个set, 但是,核由于面积的约束,只有2个set
- Conflict, 指多个数据映射到Cache中的同一个位置, 程序频繁使用的三个数据来源于同一个Cache set;可以使用Victim Cache来缓解这个问题
1.1 cache的结构
cache主要由两部分组成,Tag部分和Data部分。Data部分用来保存一片连续地址的数据,而Tag部分则是存储这片连续数据的公共地址,一个Tag和它对应的所有数据组成的一行称为一个Cache line; 而Cache line中的数据部分称为数据块(Cache data block), 如果一个数据块可以存储在Cache中的多个地方,这些被同一个地址找到的多个Cache line称为一个Cache set。如TLB和Victim Cache多采用了全相连结构,而普通的I-cache和D-cache则采用组相连结构
1.2 Cache的实现方式
并行访问:如果同时访问Tag SRAM和Data SRAM, 我们称之为并行访问。将读出来的地址和数据都送到一个多路选择器上,这个多路选择器受到Tag比较结构的控制。然后根据存储器地址中的block offset的值选出合适的字节,一般将选择字节的过程称为数据对齐。
- 地址计算: 计算得出存储器的地址
- 冲突检查: 对load/store指令之间存在的相关性进行检查
- 并行访问Tag SRAM和Data SRAM, 并使用结果进行选择
- 使用存储器中的block offset 从data block 种选出最终需要的数据
串行访问:访问SRAM这一级少了mux, 对于时序较为友好,但是多了一个cycle。串行访问的功耗也更为友好,因为是根据比较之后的结果进行访问
Note: 如果处理器是超标量处理器,可以乱序执行,那么我们选择串行访问效果更好,因为访问cache多的这个时钟周期可以通过执行其它指令来掩盖掉,并且通过串行访问,可以减少delay, 提高时钟频率。如果是普通的顺序执行的处理器,选择并行访问比较好。
1.3 cache的写入
写通:当数据写到D-cache的同时,也写入到它的下级存储器中
写回:当数据写到D-cache时,不会立即写入到下级存储器中,只会在cache line中做一个记号,只有当该cache line需要被替换时,才会写入到下一级存储器中
上述情况都是默认要写入的地址总是在D-Cache中,如果发现这个地址不在D-cache上时,就发生了写缺失(write miss), 此时最简单的处理方法就是将数据写到下级存储器,称为non-write allocate.
如果发生写缺失时,将发生缺失的地址对应的整个数据块取出来,将数据合并到这个数据块中,然后将被改过的数据块写入到D-Cache中(wirte allocate), 之后也需要将这个数据块写入到下级存储器中(write allocate)
NOTE: 写通方式的优点是结构简单,方便一致性管理。缺点是执行效率不高,每一次写入都需要修改下级存储器。在一般的处理器当中,L2 Cache会采用写回的方式,但对于L1 cache来看,写通的方式也是可以接受的,这样可以简化流水线的设计,便于在多核的情况下管理内存一致性。
1.4 提高cache的性能
- write buffer
- 多级cache
现在L1 cache一般都做成inclusive的模式,因为实现简单,并且方便管理
3. victim cache
victim cache可以保存最近被提出cache 的数据, 因此所有的cache set 都可以利用它来提高way 的个数, 通常victim cache 采用全相连的方式,容量都比较小。
- 硬件预取 prefetch
由于程序本身是串行执行的,因此只需要访问I-Cache中的一个数据块的时候,将它后面的数据块也取出放到I-cache中就可以了,但是存在分支指令,使得不会使用的指令进入了I-cache, 这一方面降低了I-Cache实际可用的容量,一方面占用了可能有用的指令,称为Cache 污染。为了避免这种情况的发生,我们可以将预取的指令放到一个单独的缓存中
- 多端口cache
5.1 true multi-port
真的使用一个多端口的SRAM来实现多端口的Cache,SRMA中的每个cell支持两个读端口和一个写端口。缺点是多端口的CELL需要驱动多个读端口,因此需要更多的访问时间,功耗也会增大。
5.2 Multiple Cache copies
将SRAM进行复制来实现多端口的读写,这样可以基本消除读处理周期时间的影响,但是,这种方法浪费面积,并且需要保持两个CAche的同步,功耗也比较大。
5.3 multi-banking
每个bank都只有一个端口,如果在一个周期之内,CACHE的多个访问地址位于不同的bank, 则不会发生问题,如果处于同一个bank, 则会引起bank 冲突
2. cache的分类
2.1 virtual cache
-
TLB只是加速了从虚拟地址到物理地址的转换,但是要直接从物理内存中取数据依然很慢,因此可以用cache将物理地址到数据的转换过程缓存起来。
-
我们可以直接将虚拟地址和物理存储中的数据对应起来,这样就简化了查找TLB的过程。但是会引入两个问题,一个是不同的虚拟地址对应同一个物理位置,由于不同的虚拟地址会占用不同的cache line, 因此浪费了宝贵的cache空间,造成cache容量的减少,二是执行store指令时,本质上应该对同一个物理地址的cache line都应该修改。
-
由于虚拟地址和物理地址的低12位(4K)是相等的,因此如果cache的容量小于4K, 那么寻址cache的地址就不会大于12位,此时即使两个不同的虚拟地址对应一个物理位置,他们寻址cache的地址也会相同。
-
当cached的容量大于页的大小时,我们需要通过bank结构来解决这种重命名的问题,可以使用L2 CAche来实现这个功能,使L2 cache中包括所有的L1 cache的内容,也就是之前的inclusive的方式
小结
cache的内容较多,涉及到cache pipeline的设计(并行结构,串行结构),cache的大小计算,cache 内部结果的设计(multi-bank, 组相连,全相联等),对于这些分知识点,后续也需要单独介绍。