存储器体系结构学习笔记

首发于个人博客

存储器性能评价指标

存储器停顿周期数

存储器的性能直接影响到CPU的性能评价,定义存储器停顿周期数为CPU等待存储器访问而停顿的时钟周期数,由此有CPU执行时间有:
CPU执行时间=(CPU时钟周期数+存储器停顿时钟周期数) \times 时钟周期时间
因此需要存储器停顿时钟周期数越小越好,对于这一变量有公式如下:
存储器停顿周期数 = 缺失数量 \times 缺失代价 = 指令数 \times \frac{产生缺失指令数量}{指令数} \times 缺失代价 \\ = 指令数 \times \frac{存储器访问指令数}{指令总数} \times 缺失率 \times 缺失代价
其中,缺失率表示存储器访问指令中会产生cache缺失的百分比;缺失代价表示发生cache缺失后为了解决缺失需要消耗的平均时钟周期数。另一种度量指标与时钟周期无关,即为每条指令的平均缺失数:
平均缺失数=\frac{产生访存缺失的指令数}{指令总数} = 缺失率 \times \frac{存储器访问指令数}{指令总数}
上述公式与缺失代价无关,缺失率的定义与上文相同

存储器平均访问时间

缓存性能比较好的度量为存储器平均访问时间,即对于每次存储器访问而言需要的平均时间,公式如下:
存储器平均访问时间 = 命中时间 + 缺失时间 \times 缺失代价
需要注意的是这一指标仅针对存储器访问指令,因此这是一个间接度量,考虑以下情况:

参数 数据
16KB指令缓存缺失数(每千条指令) 3.82
16KB数据缓存缺失数(每千条指令) 40.9
32KB统一缓存缺失数(每千条指令) 43.3
统一缓存数据访问额外需要时钟周期数 1
存储器访问中指令引用占比 74%
命中周期数/缺失代价 1/100
指令中数据传输指令占比 36%

需要注意的是,缺失数指的是对于所有指令而言产生存储器缺失的次数,而缺失率为相对于所有存储器访问产生缺失的比例。对于16KB的指令缓存,每条指令都会产生一次指令访问,缺失率为:
缺失率_{指令} = \frac{3.82}{1000 \times 1} = 0.004
对于16KB的数据缓存,有36%的指令会产生一次存储器访问,因此有:
缺失率_{数据} = \frac{40.9 }{0.36 \times 1000} = 0.114
有74%的存储器访问为指令访问,因此总体的缺失率为:
缺失率_{分裂} = 0.74 \times 0.004 + 0.26 \times 0.114 = 0.0326
考虑存储器平均访问时间,有:
存储器平均访问时间_{分裂} = 0.74 \times (1+0.004 \times 200) + 0.26 \times (1 + 0.114\times 200) = 7.52
对于32KB统一缓存而言,1000条指令一共产生1000次指令访存,其中36%的指令会产生数据访存,如下所示:
缺失率_{统一} = \frac{43.3}{1000 + 1000 \times 0.36} = 0.0318
对于统一缓存而言,数据访存指令会产生两种存储器访问,一次指令访问和一次数据访问,而统一缓存仅有端口,因此数据访问需要等待一个时钟周期,因此存储器平均访问时间:
存储器平均访问时间_{统一} = 0.74 \times (1+0.0318 \times 200) + 0.26 \times (1 + 1 + 0.0318 \times 200) = 7.62

对CPU性能影响

对于CPU性能而言,有以下公式:
CPU执行时间=(CPU时钟周期数+存储器停顿时钟周期数) \times 时钟周期时间
一般认为缓存命中时间作为CPU执行时钟周期数的一个部分,考虑一个以下参数的缓存:

参数 数值
CPU执行周期数 1
缺失代价 200
平均缺失率 2%
每条指令的存储器引用数 1.5
平均缓存缺失数(千条指令) 30

对于以上参数,每千条指令产生的存储访问数为1000 \times 1.5 = 150,存储器访问的缺失率为2%,即千条指令产生的存储器缺失数量为150 \times 2\%=30,与给出的平均缓存缺失数一致。使用缺失数计算CPU执行时间:
CPU执行时间 = IC \times (1 + \frac{存储器停顿周期数}{IC}) \times 时钟周期 \\= IC \times (1 + \frac{停顿数}{IC} \times 缺失代价) \times 时钟周期 = IC \times (1+\frac{30}{1000} \times 200) \times 时钟周期 \\ = 7 \times IC \times 时钟周期
上述分析均对于顺序存储器而言,其每次存储器缺失都会暴露为缺失代价。对于乱序处理器而言,其存储器缺失可能被乱序执行的其他指令掩盖,即有:
存储器停顿周期 = 缺失数 \times (总缺失代价 - 重叠缺失延迟)
对于乱序执行的CPU而言,分析比较复杂,若一个时钟周期该CPU没有提交最大可能数目的指令,则认为该CPU发生的了存储器访问缺失。

存储器层次结构

存储器之间的关于存储器层次结构,需要解决以下四个问题:

  • 块的放置:一个块可以放在这一级的什么位置
  • 块的识别:如何找到放置在这一级中的一个块
  • 块的替换:在缺失时应当替换哪个块
  • 块的写入:写入时发生什么

块的放置

首先定义的概念,一个组是存储器中的一段连续空间,可以容纳多个(整数个)块。取一个存储器中组的数量为m,每个组可以容纳的块的数量为n,有以下关系:
存储器容量 = m \times n \times 块大小
任何来自某个地址的块只能被放置在一个特定的组中,这种方法被称为组相联,一个组中可以容纳n个块,即为n-路组相联。块首先被映射到组,组编号为:
组编号 = 块地址 \% m
随后,这个块可以被放置在这个组中的任意块地址位置。即对于一个块地址为A的块而言,对应的组编号为G = A\%m,其可以被放置在这个编号为G的组中的任意有效的块起始地址位置。如下图所示:

7241055-17de56655196a5f6.png
ch2_cache_group.png

对于组相联,有两种特殊情况:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值