190 likes | 505 Views
实验: Cache Simulator. Gu Rong gurongwalker@gmail.com 2014/05/28. 背景回顾. 为什么我们需要 cache (高速缓存器 )? 何为块,何为行, 何为 字? 为便于 cache 和主存间交换信息, cache 和主存空间都被划分成相等的区域。主存中区域称为块 ( 主存块 ) , cache 中存放一个主存块的区域称为行或 槽, 它是 cache 和主存之间的信息交换 单位。 CPU 与 Cache 之间的数据交换是以字为单位的,而 Cache 与主存之间的数据交换则是以块为单位的。一个块由若干个定长字组成。.
E N D
实验:Cache Simulator GuRong gurongwalker@gmail.com 2014/05/28
背景回顾 • 为什么我们需要cache(高速缓存器)? • 何为块,何为行,何为字? • 为便于cache和主存间交换信息,cache和主存空间都被划分成相等的区域。主存中区域称为块(主存块),cache中存放一个主存块的区域称为行或槽,它是cache和主存之间的信息交换单位。CPU与Cache之间的数据交换是以字为单位的,而Cache与主存之间的数据交换则是以块为单位的。一个块由若干个定长字组成。
背景回顾 • 主存块和cache行之间有以下三种映射方式 • 直接映射。每个主存块映射到cache的固定行中。 • 全相联映射。每个主存块映射到cache的任意行中。 • 组相联映射。每个主存块映射到cache的固定组的任意行中。 • 替换算法 • 先进先出算法(FIFO) • 最近最少用算法(LRU) • 最不经常用算法(LFU) • 随机替换算法(Random)
实验一要求 • 配置参数 • Cache大小 • Cache行大小 • 关联方式 • 替换策略 • 写策略° • 缺失损失* • 输入 s 0x1fffff50 1 l 0x1fffff58 1 • 输出 • 总/读/写次数 • 平均/读/写命中率 • 总运行周期*
核心流程 • 配置参数决定各个步骤 获得主存地址 计算主存块号 Hit ? Cache大小、Cache行大小 N Y 更新 替换 关联方式 替换策略、写策略
Cache 配置 → 基本结构 • Cache大小、Cache行大小 • Cache行数 = Cache大小 / Cache行大小 • 块大小 = Cache行大小 • 块内地址长度 = log2(Cache行大小) • 主存地址 → Cache • 主存块号 = 主存地址 /块大小 主存地址 >> 块内地址长度 • 块内地址 = 主存地址 % 块大小 块内地址 标记 … 数据 … 主存块号
编码上的细节(1) • Cache中的标记(tag) • 以string(char[])的方式保存二进制 o(>_<)o • 二进制、十进制、十六进制间的转换 • 查找时字符串比较 • int(unsigned int、long) o(≧v≦)o • 十六进制转十进制(scanf(“%x”, n)) • 移位、模、位运算
关联方式 → hit or miss • 直接映射 • 需要:有效位valid[Cache行数],标记tag[Cache行数] • 目标标记 T= 主存块号 / Cache行数 • 目标行号 L = 主存块号 % Cache行数 • (valid[L] && tag[L] == T) → hit 标记 Cache行号 块内地址
关联方式 → hit or miss • 全相联映射 • 需要:有效位valid[Cache行数],标记tag[Cache行数] • 目标标记 T= 主存块号 • for(i = 0 to Cache行数-1) (valid[i] && tag[i] == T) → hit miss 标记 块内地址
关联方式 → 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组号 块内地址
编码上的细节(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
替换策略 • 替换策略只适用于全相联和组相联 • Random随机替换 • srand(seed)、srand((unsigned)time(NULL)) • 0~N-1的随机数:rand() % N • LRU最近最少用替换 • 每次访问时,被访问的那行计数清零,其他行加1 • 需要替换时,将计数最大的行换出
写策略 • 对实验结果毫无影响 • Write Through直写 • 什么事也没发生 • Write Back回写 • dirtyBits[Cache行数] • 当操作为“写”时对应的dirty bit置为1
编码上的细节(3) • 替换策略的作用范围 • 全相联:所有Cache行 • rand() % Cache行数 • for(i = 0 to Cache行数-1) • m-路组相联:某一组内 • rand() % m • for(i = 0 to m -1)
缺失损失* • 要求输出总运行周期 • = 指令执行周期 + 指令间隔 + 缺失损失 • 对于每条指令 • 指令执行周期 = 1 • 指令间隔(从文件读入) • 缺失损失 = hit: 0 miss: 100
结果 & 分析 • 指令数统计 • 256KB,8 Byte/行,直接映射
结果 & 分析 • 64KB,32 Byte/行,4-路组相联,LRU • 64KB,32 Byte/行,4-路组相联,Random • 8KB,64 Byte/行,全相联,LRU