缓存
缓存:
关键理解:
对于直接映射:
1. 内存地址的格式是根据缓存的结构来的,通常需要:index+tag+offset+index of block。
index是指缓存块的索引,缓存块是指以分块的形式将缓存的每一部分和内存对应。可以有重叠。比如,如果一共有1024个块,那么第1025和第1内存地址都指向缓存块1。index of block是指缓存块内的索引,一个缓存块可以存储多个字,利用空间局部性原理,增加缓存命中率。offset是字内索引,索引字节,一个字等于4字节,所以一般是2位。tag是内存位数减去其他所有。
2. 缓存的格式一般是 index+valid+tag+data。 index与tag是和内存里的解释一样的,valid则是用来判断此缓存是否已经被使用。data则是存储内存存储的数据,如果一个数据块大小是4个字,那么data会有4*4*8比特。
3.缓存块容量更大,通过空间局部性原理,我们可以推断缓存命中率会变高,但是,与此同时,如果缓存没有命中,那么替换缓存内的数据的成本则是更高,因为大缓存块里字比较多,很难快速替换完成。失效损失会增大,缓存性能反而有可能增大。
4. 存储的指令失效时,只是从内存中取数据到缓存,而写入操作还需要更新内存的数据(因为缓存内数据不一样了),所以周期会更长。为了能够降低写操作带来的影响,使用写回策略(write-back),只有当被改写的数据块不再被需要的时候,才将缓存数据写回内存。
5. 为了避免性能损失,只加大缓存块并不可取,如3中所写,会增加失效损失。但是,如果提高了存储带宽,也就是如果能够更快速的传输cache的数据块,那么便可以减少失效损失的影响。所以一般为了提高内存性能,需要带宽与缓存块大小共同发力。
对于组相联映射:
1.组相联映射理论上可以表示其他所有映射模式:如假设cache中有8个数据块。对于直接映射来说,这意味着一共有8组数据,每组数据只包含一路数据块,所以直接映射也可以被表示为一路组相联映射。而对于全相联映射来说,则意味着,只有一组数据,这一组数据之中会存在8路数据块,所以对于n个数据块的情况,全相联映射等价于n路组相联映射。
2.依然以8组数据块的cache为例。当cache以两路组相联映射为基础结构时,那么总共就有8/2=4个数据组,每个数据组里有两路数据块。那么对于0,6,8,0这样的访问,对于直接映射来说,0和8对应的是同一组,会出现4次访问失效。而如果使用两路组相联,就可以减少最后一次的失效访问。
3.计算组相联映射的index的时候,首先需要将总共的数据块除以路数,得到每组数据的大小。假设每组数据大小为n,地址为m,那么index=m mod n 。
4. 大量实验数据表明,无脑增加每个数据组的大小,并不能带来更低的失效率。
5. 组相联的index计算,需要先把总数据块数m除以相联度n,然后再计算index=log2(m/n),由于每个set内的数据块也需要被区分,所以实际的block offset会相比直接相联大。
6. 也正因组相联还需要区分set内的数据块,所以实际上的电路构造里还需要比较器来判断,这对增加了实际电路的面积。
7. 通过使用多级缓存结构,可以有效减少失效损失。
Comments
Post a Comment