依然是cache

来源:互联网 发布:usb电子显微镜软件app 编辑:程序博客网 时间:2024/04/25 13:32

作为对cache的总结帖,对文章做了一些修改,并加进了自己对cache的理解。

cache n. 高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问。存储器的高速缓冲存储器存储了频繁访问的 RAM 位置的内容及这些数据项(若访问数据段这就需要注意了,数据段中变量大多不会被重复利用,若划入cache域这反而会降低效率)的存储地址。当处理器引用存储器中的某地址时,高速缓冲存储器便检查是否存有该地址。如果存有该地址,则将数据返回处理器(cache命中);如果没有保存该地址,则进行常规的存储器访问(cache没命中)。因为高速缓冲存储器总是比主RAM 存储器速度快,所以当 RAM 的访问速度低于微处理器的速度时,常使用高速缓冲存储器。

Cache的出现是基于两种因素:首先,是由于CPU的速度和性能提高很快而主存速度较低且价格高,第二就是程序执行的局部性特点。因此,才将速度比较快而容量有限的SRAM构成Cache,目的在于尽可能发挥CPU的高速度。很显然,要尽可能发挥CPU的高速度就必须用硬件实现其全部功能。

  Cache与主存之间可采取多种地址映射方式,直接映射方式是其中的一种。在这种映射方式下,主存中的每一页只能复制到某一固定的Cache页中。由于Cache块(页)的大小为16B,而Cache容量为16KB。因此,此Cache可分为1024页。可以看到,Cache的页内地址只需4位即可表示;而Cache的页号需用10位二进制数来表示;在映射时,是将主存地址直接复制,现主存地址为1234E8F8(十六进制),则最低4位为Cache的页内地址,即1000,中间10位为Cache的页号,即1010001111。Cache的容量为16KB决定用这14位编码即可表示。题中所需求的Cache的地址为10100011111000。

  Cache中的内容随命中率的降低需要经常替换新的内容。替换算法有多种,例如,先入后出(FILO)算法、随机替换(RAND)算法、先入先出(FIFO)算法、近期最少使用(LRU)算法(应用在44b0算法)等。这些替换算法各有优缺点,就以命中率而言,近期最少使用(LRU)算法的命中率最高(就读命中率而言44b0的cache还是不错的,但是44b0对于写采用write through(写通)算法,write through 保证cache主存的数据一致性,却不是最高效的)。

注:直接映像(Direct-mapped)

组相连(Set-associative)

/////////////////////////////////////////////////////

由于主存中的块比 Cache 中的块多,所以当要从主存调入一个块到 Cache 中时,会出现该块所映象到的一组(或一个) Cache 块已全被占用的情况。这时,需强迫腾出其中的某一块,以接纳新调入的块。那么应该替换哪一块呢? 这就是替换算法所要解决的问题。
  直接映象 Cache 中的替换很简单,因为只有一个块,别无选择。而在组相联(44b0即为组相连cache)和全相联 Cache 中,则有多个块供选择,我们当然希望应尽可能避免替换掉马上就要用到的信息。主要的替换算法有以下三种。

1. 随机法

  为了均匀使用一组中的各块,这种方法随机地选择被替换的块。有些系统采用伪随机数法产生块号,以使行为可再现。这对于调试硬件是很有用的。
  这种方法的优点是简单、易于用硬件实现,但这种方法没有考虑 Cache 块过去被使用的情况,反映不了程序的局部性,所以其失效率比 LRU 的高。

2. 先进先出法FIFO First-In-First-Out

  这种方法选择最早调入的块作为被替换的块。其优点也是容易实现。它虽然利用了同一组中各块进入Cache的顺序这一“历史”信息,但还是不能正确地反映程序的局部性。因为最先进入的块,很可能是经常要用到的块。

3. 最近最少使用法LRULeast Recently Used

   这种方法本来是指选择近期最少被访问的块作为被替换的块。但由于实现比较困难,现在实际上实现的 LRU 都只是选择最久没有被访问过的块作为被替换的块。这种方法所依据的是局部性原理的一个推论:如果最近刚用过的块很可能就是马上要再用到的块,则最久没用过的块就是最佳的被替换者
  LRU 能较好地反映程序的局部性,因而其失效率在上述三种方法中是最低的。但是 LRU 比较复杂,硬件实现比较困难,特别是当组的大小增加时,LRU 的实现代价会越来越高,而且经常只是近似地实现。

  
    LRU 和随机法分别因其失效率低和实现简单而被广泛采用。

处理器对 Cache 的访问主要是读访问,因为所有对指令的访问都是“读”,而且大多数指令都不对存储器进行“写”。第二章中指出,DLX 程序的 Store Load 指(非ARM指令)令所占的比例分别为9%和26%,由此可得“写”在所有访存操作中所占的比例为

      9%/(100% + 26% + 9%) ≈ 7%,

而在访问数据 Cache 操作中所占的比例为

      9%/(26% + 9%) ≈ 25%。

基于上述百分比,特别是考虑到处理器一般是对“读”要等待,而对“写”却不必等待,应该说设计 Cache 要针对最经常发生的“读”进行优化。然而,Amdahl定律告诉我们,高性能 Cache 的设计不能忽略“写”的速度。

  幸运的是,最经常发生的“读”也是最容易提高速度的。访问 Cache 时,在读出标识进行比较的同时,可以把相应的 Cache 块也读出。如果命中,则把该块中所请求的数据立即送给 CPU;若为失效(读出标识并进行比较才会确认失效,即没命中),则所读出的块没什么用
处,但也没什么坏处,置之不理就是了。

  然而,对于“写”却不是如此。只有在读出标识并进行比较,确认是命中后,才可对Cache块进行写入。由于检查标识不能与写入 Cache 块并行进行,“写”一般比“读”花费更多的时间
  按照存储层次的要求, Cache 内容应是主存部分内容的一个副本。但是“写”访问却
有可能导致它们内容的不一致例如,当处理机进行“写”访问,往 Cache 写入新的数据后,则 Cache 中相应单元的内容已发生变化,而主存中该单元的内容却仍然是原来的。这就产生了所谓的 Cache 与主存内容的一致性问题。显然,为了保证正确性,主存的内容也必须更新。至于何时更新,这正是写策略所要解决的问题。
  写策略是区分不同 Cache 设计方案的一个重要标志。写策略主要有两种:

1. 写直达法

  写直达法也称为存直达法。它是指在执行“写”操作时,不仅把信息写入 Cache 中相应的块,而且也写入下一级存储器中相应的块。

2. 写回法

  写回法也称为拷回法。它只把信息写入 Cache 中相应的块。该块只有在被替换时,才被写回主存。

  为了减少在替换时块的写回,常采用污染位标志。即为 Cache 中的每一块设置一个“污染位”(设在与该块相应的目录表项中),用于指出该块是“脏”的(被修改过)还是“干净”的(没被修改过)。替换时,若被替换的块是“干净”的,则不必写回下一级存储器,因为这时下一级存储器中相应块的内容与 Cache 中的一致。

再加一点自己对cache命中的理解:CPU要执行指令可在CACHE中查询到即为CACHE命中。

写回法和写直达法各有特色。两者相比,写回法的优点是速度快,“写”操作能以 Cache 存储器的速度进行。而且对于同一单元的多个写最后只需一次写回下一级存储器,有些“写”只到达 Cache ,不到达主存,因而所使用的存储器频带较低。这使得写回法对于多处理机很有吸引力。写直达法的优点是易于实现,而且下一级存储器中的数据总是最新的。后一个优点对于 I/O 和多处理机来说是重要的。I/O 和多处理机经常难以在这两种方法之间选择:它们既想要用写回法来减少访存的次数,又想要用写直达法来保持 Cache 与下一级存储器的一致性。
  采用写直达法时,若在进行“写”操作的过程中 CPU 必须等待,直到“写”操作结束,则称 CPU 写等待。减少写等待的一种常用的优化技术是采用写缓冲器。 CPU 一旦把数据写入该缓冲器,就可以继续执行,从而使下一级存储器的更新和 CPU 的执行重叠起来。不过,在后面很快就会看到,即使有写缓冲器,也可能发生写等待。
  由于“写”访问并不需要用到所访问单元中原有的数据。所以,当发生写失效时,是否调入相应的块,有两种选择:

  (1) 按写分配法:写失效时,先把所写单元所在的块调入 Cache,然后再进行写入。这与读失效类似。这种方法也称为写时取方法。
  (2) 不按写分配法:写失效时,直接写入下一级存储器而不将相应的块调入 Cache。这种方法也称为绕写法

  虽然上述两种方法都可应用于写直达法和写回法,写回法 Cache 一般采用按写分配法(这样,以后对那个块的“写”就能被 Cache 捕获)。而写直达法一般采用不按写分配法(因为以后对那个块的“写”仍然还要到达下一级存储器)。

另外cache的这几点还要注意: 缓存遗漏(缺失)假如CPU在缓存中找不到它所需的指令,就发生通常称为缓存遗漏cache miss)的现象。发生缓存遗漏的时候,CPU就会转到二级缓存中(可惜44b0没二级缓存)查找所需的指令。再者44B0只在cache化区域缺失时,即命中率降低的时候通过LRU算法更新cache内容。在非cache化区域,必定会造成CACHE缺失,但此时cache是不更新的(可用NCACHBE0,NCACHBE1设置非cache化域)。

多个Cache块形成一个Bank,每个内存块的数据只能放在某一指定Bank中的任意块中~

给出一个地址时,先去找所对应的Cache bank,找到之后再在Bank中的各个Cache块中寻找,如找到则命中,未找到即未命中~

每块Cache块只与固定的内存块“们”有关系,即每个内存块的内容只有可能放在某一固定的Cache块中。

当给出地址时,先求出这块内存块与哪块Cache对应,然后看此Cache的t位标志位和地址中的t位,是否吻合,如果是,则这块Cache中就是想要的数据,否则未命中(not hit)

 

全相连映像(All-associative)

每块Cache可以放各个块的数据,多对多关系,即c:b~