本文主要是介绍一 程序访问的局部性-cache高速缓存-cache和主存间映射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.程序访问局部性
计算机存储层次结构
为提高性能/价格,将各存储器组成一个金字塔式的层次结构,取长补短协调工作
寄存器--->cache--->主存储器--->外存(disk,flash menory)
工作过程
•CPU运行时,需要的操作数大部分来自寄存器
•需从(向)存储器中取(存) 数时,先访问cache;若在,取自cache
•若不在cache,则访问RAM;若在,则取自RAM
•若不在RAM,则访问磁盘,操作数从磁盘中读出-->RAM--->cache
CPU-------(字传送)--->cache----(块传送)---->主存
离处理器较近的数据是较远的那些层次的子集,最底层存放着所有数据。离处理器越远的存储器访问时间越长数据总是在相邻两层之间复制传送
• Cache:更靠近CPU
Smaller, faster, and uses more expensive technology
• 主存: 更远离CPU
Bigger, slower, and uses less expensive technology
块(Block)是一个定长块,是两层存储器之间存储信息的最小单元。Cache是主存一部分的副本
为什么存储层次化结构是有效的? “程序访问局部性”特点!
什么是程序访问局部性?
分析大量典型程序的运行情况,结果表明:在较短时间间隔内,程序产生的地址/所访问数据往往集中在存储器的一个很小范围内
为什么会具有局部性?
指令:按序存放,地址连续。如循环程序段等重复执行
数据:连续存放。如数组元素重复、按序访问
程序访问局部性分为
时间局部性(Temporal Locality) :刚被访问过的存储单元很可能不久又被访问
让最近被访问过的信息保留在靠近CPU的存储器中
空间局部性 (Spatial Locality) :刚被访问过的存储单元的邻近单元很可能不久被访问
将刚被访问过的存储单元的邻近单元调到靠近CPU的存储器中
2.cache高速缓存
在CPU和主存之间设置一个快速、小容量的存储器,总是存放最活跃(即,被频繁访问)的程序块和数据
存储器是一个塔式层次结构
•数据只有在第i+1层存在,才能在第i层被访问到
•处理器的访存时间主要由层次1决定,而整个存储器的容量却和层次n一样大
思考1:实现Cache机制需解决哪些问题?
• 如何分块?
• 主存块和Cache之间如何映射?
• Cache已满时,怎么办?
• 写数据时,怎样保证Cache和MM一致性?
• 给出的主存地址怎么样转换为Cache地址?
思考2:Cache对程序员(编译器)是否透明?
• 透明的。程序员(编译器)在编写/生成低级语言程序时,无需了解Cache是否存在或如何设置
• 了解Cache有助编写出高效程序!
cache结构
Cache是小容量、高速缓冲存储器,由SRAM组成
• Cache直接制作在CPU芯片内,速度几乎与CPU一样快
• 一般将Cache和主存的存储空间都划分为若干大小相同的
块(主存中称为:块Block、Cache中称为:行line)
cache原理
程序运行时,CPU使用的一部分数据/指令会预先成批拷贝到Cache中,Cache的内容是主存储器中部分内容的映象(副本)
当CPU需从主存读(写)数据或指令时,先查看Cache
•若有,则直接从Cache中取,不用访问主存
•若没有,则直接访问主存
系统加电启动后,Cache内无有效信息,如何标识?
信息从主存复制到Cache时,Cache中的有效信息,如何标识?
解决方法
• 每个TAG域增加1位 ⎯ 有效位V(Valid Bit)
• 开机或复位时, All V=0
• 命中的Cache行,V=1
• Flush Cache行,V=0
• 新装入Cache行,V=1
命中(Hit):要访问的信息在Cache中
• Hit Rate(命中率 p ): 在Cache中的概率
• Hit Time (命中时间 Tc) :访问Cache所需时间,包括:判断时间 + Cache访问
失效(Miss):要访问的信息不在Cache中
• Miss Rate (失靶率/失效率 1-p) = 1 - (Hit Rate)
• Miss Penalty (失效损失 Tm):从主存将一块信息替换到Cache所需时间,包括
访问主存块,向上逐层传输块直至将数据块放入发生缺失的那一层所需时间。
平均访问时间 = p× Tc+ (1-p) ×(Tm+Tc)=Tc+ (1-p) ×Tm 提高平均访问速度,必须提高命中率
3.cache和主存的映射
Cache映射解决什么问题?
• 将要访问的局部主存数据取到Cache中,应该放到Cache的何处?
• Cache行比主存块少,多个主存块会映射到同一个Cache行中,如何建立Cache地址与主存地址的对应关系?
如何进行映射?
• 把主存划分成大小相等的主存块(Block)
• Cache中存放一个主存块的对应单位称为行(line) 或槽(Slot)或项(Entry)或块(Block)
• 主存块和Cache行可按三种方式进行映射:直接、全相联、组相联
直接映射
把主存的每一块映射到一个固定的Cache行中。即每个主存地址对应于高速缓存中唯一的地址,也称模映射
映射关系为:Cache行号 =主存块号 mod Cache行数
如果将主存第0(00000)块与第16(10000)块同时复制到这个Cache中,会有什么问题?
由于它们都映射到Cache第0行,即使Cache中其它行空闲,也有一个主存块不能写入Cache,这样就会产生频繁的 Cache替换,称之为Cache抖动
特点
• 易实现,命中时间短
• 淘汰 / 替换策略简单
• 不灵活,Cache存储空间得不到充分利用,命中率低
全相联映射
主存块可装到Cache任一行/槽中,称为全相联映射
组相联映射
将Cache所有行分组,把主存块映射到Cache固定组的任一行中。即:组间模映射、组内全映射
特点
•结合直接映射和全相联映射的优点。当Cache的组数为1时,则为全相联映射;当每组只有一行时,则为直接映射
三种映射方式
直接映射:唯一映射(只有一个可能的位置)
全相联映射:任意映射(每个位置都可能)
N-路组相联映射:N-路映射(有N个可能的位置)
什么是关联度?
主存块映射到Cache时,可能存放的位置个数
三种映射方式的关联度
主存块映射到Cache时,可能存放的位置个数
关联度最低?直接映射(关联度为1)
关联度最高?全相联映射(为Cache行数)
关联度居中?N-路组相联映射(关联度为N)
关联度和misss rate什么关系?
直观结论 ( Cache大小和块大小一定的情况下)
提高关联度通常能够降低缺失率(miss rate);
提高关联度通常会增加命中时间
哪些因素影响了Cache的失效率 ?
Miss Rate和Cache大小、Block大小的关系?
Cache性能由Miss Rate确定,而Miss Rate与Cache大小、Block大小、映射方式、Cache级数等有关
Cache大小:Cache越大,Miss Rate越低,但成本越高!
Block大小:
• Block越大,Miss Rate越低
• Block的大小增加到一定程度时,Miss Rate反而会随之增加
单纯增加Block大小带来一个更严重的问题是缺失损失增大
当Block较大时,Block较大时,缺失损失的上升超过了缺失率降低带来的收益 ,故Cache性能也相应降低
Cache失效类型:
强制失效(Compulsory misses)
• 首次访问某数据块时,必然引起的Cache失效
• 增加Block大小,有利于减少此类不命中
容量失效(Capacity misses)
• Cache不能存放程序运行所需的所有块,替换后再次被使用所引起的Cache失效
• 增加Cache大小,有利于减少此类不命中
冲突失效(Conflict misses)
• 映射到同一组的数据块个数超过组内可容纳的块时,竞争所引起的Cache失效
• 全相联没有此类失效,但价格贵且访问速度慢
容量失效和冲突失效可能引起Cache抖动
•某些块在主存和Cache之间频繁传送
•增加容量和相联性,有助于缓解这种现象
这篇关于一 程序访问的局部性-cache高速缓存-cache和主存间映射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!