计算机原理实验 Cache 存储器的层次结构 处理器 – 具体执行程序 – 运行速度1+GHz(~ 运行速度 (~1ns) ) (~ – 但是:指令和数据在何处? 但是:指令和数据在何处? 磁盘 – 容量巨大(可以认为无限) 容量巨大(可以认为无限) – 非常慢(~ 非常慢(~ (~10ms) ) 如何匹配二者的速度? 如何匹配二者的速度? 2 存储器的层次结构 内存( 内存(DRAM) ) – 容量有限 ? 内存:128MB~16GB,磁盘:10GB~1TB 内存: ~ ,磁盘: ~ – 包含磁盘数据的一个子集 包含磁盘数据的一个子集 – 比磁盘快很多(~ 比磁盘快很多(~ (~10ns) ) ? 还是比 还是比CPU慢很多 慢很多 – 解决方案:增加新的层次(Cache) 解决方案:增加新的层次( ) 3 存储器的层次结构 CPU 层次下降 速度下降 单位成本下降 安装容量上升 Level 1 Level 2 Level 3 ... Level n 安装容量 4 存储器的层次结构 越靠近CPU的层次,其特性必须 的层次, 越靠近 的层次 – 安装容量小(节约成本) 安装容量小(节约成本) – 速度更快(提高访问速度) 速度更快(提高访问速度) – 包含下一个层次的数据的一个子集 – 包含以上所有层次所存储的数据 最高的层次应与CPU速度相同 速度相同 最高的层次应与 最低的层次(通常是磁盘)包含所有的数据 最低的层次(通常是磁盘)包含所有的数据 所有 比磁盘更低的层次? 比磁盘更低的层次? – CDROM、磁带、Internet 、磁带、 5 存储器的层次结构例:图书馆 图书馆的藏书: 图书馆的藏书:数据 图书馆书库: 图书馆书库:磁盘 – 容量巨大,但取出一本书非常慢 容量巨大, 书桌:Cache 书桌: – 书桌上的书取用速度很快 – 但书桌空间狭小:只能放少数几本书 但书桌空间狭小: – 特点 ? 短时间内,只需要看少数几本 短时间内, ? 如果要看某本书的某一页,该书其它页也很 如果要看某本书的某一页, 有可能在最近要看 6 数据访问的局部特性 时间局部特性 – 现在访问的数据,在不久的将来可能再次使用 现在访问的数据,在不久的将来可能再次 再次使用 空间局部特性 – 此处的数据被访问,其附近的数据可能即将被访 此处的数据被访问,其附近的数据可能即将被 即将被访 问 通常是很接近实际情况的假设 Cache赖以发挥作用的条件 赖以发挥作用的条件 Cache算法设计的依据 算法设计的依据 7 Cache设计 内存:磁盘的 内存:磁盘的cache – 虚拟内存(VM:后面讲) 虚拟内存( :后面讲) CPU Cache:内存的 :内存的Cache – 定位:指定的内存单元映射到哪个 定位:指定的内存单元映射到哪个Cache地址? 地址? 地址 – 确认:某Cache地址中存储的数据是否是需要的? 确认: 地址中存储的数据是否是需要的? 地址中存储的数据是否是需要的 – 速度:如何快速得到数据? 速度:如何快速得到数据? – Cache设计的基本问题 设计的基本问题 ? 所有 所有Cache层次都需要考虑 层次都需要考虑 ? 不同的层次用不同的解决方案 8 直接映射Cache 内存地址 内存 4单元直接映射 单元直接映射cache 单元直接映射 0 1 2 3 指定内存单元映射到一个确 指定内存单元映射到一个确 一个 定的Cache单元 定的 单元 多个内存单元可以映射到同 多个内存单元可以映射到同 内存单元可以映射到 一个Cache单元 单元 – 是否为所须? 是否为所须? 0 1 2 3 4 5 6 7 8 9 A B C D E F 9 直接映射Cache 多个内存地址可以映射到同一Cache块:如何 块 多个内存地址可以映射到同一 知道Cache当前存储的是哪个? 当前存储的是哪个? 知道 当前存储的是哪个 如果Cache块大于 字节(空间局部特性)如 块大于1字节 如果 块大于 字节(空间局部特性) 何处理? 何处理? 解决方案:把地址分解为3个域 解决方案:把地址分解为 个域 ttttttttttttttttt iiiiiiiiii oooo tag 是否是 需要的块 index offset 选择Cache块 块内 选择 块 偏移 10 直接映射Cache 所有域作为无符号数使用 所有域作为无符号数使用 无符号 Index:需要的 :需要的Cache块 块 Offset:Cache块内字节偏移 : 块内字节偏移 Tag:标准当前在 :标准当前在Cache块中存储的数据是映 块中存储的数据是映 射到哪个内存地址 11 直接映射Cache例子 条件: 直接映射Cache,4字块,32位体 条件:16KB直接映射 直接映射 , 字 位体 系结构 首先确定3个域各自的位数 首先确定 个域各自的位数 Offset – 从Cache块内选择一个字节 块内选择一个字节 – 块大小: 块大小: 4 words = 16 bytes = 24 bytes – 需要 需要4bits来选择一个字节 来选择一个字节 – 叫做:Cache Line Size 叫做: 12 直接映射Cache例子 Index – 选择合适 选择合适Cache行(叫做:Cache Row) 行 叫做: ) – Cache大小:16 KB = 214 bytes 大小: 大小 – 块大小: 24 bytes (4 words) 块大小: – Cache行数 = Cache块数 每行快数(=1) 块数/每行快数 行数 块数 每行快数( ) = Cache大小 大小 行大小(=块大小) (=块大小 行大小(=块大小) = 2^14 2^4 = 210 行 – 需要 需要10bits 13 直接映射Cache例子 Tag – 地址中其余位都是 地址中其余位都是Tag – tag长度 长度 = 内存地址长度 - offset - index = 32 - 4 - 10 bits = 18 bits – Tag长度为 长度为18bits 长度为 14 直接映射Cache例子 地址 ... 内存 内容 ... a b c d ... e f g h ... i j k l ... 访问如下4地址 访问如下 地址 –0x00000014, 0x0000001C, 0x00000034, 0x00008014 00000010 00000014 00000018 0000001C ... 内存内容如右 00000030 00000034 00000038 0000003C ... –仅Cache/Memory层次 00008010 仅 层次 00008014 00008018 0000801C ... 15 直接映射Cache例子 把地址划分为域 – 0x00000014, 0x0000001C, 0x00000034, 0x00008014 000000000000000000 000000000000000000 000000000000000000 000000000000000010 Tag 0000000001 0000000001 0000000011 0000000001 Index 16 0100 1100 0100 0100 Offset 直接映射Cache例子 观察3类事件 观察 类事件 cache miss:Cache块无数据,从内存读入 块无数据, : 块无数据 cache hit:Cache块包含合适的数据,直接 块包含合适的数据, : 块包含合适的数据 从Cache中读出数据 中读出数据 cache miss, block replacement:错误的数 : 据在Cache块中,抛弃现有数据,并从内存中 块中, 据在 块中 抛弃现有数据, 读入合适的数据 Valid bit:标准 :标准Cache块是否有数据 块是否有数据 17 直接映射Cache例子 Valid Tag 0 1 2 3 4 5 6 7 ... ... 0x0-3 0x4-7 0x8-b 0xc-f 1022 1023 18 读0x00000014 000000000000000000 0000000001 0100 Offset Index Tag Valid 0x4-7 0x8-b 0xc-f 0x0-3 Index Tag 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 ... ... 1022 0 1023 0 19 从内存读入数据 000000000000000000 0000000001 0100 Tag Index Offset Valid 0x4-7 0x8-b 0xc-f 0x0-3 Index Tag 0 0 a b c d 1 1 0 2 0 3 0 4 0 5 0 6 0 7 0 ... ... 1022 0 1023 0 20 从Cache读数据 000000000000000000 0000000001 0100 Tag Index Offset Valid 0x4-7 0x8-b 0xc-f 0x0-3 Index Tag 0 0 a b c d 1 1 0 2 0 3 0 4 0 5 0 6 0 7 0 ... ... 1022 0 1023 0 21 读0x0000001C 000000000000000000 0000000001 1100 Tag Index Offset Valid 0x4-7 0x8-b 0xc-f 0x0-3 Index Tag 0 0 a b c d 1 1 0 2 0 3 0 4 0 5 0 6 0 7 0 ... ... 1022 0 1023 0 22 读0x00000034 000000000000000000 0000000011 0100 Tag Index Offset Valid 0x4-7 0x8-b 0xc-f 0x0-3 Index Tag 0 0 a b c d 1 1 0 2 0 0 e f g h 3 1 0 4 0 5 0 6 0 7 0 ... ... 1022 0 1023 0 23 读0x00008014 000000000000000010 0000000001 0100 Tag Index Offset Valid 0x4-7 0x8-b 0xc-f 0x0-3 Index Tag 0 0 2 i j k l a b c d 1 1 0 2 0 e f g h 3 1 0 4 0 5 0 6 0 7 0 ... ... 1022 0 1023 0 24 自己练习 事件: Hit, Miss, Miss w. replace 事件: 返回值: 返回值: a ,b, c, d, e, ..., k, l 读0x00000030 ? 000000000000000000 0000000011 0000 读0x0000001c ? 000000000000000000 0000000001 1100 Valid Index Tag 0 0 1 1 2 2 0 3 1 0 4 0 5 0 6 0 7 0 ... 0x0-3 i e 0x4-7 j f 0x8-b k g 0xc-f l h ... 25 Cache的性能 衡量Cache性能的指标 性能的指标 衡量 – 命中率(Hit Rate)、不命中率(Miss Rate) 命中率( )、不命中率 )、不命中率( ) – 命中访问速度(Hit Time) 命中访问速度( ) ? 通常设为1 通常设为 – 未命中开销(Miss Time) 未命中开销( ) – 未命中附加开销(Miss Penalty) 未命中附加开销( 附加开销 ) ? Miss Time - Hit Time 26 Cache的性能 需要一个总指标 – 平均访问时间(Average Access Time) 平均访问时间 访问时间( ) – Cache性能的硬指标:所有Cache设计必须为优 性能的硬指标:所有 设计必须为优 性能的硬指标 化此指标努力 Average Access Time = Hit Time + Miss Penalty × Miss Rate 不是Miss Time 27 Cache未命中的类型 加载新程序导致的未命中 – Cache还没有程序的任何信息 还没有程序的任何信息 – 会发生大量的未命中事件 – 很难避免,一般不考虑 很难避免, ? 对程序的影响也不大 ? 程序的大部分CPU开销在循环内部,不在程序开头 开销在循环内部, 程序的大部分 开销在循环内部 – “Warm Up”:把程序执行几次,让Cache获得程 :把程序执行几次, 获得程 序的信息 ? Cache性能讨论一般基于这种情况 性能讨论一般基于这种情况 28 Cache未命中的类型 冲突导致的未命中 – 由于 个内存地址映射到同一 由于2个内存地址映射到同一 个内存地址映射到同一Cache块,如果要同 块 时访问这2个内存单元 则导致冲突 个内存单元, 时访问这 个内存单元,则导致冲突 – 直接映射 直接映射Cache:很容易导致冲突 : – 如何减少冲突? 如何减少冲突? ? 调整 调整Cache的参数 的 ? Cache设计 设计 29 Cache的参数 容量 – Cache有多少可以存储数据的空间 有多少可以存储数据 有多少可以存储数据的空间 – 并不是越大越好 并不是越大越好 ? 成本问题:可承受价格和生产成本的平衡 成本问题: ? 技术问题:容量和速度的平衡 技术问题: ? ...... – 一般由于技术限制,在Cache设计初期就确定 一般由于技术限制, 设计初期就确定 – Cache设计一般指其它参数的调整 设计一般指其它参数的调整 设计 – 以下内容在 以下内容在Cache容量固定的条件下讨论 容量固定的条件下讨论 30 Cache的参数 Cache块大小 块大小 – 大于 大于1Byte的块可以利用程序的空间局部特性 的块可以利用程序的空间局部 的块可以利用程序的空间局部特性 – 对指令,此特性非常重要 对指令, – 对数据,也有很大的好处 对数据, 块大小对Cache性能指标的影响 性能指标的影响 块大小对 – Miss Penalty = Block Size/Memory Bandwidth – Block Number = Cache Size/Block Size 31 Cache的参数:块大小 Miss Penalty Miss Rate 空间局部特性 块太少:影响时间 局部特性发挥作用 Block Size Average Access Time Block Size Miss Penalty 和 Miss Rate 增加导致 后面假设块大 小已经确定 Block Size 32 Cache的参数 还有其它增加命中率的方法? 还有其它增加命中率的方法? – 只要减少冲突,就可以增加命中率 只要减少冲突, – 如何减少冲突? 如何减少冲突? 一个内存单元可以映射到多个Cache块 块 一个内存单元可以映射到多个 – 相关程度 33 全相关Cache 内存地址 – Tag:同以前 : – Offset:同以前 : – Index:不再操作 : ?? 任何Cache块 – 同一内存单元可以映射到任何 同一内存单元可以映射到任何 块 – 如何实现? 如何实现? 34 全相关Cache 全相关Cache例:32