1212 字
6 分钟
《计算机体系结构:量化研究方法》笔记

读书《计算机体系结构:量化研究方法》。这份笔记的特点:只记下我觉得可能会在比赛/面试/项目中理解的理论和技巧。别的用到的时候再update一下。 这篇文章是完全的实用功利主义的文章,因此不可避免的会缺少一些原书中非常值得玩味的部分和知识,比如第一章中,我不关心成本/功耗/面积等参数,而在实际的处理器设计中,这三者有时比性能更重要。

处理器的性能分析#

第一章中主要总结了处理器性能的各个指标以及其公式。 总的目的的降低程序的CPU时间(秒),最重要的公式是公式(8):

  • 时钟周期时间: 硬件技术与组成
  • CPI: 组成与指令集体系结构
  • 指令数: 指令集体系结构和编译器技术

处理器设计主要集中在降低CPI上,不过事实上这三个因素之间相互影响。因此提高处理器性能主要是这三个因素相互之间tradeoff。

@startmindmap
<style>
  node {
    FontName 微软雅黑
    FontSize 17
    LineThickness 0
    BackgroundColor #EEEEEE
    FontColor black
  }
  :depth(0) {
    BackgroundColor #3949AB
    FontColor white
    FontSize 23
  }
  boxless {
    FontName 微软雅黑
    FontColor black
  }
  arrow {
    LineColor black
    LineThickness 1
  }
</style>
* 性能分析
** 执行时间
*** 性能(1)
*** 加速比(2)
** 处理器性能
*** 时钟周期时间 
**** 时钟频率: 一秒钟执行的时钟周期数(3)
*** 程序的CPU的时钟周期数
**** CPU时间: 程序的执行时间(4)(5)(8)(9)(10)
*** 指令数(IC): 程序包含多少条指令
**** CPI: 每条指令的时钟周期数(6)
**** IPC: CPI的倒数(7)
@endmindmap
n=执行时间Y执行时间X=性能X性能Y(1)n = \frac{\text{执行时间}_Y}{\text{执行时间}_X} = \frac{\text{性能}_X}{\text{性能}_Y}\tag{1}加速比=未改进时的执行时间改进后的执行时间(2)\text{加速比} = \frac{\text{未改进时的执行时间}}{\text{改进后的执行时间}}\tag{2}时钟频率=1s时钟周期时间(3)\text{时钟频率} = \frac{1s}{\text{时钟周期时间}} \tag{3}CPU时间=程序的CPU时钟周期数时钟周期时间(4)CPU\text{时间} = \text{程序的}CPU\text{时钟周期数} * \text{时钟周期时间} \tag{4}CPU时间=程序的CPU时钟周期数时钟频率(5)CPU\text{时间}= \frac{\text{程序的}CPU\text{时钟周期数}}{\text{时钟频率}} \tag{5}CPI=程序的CPU时钟周期数指令数(6)CPI = \frac{\text{程序的}CPU\text{时钟周期数}}{\text{指令数}}\tag{6}IPC=指令数程序的CPU时钟周期数(7)IPC = \frac{\text{指令数}}{\text{程序的}CPU\text{时钟周期数}}\tag{7}CPU时间=指令数CPI时钟周期时间(8)CPU\text{时间} = \text{指令数} * CPI * \text{时钟周期时间} \tag{8}CPU时间=指令数程序时钟周期数指令数时钟周期数=程序(9)CPU\text{时间} = \frac{\text{指令数}}{\text{程序}} * \frac{\text{时钟周期数}}{\text{指令数}} * \frac{\text{秒}}{\text{时钟周期数}} = \frac{\text{秒}}{\text{程序}}\tag{9}CPU时间=(CPU时钟周期数+存储器停顿周期数)时钟周期时间(10)CPU\text{时间} = (CPU\text{时钟周期数} + \text{存储器停顿周期数}) * \text{时钟周期时间}\tag{10}

缓存#

@startmindmap 
<style>
  node {
    FontName 微软雅黑
    FontSize 17
    LineThickness 0
    BackgroundColor #EEEEEE
    FontColor black
  }
  :depth(0) {
    BackgroundColor #3949AB
    FontColor white
    FontSize 23
  }
  boxless {
    FontName 微软雅黑
    FontColor black
  }
  arrow {
    LineColor black
    LineThickness 1
  }
</style>
* Cache
** 缓存结构(1)
*** 缓存大小
*** 缓存组相连数
*** 块大小
*** 索引
** 基本的缓存优化方法
*** 降低缺失率
**** 增大缓存块
**** 增大缓存
**** 提高相连度
*** 降低缺失代价
**** 多级缓存
**** 为读缺失指定高于写操作的优先级
*** 缩短命中时间
**** 索引缓存期间避免虚实地址转换
** 缓存性能标准
*** 存储器停顿周期(2)
*** 缺失率
**** 缺失代价:往往作为常数使用
**** 读写操作分开考虑下的公式(3)
**** 每条指令的缺失数(4)
*** 存储器平均访问时间(5)
** 四个存储层次结构问题
*** 块的放置
*** 块的识别
*** 块的替换
**** 随机
**** LRU
**** 伪LRU
**** FIFO 
*** 写入策略
**** 写直达:容易实现,简化数据一致性.
**** 写回:适用于多处理器/嵌入式程序
**** 脏位
**** 写入停顿
***** 写缓冲区
**** 写缺失
***** 写分配:通常与写回搭配
***** 非写分配:通常与写直达搭配
** 缺失
*** 强制缺失/冷启动缺失/首次访问缺失
*** 容量缺失
*** 冲突缺失/碰撞缺失
*** 一致性缺失

@endmindmap

缓存性能#

2索引=缓存大小块大小组相连度(1)2^{\text{索引}} = \frac{\text{缓存大小}}{\text{块大小}*\text{组相连度}}\tag{1}存储器停顿周期=缺失数缺失代价=IC缺失数指令缺失代价=IC存储器访问次数指令缺失率缺失代价(2)\begin{aligned} \text{存储器停顿周期} &= \text{缺失数} * \text{缺失代价} \\ &= IC * \frac{\text{缺失数}}{\text{指令}} * \text{缺失代价} \\ &= IC * \frac{\text{存储器访问次数}}{\text{指令}} * \text{缺失率} * \text{缺失代价} \\ \end{aligned} \tag{2}存储器停顿周期=IC读指令占比读缺失率写缺失代价=IC写指令占比写缺失率写缺失代价(3)\begin{aligned} \text{存储器停顿周期} &= IC * \text{读指令占比} * \text{读缺失率} * \text{写缺失代价} \\ &= IC * \text{写指令占比} * \text{写缺失} \text{率} * \text{写缺失代价} \end{aligned} \tag{3}缺失数指令=缺失率存储器访问次数指令数=缺失率存储器访问次数指令(4)\begin{aligned} \frac{\text{缺失数}}{\text{指令}} &= \frac{\text{缺失率}*\text{存储器访问次数}}{\text{指令数}} \\ &= \text{缺失率} * \frac{\text{存储器访问次数}}{\text{指令}} \end{aligned}\tag{4}存储器平均访问时间=命中时间+缺失率缺失代价(5)\text{存储器平均访问时间} = \text{命中时间} + \text{缺失率} * \text{缺失代价}\tag{5}

存储器结构问题#

Opteron数据缓存:

  • 64KB
  • 块大小为64字节 : 1024块
  • 两路组相连 : 512块/路
  • LRU替代策略
  • 写回策略
  • 写缺失时写分配
《计算机体系结构:量化研究方法》笔记
https://clo91eaf.github.io/posts/计算机体系结构量化研究方法笔记/
作者
Clo91eaf
发布于
2023-03-14
许可协议
CC BY-NC-SA 4.0