Cache工作原理-6

来源:互联网 发布:淘宝商家怎么收款 编辑:程序博客网 时间:2024/05/01 00:32

 

2.4.6 Pentium PCCache

  Pentium PC仍是一个单处理器系统,它采用两级cache结构。安装在主板上的级2 cacheL2),其容量是256 KB512KB,采用的两路组相联映射方式,每行可以是3264128字节。集成在Pentium处理器内的级1 cache L1)其容量是16KB,采用的也是两路组相联映射方式,每行是32字节。L2的内容是432MB容量主存的子集,L1又是L2的子集,从而使L1未命中处理时间大为缩短,为L1的高速使用提供了支持,但L1L2之间显然存在数据一致性的问题。
  另一特点是,它将16KBL1分立为各8KB的指令cache和数据cache。有学者曾对某些程序进行跟踪研究,得到的统计结果是:取指令占63%,取数占25%,写数占12%。这一结果表明将指令cache与数据cache分开是有好处的。指令cache是只读的,单端口256位(32字节)向指令预取缓冲器提供指令代码。数据cache是读写的,双端口,每端口32位(4字节),向两条流水线的整数运算单元和寄存器提供数据或接收数据,两个端口还可组合成一个64位端口与浮点运算单元相接。两个cache64位数据、32位地址的CPU内部总线相连。
  下面分别介绍Pentium1 cache的组织和一致性的实现。因指令cache只有读操作和换出(替换)操作,没有写操作也就没有一致性问题。下面只介绍数据cache

  一. Pentium1 cache的组织结构

  8KB的数据cache采用两路组相联的组织方式,分成2路,128组,每组2行,每行32字节 8个双字,1个双字32位)。每行有一个20位的标记(标记的最后一位为路号)和2位的MES /I的状态位,这22位构成该行的目录项。采用LRU替换策略,一组两行共用一个LRU位(理由已在242 节说明)。这样L1数据cache呈现出如图236所示的两路存储体结构。L1指令cache的组织类同于此,只是不再是2位状态位而是1位有效位

 

  存cache使用32位物理地址。级1指令cache和数据cache每个都有一个变换后援缓冲器TLB Translation Lookaside Buffer),用于在虚拟存储方式下将线性地址变换为物理地址。
  数据cache可以在一个处理器时钟周期内存取两个数据,数据可以是字节、字(2字节)和双字(4字节)。这两个数据分别通过两个32位端口被UV两条指令流水的ALU单元、寄存器所存取(详见第六章)。Pentium处理器的时钟频率在它刚推出时是66MHZ,最高是200MHZ。新一代的Pentium处理器目前已有5001000MHz了。可以想见,若没有片内cache的支持,,高速的指令流水必将经常停滞不前,更不用说两路流水的超标量结构了。
  为维护cache的一致性,级2 cache和级1数据cache都采用的是MESI协议。鉴于级1数据cache采用的是写一次法,其MESI协议做了一些简化(详见下一小节)。为支持监听片外内存访问活动, Pentium为片内数据cache提供了一个监听窗口。在监听期间, Pentium浮起它的地址输出引脚,而允许片外输入地址,以使片内数据cache能判测是否监听命中。并有如下一些处理器引脚: INV(输入,使无效), WB/MT#(输入,写回/写直达), HIT#(输出,监听命中), HITM#(输出,修改状态行监听命中)等,这些信号或者协调片内cache MESI协议的状态转换,或者输出监听命中指示以使片外cache能判测并完成相应的状态转换。

  二. Pentium1cacheMESI协议

  下面介绍Pentiun1数据cache L1)的MESI协议,以及它如何与级2 cache L2)相配合来维护一致性并能充分支持Pentium高速运行的特点。经上节介绍可给出 237所示的L1 L2和主存之间操作环境的框图。

  Pentium CPU与外部数据交换的存储读写总线周期主要有两大类:一类是前面介绍的256位猝发式传送,用于L1的行填入和行写出;另一类是不经L164位(以及以下)传送,此时CHACE# 信号为高电平,在Intel数据手册中称此为"不可超高速缓存"式传送。
  由于L1位于CPU内部,它的内容又是L2内容的子集,因此L1L2的监听对象不同。L2监听系统总线上其它系统主控者和其它cache的访问主存活动;L1监听L2,采样L2发出的WB/WT# 信号和INV信号以完成相应的行状态转换,并有监听命中信号HIT#和HITM#送至L2 L2可发出AHOLD信号,命CPU的地址引脚改变为输入方向,强制CPUL1进入监听期间,INTEL数据手册中称此为询问期间,它的活动情况完全同于监听期间情况。
  由此可见,L2负责整个系统的Cache与主存一致性;L1负责响应L2,与L2一起维护L1L2一致性。
  L2采用的是写回法,并遵循MESI协议。L1基本上是采用写回法,但在最佳设置情况下允许结合一些写直达操作,这里的写直达是既向片内L1写入又向片外启动一个存储器写总线周期。下面将会看到这种情况出现在对未修改行的第一次写操作时,故它是写一次法。244已说明L1采用此法的原因。尔后对此修改行的再次或多次写命中采用的都是写回法策略,不向片外写,只在该行被换出或读/写监听命中时才写回。
  L1遵循MESI协议,但它将E态重新定义为第一次写命中后的修改态,实际上L1绝不会有同于主存而又不出现于L2的专有态行。图238给出L1 MESI协议状态转换图。该图将与L1有效行具有相同内存(块)地址的L2有效行可能有的状态列出,该图与图235类似的状态转换用相同的*数码形式进行标注,以帮助理解此图。

  对上图再作以下说明:
  1)当L1读未命中时要启动一个存储器读总线周期,由片外读入一行填入空行(若未有空行,先以LRU算法换出一行)。此周期首先引起L2判测是否读命中,若读命中, L2递交同地址的有效行并返回WB/WT#信号。若L1新行拷贝的是L2S态行或E态行(WB/WT#为低电平),新行状态为S*1);若L1新行拷贝的是L2M态行(WB/WT#为高电平),新行状态为E*2)。若L2读未命中,则由主存读取此地址的数据块同时拷贝到L2L1 L2的新行状态为ESL1的新行状态为S,逻辑上仍可看作L1的新行是由L2拷贝而来。
  (2 L1S态行发生写命中,除此行在片内完成写修改并进入(特殊的)E态之外(*7),还启动了一个片外的存储写周期,这就是前述的写一次操作。它必然引起L2的写命中, L2E态行或S态行完成写修改进入M态。此时注意,若是L2S态行写命中,还要引发一个无效处理过程(见图235),使系统中其它cache的同此地址的共享行无效,这正是L1采用写一次法的原因。它将广播通知其它cache无效处理的工作交由L2控制逻辑完成,也是它的巧妙之处。
  (3L1写未命中时, Pentium只是将内存地址和具体修改字送出片外,即启动一个存储写总线周期,L1不分配新行(*3)。此时L2可能发生写命中,完成其有效行的写修改并进入或保持在M态;若是L2也是写未命中,则要读取内存块至L2再修改(图235中的由IM操作)。L1将这种读内存再修改的耗时工作又交给L2去完成了。当然,L1也要为此做出一点牺牲,即它不容有这个最近存取过的拷贝,但此拷贝已在L2,下次读取时很快就可得到。这样, Pentium启动一个存储写周期后就可立即进行片内其它操作,支持了指令流水执行。
  (4245己说明MESI协议维护一致性的关键在于,修改过的cache行在临界情况下及时写回主存以保证它者使用的正确性。 L2监听系统总线上的其它主控者或其它cache的访问主存活动。那么,我们来分析L2M态行的L1同地址行有哪些状态:
  (aL1M---L2M,这是L1至少两次写修改的情况,最新数据在L1M行; bL1E--L2M,这是L1写一次情况或是L1拷贝L2M行的情况,两行内容相同; cL1I--L2M,这是上面(3)所述的L1写未命中的情况,实际上L2M态行此时在L1没有同地址行。换句话说, L2M态行包含了L1M态行和E态行,而且L2M态行与L1M态行存在不一致性。
  因此,当L2M态行读/写监听命中时, L2要以AHOLD信号有效强行令L1进入监听期间,来查询L1是否也监听命中。如果L1返回的是HITM#和HIT#信号都为有效,表明这是L1M--L2M情况, L1M态行读/写监听命中要以猝发(burst)方式将此行写到主存,然后该行相应进入S*14)/I*15)态。如果L1返回的是HITM# 无效而HIT# 有效,表明这是L1E--L2M情况, L1E态行读/写监听命中只是相应地进入S*8/I*10)态,由L2将它的M态行写回到主存(见图235M → SM → I)。如果L1返回的是HITM#和HIT#都无效,表明这是L1I--L2M情况,一样也是由L2将它的M态行写回到主存,L1无动作。
  图238的其它状态转换与图235类似,请自行比较理解,恕不详述。
  综上所述,MESI协议使L1L2密切配合,既保证了整个系统的cache/主存的一致性,又简化了L1的控制逻辑并对CPU的高速运行提供了有力支持。