3. 替换策略
Cache失效原因Cache包括以下几个失效原因:义务失效(Compulsory),冲突失效(Conflict),容量失效(Capacity),一致性失效(Coherence),无效失效。
义务失效是由于第一次访问某一内存造成的失效。
冲突失效是由于不同的存储位置映射到同一Cache索引造成的失效。冲突失效的解决办法有增大Cache容量;增加相联读,对同一Cache索引可以有多个信息项。全相联,完全不要索引,并行比较所有的标签,对于全相联Cache,冲突失效=0。
容量失效是由于Cache不能保证程序访问需要的所有的数据块造成的失效。容量失效可以通过增大Cache容量解决。
Cache失效后替换时,对于直接映射Cache,每个存储器位置只能映射到唯一一个Cache位置,定位时不需要任何判断,当前的信息项替换掉Cache中该位置上的前一个信息项。对于N路相联Cache,每个存储器位置可以选择N个Cache位置之一。对于全相联Cache,每个Memory可以存放在任意Cache位置。
当CPU发出读操作命令时,根据它产生的主存地址分为两种情形:一种是需要的数据已在Cache中,那么只需直接访问Cache,从对应单元中读取信息到数据总线;另一种是需要的数据尚未装入Cache,CPU需从主存中读取信息的同时,Cache替换部件把该地址所在的那块存储内容从主存拷贝到Cache中;若Cache中相应位置已被字块占满,就必须去掉旧的字块。常见的替换策略有四种:
随机替换策略:硬件随机选择一个Cache数据块替换出去。优点:简单,易于实现。缺点:没有考虑Cache块的使用历史,反应程序的局部性较差,失效率较高。
先进先出策略(FIFO)FIFO(First In First Out)策略总是把最先调入的Cache字块替换出去,它不需要随时记录各个字块的使用情况,较容易实现;缺点是经常使用的块,如一个包含循环程序的块也可能由于它是最早的块而被替换掉。
最近最少使用策略(LRU)(Least Recently Used)策略是把当前近期Cache中使用次数最少的那块信息块替换出去,这种替换算法需要随时记录Cache中字块的使用情况。LRU的平均命中率比FIFO高,在组相联映像方式中,当分组容量加大时,LRU的命中率也会提高。缺点:实现复杂,硬件实现困难。
PLRU:基于一个二叉树来淘汰,减少比较的次数。
相联度高,失效率较低;Cache容量较大,失效率较低;LRU 在Cache容量较小时,失效率较低;随着Cache容量的加大,Random的失效率在降低。
当CPU发出写操作命令时,也要根据它产生的主存地址分为两种情形:一种是命中时,这时会遇到如何保持Cache与主存的一致性问题,通常有两种处理方式:
直写式(write through)即CPU在向Cache写入数据的同时,也把数据写入主存以保证Cache和主存中相应单元数据的一致性,其特点是简单可靠,但由于CPU每次更新时都要对主存写入,速度必然受影响。
回写式(write back)即CPU只向Cache写入,并用标记加以注明,直到Cache中被写过的块要被进入的信息块取代时,才一次写入主存。这种方式考虑到写入的往往是中间结果,每次写入主存速度慢而且不必要。其特点是速度快,避免了不必要的冗余写操作,但结构上较复杂。
这两种写策略各有利弊。对于回写策略,写操作能以Cache的速度来进行,而且在一个块内进行多次写操作仅需要一次对低级存储器的写动作,有益于降低对存储器的带宽要求,使其在多处理器系统中备受重视。对于直写,主存中总是保存着最新数据,这对于多处理器系统和I/O设计都是非常重要的。
4. cache工作流程 - 处理器中的MESI,MEI协议
MESI是Modified Exclusive Shared Invalid的第一个字母。因为在一个多核CPU系统里包含多个拥有CACHE的CPU,而这些CPU又共用同一主存,为了确保这些CACHE和主存之间数据的一致性,引入MESI协议。
M:Modified。指该CACHE行包含的数据相对于主存是被修改过的。
E:Exclusive。指该CACHE行里的数据在整个系统的CACHE里是独有的,且未被修改过。
S:Shared。指该CACHE行里的数据在其他CACHE里也存在,但不能断定其他CACHE行的数据是S还是M。
I:该CACHE行无效。
MEI在MESI的基础上删除了Shared状态,禁止数据在处理器的Dcache内共享。
状态迁移图(略)
以上都是一些cache的原理,理解是cpu芯片选型,以及代码性能优化的基础。








