1 / 19

实验: Cache Simulator

实验: Cache Simulator. Gu Rong gurongwalker@gmail.com 2014/05/28. 背景回顾. 为什么我们需要 cache (高速缓存器 )? 何为块,何为行, 何为 字? 为便于 cache 和主存间交换信息, cache 和主存空间都被划分成相等的区域。主存中区域称为块 ( 主存块 ) , cache 中存放一个主存块的区域称为行或 槽, 它是 cache 和主存之间的信息交换 单位。 CPU 与 Cache 之间的数据交换是以字为单位的,而 Cache 与主存之间的数据交换则是以块为单位的。一个块由若干个定长字组成。.

harlow
Download Presentation

实验: Cache Simulator

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 实验:Cache Simulator GuRong gurongwalker@gmail.com 2014/05/28

  2. 背景回顾 • 为什么我们需要cache(高速缓存器)? • 何为块,何为行,何为字? • 为便于cache和主存间交换信息,cache和主存空间都被划分成相等的区域。主存中区域称为块(主存块),cache中存放一个主存块的区域称为行或槽,它是cache和主存之间的信息交换单位。CPU与Cache之间的数据交换是以字为单位的,而Cache与主存之间的数据交换则是以块为单位的。一个块由若干个定长字组成。

  3. 背景回顾 • 主存块和cache行之间有以下三种映射方式 • 直接映射。每个主存块映射到cache的固定行中。 • 全相联映射。每个主存块映射到cache的任意行中。 • 组相联映射。每个主存块映射到cache的固定组的任意行中。 • 替换算法 • 先进先出算法(FIFO) • 最近最少用算法(LRU) • 最不经常用算法(LFU) • 随机替换算法(Random)

  4. 实验一要求 • 配置参数 • Cache大小 • Cache行大小 • 关联方式 • 替换策略 • 写策略° • 缺失损失* • 输入 s 0x1fffff50 1 l 0x1fffff58 1 • 输出 • 总/读/写次数 • 平均/读/写命中率 • 总运行周期*

  5. 核心流程 • 配置参数决定各个步骤 获得主存地址 计算主存块号 Hit ? Cache大小、Cache行大小 N Y 更新 替换 关联方式 替换策略、写策略

  6. Cache 配置 → 基本结构 • Cache大小、Cache行大小 • Cache行数 = Cache大小 / Cache行大小 • 块大小 = Cache行大小 • 块内地址长度 = log2(Cache行大小) • 主存地址 → Cache • 主存块号 = 主存地址 /块大小 主存地址 >> 块内地址长度 • 块内地址 = 主存地址 % 块大小 块内地址 标记 … 数据 … 主存块号

  7. 编码上的细节(1) • Cache中的标记(tag) • 以string(char[])的方式保存二进制 o(>_<)o • 二进制、十进制、十六进制间的转换 • 查找时字符串比较 • int(unsigned int、long) o(≧v≦)o • 十六进制转十进制(scanf(“%x”, n)) • 移位、模、位运算

  8. 关联方式 → hit or miss • 直接映射 • 需要:有效位valid[Cache行数],标记tag[Cache行数] • 目标标记 T= 主存块号 / Cache行数 • 目标行号 L = 主存块号 % Cache行数 • (valid[L] && tag[L] == T) → hit 标记 Cache行号 块内地址

  9. 关联方式 → hit or miss • 全相联映射 • 需要:有效位valid[Cache行数],标记tag[Cache行数] • 目标标记 T= 主存块号 • for(i = 0 to Cache行数-1) (valid[i] && tag[i] == T) → hit miss 标记 块内地址

  10. 关联方式 → hit or miss • 组相联映射 • 需要:有效位valid[Cache行数],标记tag[Cache行数],组相联系数 S,Cache组数G(G = Cache行数 / S) • 目标标记 T= 主存块号 / G • 目标组号 g = 主存块号 % G • for(i = g*S to (g+1)*S-1) (valid[i] && tag[i] == T) → hit miss 标记 Cache组号 块内地址

  11. 编码上的细节(2) • DM.cpp、FA.cpp、SA.cpp • 重复的代码、bug难调 • 映射函数区分DM、SA、FA • DM和FA是特殊的SA • 1-路组相联(直接映射)、∞-路组相联(全相联) • for(i = begin to end) (valid[i] && tag[i] == T) → hit miss

  12. 替换策略 • 替换策略只适用于全相联和组相联 • Random随机替换 • srand(seed)、srand((unsigned)time(NULL)) • 0~N-1的随机数:rand() % N • LRU最近最少用替换 • 每次访问时,被访问的那行计数清零,其他行加1 • 需要替换时,将计数最大的行换出

  13. 写策略 • 对实验结果毫无影响 • Write Through直写 • 什么事也没发生 • Write Back回写 • dirtyBits[Cache行数] • 当操作为“写”时对应的dirty bit置为1

  14. 编码上的细节(3) • 替换策略的作用范围 • 全相联:所有Cache行 • rand() % Cache行数 • for(i = 0 to Cache行数-1) • m-路组相联:某一组内 • rand() % m • for(i = 0 to m -1)

  15. 缺失损失* • 要求输出总运行周期 • = 指令执行周期 + 指令间隔 + 缺失损失 • 对于每条指令 • 指令执行周期 = 1 • 指令间隔(从文件读入) • 缺失损失 = hit: 0 miss: 100

  16. 设计 —— 流程图

  17. 结果 & 分析 • 指令数统计 • 256KB,8 Byte/行,直接映射

  18. 结果 & 分析 • 64KB,32 Byte/行,4-路组相联,LRU • 64KB,32 Byte/行,4-路组相联,Random • 8KB,64 Byte/行,全相联,LRU

  19. The End.

More Related