cache合并
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Cache 学习
5.1Cache的必要性
问题:在多层次存储器结构中,距离CPU越远,访问容量越大,访问速度越慢。
解决采用存储器层次结构,实现大容量、快速存储器。每一层比下一层有更小的存储空间、更快的读写速率,价格与最便宜的一层一致,层与层之间是子集关系。
桌面处理器:一次为单个用户运行一个程序,需要考虑存储器层次结构带来的延迟问题,阻止程序间数据混淆。
服务器:同时为成千上百个用户执行大量应用程序,导致更多的环境切换,因此服务器还需要存储带宽问题,兼顾防止一个用户访问其他用户的数据。
嵌入式:首先,用于实时处理,要考虑最坏情况时的性能,Cache能提高平均性能,但是会降低最坏情况的性能。其次,嵌入式关注功耗和平均寿命,需要减少硬件,与扩展硬件提高存储性能方法相悖。第三,嵌入式操作系统一般非常简单,可不考虑存储层次保护机制。最后,嵌入式处理器内存小,常常不需要磁盘存储。
5.2 Cache知识回顾
名词:Cache命中,Cache缺失,块,页、页缺失。
层次名称:寄存器,Cache,—(块)—内存,—(页)—磁盘
5.2.1 Cache性能回顾
CPU暂停工作、等待一次存储器访问的周期数成为存储器停顿周期数,其性能可以表示为:
CPU执行时间=(CPU时钟周期数+存储器停顿周期数)×缺失代价
假设CPU时钟周期包含了处理Cache命中和Cache缺失时CPU停止的时间,
存储器停顿周期数可以表示为:
存储器停顿周期数=缺失次数×缺失代价
=执行指令数×缺失次数/指令数×缺失代价
=执行指令数×存储器访问次数/指令数×缺失率×缺失代价一般缺失率可用硬件Cache仿真器来测量。通常情况下,一般采用每千条指令的缺失次数来计算。
5.2.2 Cache层次存储4个问题
Q1:一个块,会放在哪里?
直接映射:每个块在Cache中只能出现在唯一位置上,映射方法:
(块地址) mod (Cache中的块数)
全相联映射:一个块可以放到cache中任何一个地方。
组相联映射:一个块放到一个受限的组里。一个块首先映射到到一个组中,可以放到组中任何一个块中。组通常用为选择方式确定:
(块地址) mod ( cache中的组数)
如果一个组里有n块,这种映射方法称之为n路组向联。直接映射是一个简单的1路组相联。全相联是只有1组的m路组向联映射。
Q2:怎样找到cache中的块?
Cache地址分为块地址与偏移地址;块地址又分为标志字段与索引字段。偏移地址用来选择块中所需要的数据;索引字段用来选择组,通过标志字段来判断是否发生命中,无需判断块内偏移与索引字段。
增加相联度会增加组内的块数,组数减少导致索引段减少,标识字段增加,最后变成全相联,不存在索引字段。
Q3:没有命中,块怎样替换?
直接映射法:直接替换没用命中的检查的块。
全相联或组相联,需要多个块做出选择。大容量时3中方法区别不大,小容量时LRU最优:
随机替换(Random):利用伪随机数块号,尤其适用于硬件调试。
最近最少使用(LRU):记录块的访问次数,利用历史信息替换掉最长时间没有使用的cache块。
先进先出(FIFO)。
Q4:写操作时cache会发生什么?
一般来说,CPU需要等待读操作完成,不需要等待写操作完成,且块标志与数据同时读出,舍弃没有命中的信息可提高速率,嵌入式系统不允许无用工作。对写操作不能进行如此优化,因为只有标识为有效时,块才能被修改。2中基本的写策略:
写直达(write through):信息同时写入cache和更低一层的存储器的块中。易实现,写直达方法中读操作缺失发生时cache始终是干净的,因此不需要对低层存储器进行写操作,常与不按写分配(no-write allocate)配合。
写回法(write back):信息只写入cache。只有cache中块被替换,信息才会写回到主存中。写操作与cache速度一致,且一个块一次写入仅仅需要对下层存储器的一次写操作,因此需要较小的带宽,可用于多处理器的服务器系统。常与写分配(write allocate)配合。
写操作缺失时,通常策略如下:
写分配(write allocate)内存读到cache,执行命中前面写命中时的操作。与读缺失类似。
不按写分配(no-write allocate),仅修改低层存储器中的该块,不将该块写入cache中,直到程序要读一个块时,该块才被取到cache中。
Cache可以提供指令与数据,但存在瓶颈,例如同时执行一条载入指令与存储指令,单独的cache会产生资源冲突,产生停顿。最简单的方法是将cache划分为指令cache与数据cache。指令cache比数据cache有更低的缺失率,但分立的指令cache与数据cache缺失率之和比相同容量的cache更大。
5.3 Cache 性能
5.3.1 平均存储器访问时间
指令数可以用来评价CPU 的性能,缺失率可以评价存储器层次结构的性能,但也会产生误导,可用平均存储器访问时间来评定:
=+ 平均存储器访问时间命中时间缺失率缺失代价
虽然降低最小平均存储器访问时间是一个合理的目标,但是最终目标时降低CPU 执行时间,两者时有区别的。例如在2路组相联情况下,虽然缺失率与平局存储器访问时间较低,但进行组内多路选择时CPU 时钟周期也会增加,导致CPU 执行时间变长。
一般观点,把命中时钟周期数包含到CPU 执行时钟周期数种。Cache 的行为会对较低CPI 与较快时钟频率的CPU 产生双重影响:
1.CPI 较低时,cache 缺失时钟数会对CPU 时间产生较大影响。
2.计算CPI (cache 缺失情况)时,cache 缺失代价用缺失时花费的CPU 时
钟周期数来度量。因此,对于存储器层次结构相同的计算机,CPU 频率
越高,每次缺失就需要更多的时钟周期数,因此CPI 花费在存储器部分
的周期就较多。
5.3.2 缺失代价与乱序执行处理器
乱序执行(out-of-order execution ):CPU 允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理的技术。这样将根据各电路单元的状态和各指令能否提前执行的具体情况分析后,将能提前执行的指令立即发送给相应电路。
重新定义存储器停顿周期:
-=(全部缺失延迟重叠缺失延迟)指令数指令数存储器停顿周期数
缺失次数
一般确定延迟时间的方式有3种:从存储器指令进入指令窗口的时刻算起;或是从地址产生的时刻算起;或是从指令实际被送到存储器的时刻算起。只要使