CPU Cache

CPU cache 的工作方式
在CPU需要访问内存时,先访问cache并搜索是否有需要的数据,如果有,则从cache里直接传递数据给处理器,如果没有,再从内存里读取资料。Cache与主存之间移动数据时采用block的方式传输。
CPU是搜索整个cache以找到所需的资料,所以单个cache不宜过大,典型的容量在16KB-64KB之间。为了提升cache的效率,CPU经常采用的方法是多重cache设计,例如Intel CPU的L1 cache就分为data cache和instruction cache,两个cache可独立并行访问。

Cache的写策略
做过BIOS的人都知道MTRR,BIOS工程师需要在MTRR里要填写WB, WT,UC等以完成内存的设定。这些设定涉及到了Cache的写策略,在这里介绍WT和WB两种。WT就是write-through, 每次处理更新数时,新的或修改的数值同时写入cache单元和相应的主存单元。这样做的优点是能保证主存中的版本总是与cache中的版本保持一致,缺点是须耗费时间在每一个写操作时访问主存。WB即write-back,新的或被修改的数值首先写入cache单元,只有当需要从cache中去掉该数值时,才会将它写入主存的单元上。这样做的好处是节省了耗费在访问主存上的时间,但会产生一段时期让主存保存着无效的数值。

Cache hit & Cache Miss
cache hit即缓存命中,访问存储器时会检查cache,如果在cache里发现所需内容,则处理机从cache接收数据,称为cache hit。cache miss即缓存失靶,如果cache里没有发现所需内容,处理机则访问主存,称为cache miss。
当cache miss发生时也要决定一个写策略,即使用write-allocate还是write no-allocate。Write-allocate policy
先把数从主存放到cache,然后再把新的或修改的数写入cache,可用WT或WB,一般WB使用此策略。Write no-allocate policy
只是把新的或修改的数写入主存,而不放入cache,一般WT使用此策略。

提升cache使用效率的思考
由于cache与CPU之间的传输速度是内存的几十倍(CFL L1 cache的读取速度是内存的40倍以上),延迟更是在1ns以内,我们要尽可能的把要访问的数据放入cache中,这样才可以提升系统性能,所以必须要提升cache的利用率。
抛开软件部分不谈,就CPU自身来说,到底该把哪些数据放入cache中才能提升利用率?由于计算机倾向于重复地访问相同内存局部区域,当一道程序在计算机上运行时,多数的内存访问在一段时间间隔内仅仅指向少数存储位置,所以我们要从空间和时间两个方面进行考虑,就是空间局部性和时间局部性。Temporal locality时间局部性, 在程序访问一个存储位置时,有很大的可能程序不久以后再次访问同一存储位置。这种情况的存在是因为程序的构造常常用循环(简单和嵌套循环)和过程(被重复调用),要用大量的时间在迭代或递归上。 Spatial locality 空间局部性, 由于程序倾向于访问离最近访问的位置较近的存储器位置, 可能性多余较远的位置。这种情况的存在是因为数据通常是以数组或记录的形式成堆地存放在连续的位置中。
除此以外,访问最为活跃的内存block在cache中形成一个局部性窗口,称为工作集窗口(working set window),它作为一个时间函数而变化。应当设计cache的容量能容纳这些工作集,并设计cache的安置和替换策略,使这些工作集的变化能在时间上保持平滑和稳定。

Cache地址映射的设计
Cache按地址映射的不同大体上可以分成三种,直接映射cache,全相联cache和组相联cache。
直接映射(direct-mapped) cache
主存空间被分成block, cache空间被分为frame,一个block与一个frame大小相同,产生主存block与cache frame之间的直接映射
使用直接映射,每个主存block仅映射到一个特定的cache frame。

CPU Cache_第1张图片
全相联(fully-associative) cache
一个主存block可以通过一个全相联算法映射到任何一个cache frame上。当内存block送入cache时,block的标识值也送入,存放在cache frame的标识字段,当访问内存时,从处理器收到的地址的标识值与每一个cache frame的标识值比较。
Cache中所有标识都必须搜索,这种搜索称为associative search,必须使用具有复杂线路的associative memory才能完成并行执行
CPU Cache_第2张图片
组相联cache
结合直接映射和全相联映射的优点。将cache分为v个组(set),每一组由n个frame组成,称为n路组相联cache (n-way set-associative) cache。主存block可被映射到cache一个特定组的任一frame中。与直接映射相比,可提供较多的选择来放置block,与全相联缓存相比,搜索的范围缩小。
CPU Cache_第3张图片
Cache替换算法(Replacement Algorithm)
在cache miss时,访问到的block需要送入cache,必须选择一个现存的cache frame, 如果frame已经full,则它的内容需要被新的内容替换,哪个cache frame应被替换可以用替换算法(replacement algorithm)来决定。
直接映射cache中不需使用替换算法,因为每个主存block必须映射到一个特定的cache frame。
对于全相联或组相联cache, cache控制器必须使用替换算法,从主存接收block,在cache中选择一个已经存在的frame, 用新的block 代替。
替换算法的普遍规则是,最有可能将要访问的cache frame应当在cache里留长一段时间,最少可能将要访问的block则应先被替换掉。经常用的替换算法有四种,LRU, FIFO, LFU和Random。
LRU(least recently used), 基于程序的存储器访问局部性原理–最近被访问的cache frame有很高的几率将很快地再次被访问。LRU算法选择一个最长时间没有被访问过的frame,可用一个计数器来服务于这个目的。
出现缓存命中时,组内所有frame,如果计数器值小于被访问frame的计数器值,则值加1,被访问frame计数器值清0。
出现失靶时,如果组内未满,得到新block的frame从0开始计数,其余框架计数值加1,如果组内已满,则具有最高计数值的框架被新的block替换,计数值从0开始,其余框架的计数值加1。
FIFO-先进先出, 从顶部到底部使用cache frame, 当最后一个frame已填满,则新来一个内存block时,最早加载的cache frame被选择替换。
LFU, 选择至今获得最少命中的frame- 有较小命中数的cache frame将来被命中的机会可能也最低,每一个cache frame带一个计数器跟踪命中次数。
Random 随机,随机地选择一个cache frame用新的block替换。

你可能感兴趣的:(硬件,cache,CPU)