CACHE的Miss和Hit
1.L1 CACHE的Miss和Hit
1.1 Read Miss
见2.1。
1.2 Write Miss
L1D是Read-allocate CACHE,意味着仅在发生Read Miss时才会读入新的行。如果写Miss发生,数据通过一个Write Buffer写到低一级内存,从而把L1D CACHE旁路。写buffer包含4个entries,每个entry是64位宽。
1.3 Write Hit
发生写命中,数据被写到CACHE中,但并不立刻就送到低一级内存。既然CACHE的类型是write-back,那么当CACHE中的数据被CPU写操作修改后,在以后某个时间会回写到内存中。为了回写修改的数据,你必须知道哪个行被CPU修改。为了这个目的,每个行都有一个Dirty状态,只要CPU写一个CACHE行,那么这个行的dirty位就设为1。,只有dirty行才会因为被驱逐而回写到内存,如果行没有被修改,也就是这一行是Clean,那么它的内容会被废弃。回写操作也可以由程序指令来主动触发。
2.L2 CACHE的Miss和Hit
2.1 Read Miss和Hit
CPU对一个可CACHE的外部内存产生读请求,如果在L1(可能是L1P或L1D)发生Miss,再如果这个地址在L2 CACHE中也Miss,那么对应行被读入到L2 CACHE。LRU位决定哪个Way的Line Frame被定位取代,如果这个Line Frame包含Dirty数据,它首先在新的行去进来之前被writeback到外部内存(如果这个Line也包含在L1D中,则L1D中的这个Line首先在L2这一行送到外部内存之前被writeback到L2),形成的L1行(包含请求的地址)被送到L1,L1存储这行数据,并最终把它送给CPU。之后,如果新的Line代替的是一个Dirty行,则这行写到L2 CACHE中。从这个过程我们发现L2和L1 CACHE是一致的。
如果L2命中,则对应行直接送到L1
对于不可CACHE的外部内存区域,请求的数据简单地直接由外部内存送到CPU,不会存储在任何CACHE中。
2.2 Write Miss和Hit
CPU对外部可CACHE的内存进行写请求,这个数据地址在L1D中Miss,于是通过Write buffer送到L2,如果L2检测到这个地址是Miss,对应的L2 CACHE Line从外部内存取进来,然后更新。LRU位决定哪个Way的Line Frame被定位取代,如果这个Line Frame包含Dirty数据,它首先在新的行去进来之前被writeback到外部内存。注意这个行不会存储在L1D,所以如果在L1D中Miss,因为L1D是仅read-allocate的,绝对不会因为写操作而修改CACHE内容。当然如果被L1D命中,则直接修改L1D内容。
如果L2命中,直接修改L2。
对于不可CACHE的外部内存区域,请求的数据简单地直接写到外部内存,不会存储在CACHE中。