910 likes | 1.09k Views
第 5 章 存储层次 授课教师:车喜龙 chexilong@jlu.edu.cn. 5.1 存储器的层次结构 5.2 Cache 基本知识 5.3 Cache 性能优化 5.4 主存 5.5 虚拟存储器. 5.1 存储器的层次结构. 5.1.1 从单级存储器到多级存储器 从用户的角度来看,存储器的 三个主要指标: 容量、速度和价格(指每位价格) 人们对这三个指标的要求:容量大、速度快、价格低 三个要求的相互关系 速度越快,每位价格就越高; 容量越大,每位价格就越低,但速度越慢。 存储器系统的设计矛盾 高性能速度要求:容量小,价格高
E N D
第5章 存储层次 授课教师:车喜龙 chexilong@jlu.edu.cn
5.1 存储器的层次结构 5.2 Cache基本知识 5.3 Cache性能优化 5.4 主存 5.5 虚拟存储器
5.1 存储器的层次结构 5.1.1 从单级存储器到多级存储器 • 从用户的角度来看,存储器的三个主要指标: 容量、速度和价格(指每位价格) • 人们对这三个指标的要求:容量大、速度快、价格低 • 三个要求的相互关系 • 速度越快,每位价格就越高; • 容量越大,每位价格就越低,但速度越慢。 • 存储器系统的设计矛盾 • 高性能速度要求:容量小,价格高 • 用户性价比要求:容量大,价格低
5.1 存储器的层次结构 5. 解决方法: 采用多种存储器技术,构成所谓的存储层次,使得从CPU看来,整个存储系统速度接近于第一层,而容量接近于最后一层。
5.1 存储器的层次结构 5.1.2 存储层次的性能参数 • 平均每位价格 C • C= 总价格/总容量 • 命中率与失效率 H&F (Hit Rate, Fault Rate) • H=访问命中次数/对存储系统的总访问次数 • F=访问失效次数/对存储系统的总访问次数 • H + F = 1 • 平均访存时间 T • T=命中率 x 命中时间 + 失效率 x 失效时间 • T=命中时间 + 失效率 x 失效开销 • 失效时间= 命中时间 + 失效开销
5.1 存储器的层次结构 • 存储层次的性能计算例子 • 假设某计算机系统包含两级存储层次M1和M2 • M1的参数:价格C1,访问次数N1,访问时间T1,容量S1 • M2的参数:价格C2,访问次数N2,访问时间T2(包含M2的操作时间和M2向M1传输的时间),容量S2 • 则如何计算整个存储层次的C,H,F, T ? 解: • C = (C1 x S1 + C2 x S2) / (S1 + S2) • F2=H1=N1/ (N1+N2) F1=H2=N2/ (N1+N2) H=H1+H2=1 F=1-H =0 实际只看重 F1和H1 • T = H1 x T1 + (1-H1) x (T1+T2) • 解毕.
5.1 存储器的层次结构 5.1.3 “Cache-主存-辅存”存储层次
5.1 存储器的层次结构 “Cache-主存”与“主存-辅存”层次的区别 存储层次 “主存-辅存”层次 “Cache -主存”层次 比较项目 为了弥补主存容量的不足 目 的 为了弥补主存速度的不足 主要由专用硬件实现 主要由软件实现 存储管理实现 访问速度的比值(第一级和第二级) 几百比一 几比一 几十个字节 几百到几千个字节 典型的块(页)大小 CPU对第二级的访问方式 可直接访问 均通过第一级 不切换 切换到其他进程 失效时CPU是否切换
5.1 存储器的层次结构 数据传递,空间分割与地址计算 • 数据传递 • CPU与Cache之间数据传递的单位:字节 如1B • Cache与主存之间数据传递的单位:块 如4B • 主存与辅存之间数据传递的单位:段或页 如4KB • 整个存储层次以内存为基础进行分割 • 内存空间分为M个页,每个页分为N个块,每个块内有P个字节。 • 内存空间中共有MxN块,MxNxP个字节 • Cache空间分为n个块,cache块大小=内存块大小,n<MxN • 辅存空间分为K个页,辅存页大小=内存页大小,M<K • 主存地址按位划分为3个部分: • {标识Tag,索引Index,偏移Offset} 例{10,01,111} 第9块第7B • Tag和Index的位数随系统结构不同而不同,两个字段拼起来得到的数值,即为该地址所属的内存块地址。 • Offset表示待访问的字节是该块中的第几个字节。
5.1 存储器的层次结构 5.1.4 存储层次研究的四个问题 • 映像规则 • 当把一个数据集合(块或页)从下一层存储器调入上一层存储器时(更靠近CPU) ,该集合可以放在哪些位置上 • 查找算法 • 当所要访问的数据集合在某一层存储器中时,如何找到该块 • 替换算法 • 当把一个数据集合(块或页)从下一层存储器调入上一层存储器时(更靠近CPU),根据映像规则需要放在特定位置上,但该位置已经被使用,则应该替换掉哪个位置 • 写策略 • 当把一个更新的数据集合写入某一层存储器中时,是否将该更新传递到各个下层存储器中(更远离CPU)
5.2 Cache的基本知识 Cache特征 • 速度快:可看做是CPU的一部分,访问开销为几个周期 • 容量小:可缓存n个块,n远小于内存总块数MxN(上百vs上万) • 原理:CPU发出访存请求,如果cache中恰好缓存了,则不必访问内存,直接从cache获得数据。 5.2.1映象规则 • 全相联映象 • 直接映象 • 组相联映象
5.2 Cache的基本知识 • 全相联映象 • 全相联:主存中的任一块可以被放置到Cache中的任意一个位置 • 举例:阅览室位置 ── 每人可以随便坐任意椅子 • 特点:空间利用率最高,冲突概率最低,实现最复杂。 • 主存的第i块 映象到 Cache的第j块,j=1..n • j=任意x,x属于{1,2,…,n} • 内存地址的位分布{标识Tag,索引Index,偏移Offset} • Index共0位, 主存块地址完全由Tag部分构成
5.2 Cache的基本知识 主存i Cache j=任意x,x属于{1,2,…,n}
5.2 Cache的基本知识 • 直接映象 • 直接映象:主存中的每一块只能被放置到Cache中唯一的一个位置,每个cache位置被循环分配给内存块 • 对比:阅览室位置 ── 每人只能坐固定椅子 • 特点:空间利用率最低,冲突概率最高,实现最简单。 • 主存的第i块 映象到 Cache的第j块,j=1..n • j=i mod n • 内存地址的位分布{标识Tag,索引Index,偏移Offset} • 假设cache中一共有2m个块,即n=2m • Index共m位,主存块地址由Tag和Index两部分构成
5.2 Cache的基本知识 主存i Cache j= i mod n 本例中, N=8=23, 则m=3,Index3位 主存块地址 i=Tag+Index 随主存块地址不断增加, 其低3位呈现0-7的循环, 该块在cache中映像位置 也正好会呈现0-7的循环。 因此可以用块地址的低3位来判断对应的cache位置, 即Index功能。
5.2 Cache的基本知识 • 组相联映象 • 组相联:主存中的每一块可以被放置到Cache中唯一的一个组中的任何一个位置。每个组被循环分配给内存块 • 对比:阅览室位置 ── 一个桌子对应多把椅子。每人只能坐固定桌子,但可以坐在这个桌子的任意椅子 • 特点:是直接映象和全相联的性能折中 • 全相联 空间利用率最高,冲突概率最低,实现最复杂。 • 直接相联 空间利用率最低,冲突概率最高,实现最简单。 • 主存的第i块 映象到 Cache的第j块,j=1..n • j=任意x,x属于cache的第k分组,k=i mod G (cache组数) • 内存地址的位分布{标识Tag,索引Index,偏移Offset} • 假设cache中一共有2m个块,即n=2m • 假设cache中一共有2p个组,即G=2p p<m,G<n • Index共p位,主存块地址由Tag和Index两部分构成
5.2 Cache的基本知识 主存i Cache j= 任意x,x属于第k组。 k=i mod G 本例中, G=4=22, 则p=2,Index2位 主存块地址 i=Tag+Index 随主存块地址不断增加, 其低2位呈现0-3的循环, 该块在cache中映像组号 也正好会呈现0-3的循环。 因此可以用块地址的低2位来判断对应的cache组号, 即Index功能。
5.2 Cache的基本知识 • t路组相联 • 每组中有 t 个块 t=n/G 称为相联度。 • 相联度越高,Cache空间的利用率就越高,块冲突概率就越低,失效率也就越低。 • 大多数计算机的Cache: t ≤4
5.2 Cache的基本知识 5.2.2 查找算法 • Cache的结构: • 每个cache块对应4项信息,分布在2张硬件表格中 • 2张表条目相等,一一对应 • Data缓存的数据,Tag数据地址的Tag字段 • EF有效位Effective Flag,DF修改位Dirty Flag
5.2 Cache的基本知识 2. Cache的查找 • 查找原理 • 当CPU访问Cache时,如何确定Cache中是否已经缓存了所要访问的块?若已缓存,如何确定其在cache中的位置?如何获取数据? • 用Cache Lookup Table(目录表)匹配主存地址 • 用Cache Data Table(数据表)获取对应的数据 • 查找方法 • 和谁比?候选位置的确定 • 如何比?匹配条件的判断
5.2 Cache的基本知识 候选位置的确定 全相联:所有cache块均为候选位置 直接映像:只有一个cache块为候选位置,用index确定 组相联:只有一组cache块为候选位置,用index确定
5.2 Cache的基本知识 匹配条件的判断 • 全相联 • For any X in Cache, (X.Tag==A.Tag) & (X.EF==1) • 直接映像 • 用indeX计算唯一cache块X, (X.Tag==A.Tag) & (X.EF==1) • 组相联 • 用indeX计算唯一cache组k,for any X in 组k, (X.Tag==A.Tag) & (X.EF==1)
5.2 Cache的基本知识 3. Cache的查找过程优化 • 基于主候选位置(MRU块)的顺序查找 • 局部性原理,刚刚用过的cache块最可能被复用,即为MRU(Most Recently Used) • 多个候选位置的循环查找,从MRU开始,优于从顺次第一个开始 • 并行查找 • 相联存储器 • 单体多字存储器+比较器
5.2 Cache的基本知识 5.2.3 替换算法 • 替换原理:当要从内存新调入一块,而Cache中对应的一个或多个候选位置均已被占满时,替换哪一块? • 直接映象Cache的替换 • 很简单,因为只有一个块,别无选择。 • 组相联和全相联Cache的替换 • 有多个块供选择,主要的替换算法有三种: • 随机法或循环法,实现简单,没有利用局部性 • 先进先出法(FIFO),部分利用局部性 • 最近最少使用法(Least Recently Used, LRU),充分利用局部性
5.2 Cache的基本知识 对于大容量cache,LRU和随机法的失效率几乎没有差别。
5.2 Cache的基本知识 5.2.4 写策略 • 访存操作 • 统计结果表明,对于一组给定的程序: • load指令:26%,store指令:9% • “写”在所有访存操作中所占的比例: 9%/(100%+26%+9%)≈7% • “写”在访问Cache操作中所占的比例: 9%/(26%+9%)≈25% 举例:100条指令构成的序列,其中9条st,26条ld 运行时,取指令访存100次,执行指令访存9+26次
5.2 Cache的基本知识 • 读操作 • 读操作占的比例大,优化能够明显提高性能 • 优化方法:从目录表读Tag与从数据表读Data并行执行,命中与读同时进行 • 无论从内存读还是从cache读,读操作不改变对应存储单元的值 • 写操作 • 虽然写操作占的比例小,但高性能cache也要重视写操作的性能 • 不能采用读操作的优化方法,命中与写只能串行,写比读开销大 • 写操作要改变对应存储单元的值,而且会导致内存和cache内容的不一致,即产生dirty cache块 • 如何保证内存和cache内容的一致性,是写策略解决的问题
5.2 Cache的基本知识 • 两种写策略 • 写直达法 • 执行“写”操作时,不仅写入Cache,而且也写入存储器 • 易于实现,一致性好,写操作返回较慢 • 优化方法:写入cache后,接着写入写缓冲(WB,Write Buffer,相当于后行写数站),立刻返回,由写缓冲慢慢将数据写入内存。 • 替换写回法 • 执行“写”操作时,只写入Cache,并将对应DF位置1。 • 当任意一个Cache块将要被替换时,检查其DF位 • 如果DF位为1,则先将该Cache块写回存储器,再进行替换动作; • 如果DF位为0,则不用写回存储器,直接进行替换动作 • 对存储器带宽要求较低,写操作返回较快,写内存的开销转移给了cache块替换时写内存的开销
5.2 Cache的基本知识 • Cache写失效的处理方法 • 当CPU发出一条内存写的指令,且该地址没有命中cache,则发生了cache写失效。 • 经过cache法(按写分配):发生写失效时,先把地址对应的内存块调入Cache,再进行写操作。 • 绕过cache法(不按写分配):发生写失效时,不把地址对应的内存块调入Cache,而是绕过cache直接将数据写入存储器 • 写策略与写失效处理的搭配 • 写直达法+经过cache 不常用 • 写直达法+绕过cache 常用 • 替换写回法+经过cache 常用 • 替换写回法+绕过cache 不常用
5.2 Cache的基本知识 5.2.5 一个Cache结构实例 DEC的Alpha AXP21064中的内部数据Cache • 容量:8KB = 块大小32B x 块数256 • CPU字宽:每个字64bit,因此一个Cache块含4个字(32*8/64) • 直接映象+写直达+绕过cache+写缓冲器(4个块,块大小32B) • 主存地址34bit={Tag-21bit,Index-8bit,Offset-5bit} • Index位数如何计算?2Index=Cache块总组数=Cache容量/组内块数x每块大小 • Offset位数如何计算?每个块内32B,内存按字节寻址,所以字节偏移Offset为5位CPU每次取一个字,而不是一个字节,第一个字偏移0,第二个字偏移为8,第3个字偏移为16,第4个字偏移24,转成二进制后offset低3位均为000,因此Offset高2位为字偏移
5.2 Cache的基本知识 数据 Cache 工作 过程 Cache失效怎么办?
5.2 Cache的基本知识 指令Cache • 以上结构中数据字段存放的是指令字 • 只有读操作,没有写操作 数据Cache • 以上结构中数据字段存放的是数据字 • 既有读操作,又有写操作 混合Cache • 指令cache与数据cache使用同一套硬件 • 对于ld/st指令,取指令和指令执行结构冲突 分离Cache • 指令cache与数据cache各自使用一套硬件 • 针对各自的特点进行优化,并设置不同的参数 • 如容量,相联度等
5.2 Cache的基本知识 失 效 率 的 比 较 容 量 指令 Cache 数据 Cache 混合 Cache 1 KB 13.34% 3.06% 24.61% 9.78% 2.26% 20.57% 2 KB 4 KB 1.78% 15.94% 7.24% 1.10% 4.57% 8 KB 10.19% 0.64% 6.47% 2.87% 16 KB 32 KB 0.39% 1.99% 4.82% 64 KB 0.15% 3.77% 1.36% 128 KB 2.88% 0.95% 0.02%
5.2 Cache的基本知识 分离Cache平均失效率如何计算? • 指令Cache的访问百分比×指令Cache的失效率+数据Cache的访问百分比×数据Cache的失效率 容 量 指令 Cache 数据 Cache 混合 Cache 1 KB 13.34% 3.06% 24.61% 2.26% 20.57% 2 KB 9.78% 举例 分离Cache性能 v.s.混合Cache性能 • 2KB混合Cache v.s. 1KB数据Cache+ 1KB指令Cache • 3.06%*指令Cache的访问百分比+24.61%*数据Cache的访问百分比v.s. 9.78%
5.2 Cache的基本知识 5.2.6 Cache的性能分析 • 失效率 • 平均访存时间 • 存储系统性能的评价指标 • 该指标比失效率更有效 • 计算公式: 平均访存时间 = 命中时间+失效开销×失效率 = 命中时间× 命中率 + (命中时间+失效开销) × 失效率
5.2 Cache的基本知识 例5.1 假设: (1)一段程序运行时,75%的访存为取指令 (2)取指令的Cache命中时间为1个时钟周期 (3)访存指令的Cache命中时间为1个时钟周期 (4)Cache失效开销为50个时钟周期 (5)分离Cache,指令Cache和数据Cache容量均为16KB (6)混合cache,容量为32KB (7)采用写直达策略,且有一个写缓冲器,并且忽略写缓冲器引起的等待。 问:根据下表的失效率,哪种Cache的失效率更低?平均访存时间各是多少? 容 量 指令 Cache 数据 Cache 混合 Cache 0.64% 6.47% 2.87% 16 KB 32 KB 0.39% 1.99% 4.82%
5.2 Cache的基本知识 解:(1)分离Cache的总体失效率为: (75%×0.64%)+(25%×6.47%)=2.10% 32KB混合Cache的失效率只有1.99%,性能更好。 (2)平均访存时间= 指令访存百分比×(指令Cache命中时间+指令失效率×失效开销)+ 数据访存百分比×(数据Cache命中时间+数据失效率×失效开销) 所以,两种结构的平均访存时间分别为: T分离 = 75%×(1+0.64%×50)+25%×(1+6.47%×50)=2.05 T混合 = 75%×(1+1.99%×50)+25%×(1+1+1.99%×50)=2.24 因此,尽管分离Cache的实际失效率比混合Cache的高,但其平均访存时间反而较低。因为分离Cache提供了两个端口,消除了结构冲突。 解毕。
5.2 Cache的基本知识 • 程序执行时间 程序执行的CPU时间=程序执行的时钟周期数 × 时钟周期时间 (A) 程序执行的时钟周期数=CPU运算的周期数C1+CPU等待数据而停顿的周期数C2 (B) Cache算作CPU一部分,因此Cache命中时间归入C1,Cache失效时间归入C2 C1的计算方法:C1=IC×理想CPI (C) C2有两种计算方法: C2A=读的次数×读失效率×读失效开销+写的次数×写失效率×写失效开销 (D) C2B=总访存次数×失效率R×Cache失效开销 (E) R有2种计算方法: RA=每次访存的平均失效次数=总失效次数/总访存次数 (F)(结构相关) RB=每条指令的平均失效次数=总失效次数/总指令数 (G)(结构无关)
5.2 Cache的基本知识 例5.2假设Cache失效开销为50个时钟周期,当不考虑存储器停顿时,所有指令的执行时间都是2.0个时钟周期,访问Cache失效率为2%,平均每条指令访存1.33次。试分析Cache对性能的影响。 解:程序执行的CPU时间=程序执行的时钟周期数×时钟周期时间 =(C1+C2)×时钟周期时间 =(IC×CPI+总访存次数×失效率×Cache失效开销)×时钟周期时间 =[IC×CPI +IC ×(总访存次数/IC)×失效率×Cache失效开销]×时钟周期时间 =IC×[CPI +(总访存次数/IC)×失效率×Cache失效开销]×时钟周期时间 =IC×[CPI + 平均每条指令访存次数×失效率×Cache失效开销]×时钟周期时间 有cache,则上式=IC×[2+1.33×2%×50]×时钟周期时间=IC×3.33×时钟周期时间 无cache,则上式=IC×[2+1.33×100%×50]×时钟周期时间=IC×68.5×时钟周期时间 可以看出,Cache的存在,将平均CPI从68.5减少到3.33,程序加速了约20倍。 解毕。
5.2 Cache的基本知识 • Cache失效开销中的Amdahl定律 • 由前例可知,程序执行的CPU时间=程序执行的时钟周期数×时钟周期时间=IC×实际CPI×时钟周期时间实际CPI=理想CPI + 平均每条指令访存次数×失效率×Cache失效开销 • 理想CPI越低,Cache失效开销在实际CPI中所占的比例越大,即相对影响越大 • Cache失效开销时间=CPU等待数据而停顿的周期数C2×时钟周期时间 • 内存硬件一旦确定,Cache失效开销时间就确定了,因此C2和时钟周期时间形成反比关系,即时钟周期时间越短(时钟频率越高),C2中含有的时钟周期数越多。换句话说: • 时钟频率越高,Cache失效开销在实际CPI中所占的比例越大,即相对影响越大 因此,Cache对于低CPI、高时钟频率的CPU来说更加重要。 那么,是不是平均访存时间越短,CPU的执行时间就越短呢? 例子见下页
5.2 Cache的基本知识 例5.3比较直接映象Cache和2路组相联Cache对CPU的性能的影响。假设: (1)两种Cache容量均为64KB,块大小都是32字节,命中时间为1个时钟周期,失效开销都是70 ns。 (2)直接映象Cache的失效率为1.4%,2路组相联Cache的失效率为1.0%。 (3)理想Cache(命中率为100%)情况下的CPI为2.0,时钟周期为2ns,平均每条指令访存1.3次。 (4)在n-路组相联Cache中,必须增加一个n:1多路选择器,用于根据标识匹配结果从相应组的块中选择所需的数据。对于组相联Cache,由于多路选择器的存在而使CPU的时钟周期增加到原来的1.1倍。 2-路组相联Cache中的2:1多路选择器见下页图。 先求平均访存时间,然后再计算CPU性能。
5.2 Cache的基本知识 解: 先计算平均访存时间T=命中时间+失效率×失效开销 T1路=2.0+(0.014×70)= 2.98 ns T2路=2.0×1.1+(0.010×70)= 2.90 ns 再计算程序执行的CPU时间 =IC×[CPI +(总访存次数/IC)×失效率×Cache失效等待周期数]×时钟周期时间 =IC×[CPI×时钟周期时间 +(总访存次数/IC)×失效率×Cache失效等待周期数×时钟周期时间] =IC×[CPI×时钟周期时间 +(总访存次数/IC)×失效率×Cache失效开销时间] CPU时间1路 = IC×[2.0×2+(1.3×0.014×70)] = 5.27×IC CPU时间2路 = IC×[2.0×2×1.10+(1.3×0.010×70)] = 5.31×IC 2路组相联Cache平均访存时间较短,CPU的执行时间却较长。 Cache设计时,要以减少CPU的执行时间为最终目标。 解毕。
5.3 Cache性能优化 Cache性能优化的出发点: 平均访存时间=命中时间+失效率×失效开销 由上式可知,能够从三个方面改进Cache的性能: • 降低Cache失效率(重点介绍) • 减少Cache失效开销(略) • 减少Cache命中时间(略)
5.3 Cache性能优化 • Cache失效的分类 • 强制性失效(Compulsory miss) (冷启动失效/首次访问失效) • 当第一次访问一个块时,该块不在Cache中,需从下一级存储器中调入Cache。 • 容量失效(Capacity miss ) • 如果程序执行时所需的块不能全部调入Cache中,则当某些块被替换后,又重新被访问。如果单个cache块足够大,则不存在容量失效。 • 冲突失效(Conflict miss) (碰撞失效,干扰失效) • 在组相联或直接映象Cache中,若太多的块映象到同一组(块)中,则会出现该组中某个块被别的块替换(即使别的组或块有空闲位置),然后又重新被访问。
5.3 Cache性能优化 • 三种失效所占的比例
5.3 Cache性能优化 • 关于失效率的经验规则: • 相联度越高,冲突失效就越少;全相联降低主频 • 强制性失效和容量失效不受相联度的影响; • 强制性失效不受Cache容量的影响,但容量失效却随着容量的增加而减少; • 大小为N的直接映象Cache的失效率约等于大小为N/2的2路组相联Cache的失效率。
5.3 Cache性能优化 • 降低Cache失效率的典型方法 • 增加块大小(减少强制性失效) • 提高相联度(减少冲突失效) • 增加Cache总容量(减少容量失效) • Victim Cache(减少冲突失效) • 伪相联映像Cache • 硬件预取 • 编译器/程序 控制的预取 • 编译器/程序 优化 • 许多降低失效率的方法会增加命中时间或失效开销 平均访存时间=命中时间+失效率×失效开销