• 计组笔记——CPU的指令流水


    计组笔记——CPU的指令流水

    流水线概述

    指令流水线

    • 将指令执行过程分成时间大致相等的若干个子过程,每个子过程配备专门的功能部件
    • 执行程序时,这些功能部件同时执行不同指令的不同子过程,从而缩短指令的执行时间,提高程序总体处理效率和系统资源利用率

    换言之,处理每一条指令的时间可能会变成,但是从总体上优化出来的时间,比单条指令增加的时间要更多,所以在总体上呈现出了程序处理效率提高的情况

    段/级——流水线中的子过程

    流水深度m——流水线中段的数量

    CPU的流水时空图

    对于流水时空图来说,X轴是每一个T周期,而Y轴是每一段流水的工作过程,这些坐标画出来的格子,若被填充,则代表了在这个时间里,哪一条指令在做哪一步工作
    在这里插入图片描述
    从图中不难看出,其实单条指令的执行时间并没有发生改变,但是很多条指令的执行时间缩短了

    因为在同一个时间里,可能有多条指令在执行过程中

    从图中也不难看出,CPU的指令流水线的流水是一个流水逐步填充的过程,当流水填充与指令执行结束达到一个动态平衡的时刻,这个状态被叫做 稳定状态

    也就是说,前一个时刻一条指令执行结束,下一条指令流水准备填充完成,这达到了一个动态平衡的过程,在图中可以体现为梯形中间的长方形

    注意:

    最好记住IF、ID、EX、MEM、WB的含义!
    在这里插入图片描述

    流水线的实现

    前面说到了,指令流水线是将不同的操作分到硬件上不同的区域里执行,要注意,这个操作结果若是放到内存里,将会多一段对内存的读取,这会增加很多指令的运行时间;于是,在每一段流水之间增加了一个 锁存器(类似寄存器,计算机访问寄存器比访问内存快),来暂时保存每一段流水的结果,这样就可以减少对内存的访问了

    在图中体现的就是橙色的长条
    在这里插入图片描述

    流水线的性能指标

    加速比

    某程序 不采用流水线的执行时间T1采用了流水线的执行时间Tm的比值

    S = T1/Tm

    不难看出,这个比值一定要大于1,不然这个流水是失败的,因为根本没有起到加速的作用

    加速比计算公式的推导,见下图
    在这里插入图片描述
    注意: 影响加速比的因素中第二点,在理想情况下,我们在时空图中画出来的格子都是正方形,也就是说,我们默认每一段流水的执行的时间都是相等的,但是实际情况不是这样,可能是个长方形,这个时候,就要按照最长的长方形也就是最长的执行时间来规定每一段的流水时间

    而且我们默认,n >> m (n远大于m)

    公式推导的解释。。。三角符号打不出来,不解释太多了简单提一下流水填充达到稳定前为一段,稳定后为一段

    吞吐率

    单位时间内流水线所完成的指令数量

    最大吞吐率——流水线在连续流动达到稳定状态后所获得的吞吐率 因为流水填充会达到稳定状态,这个时候就是最大吞吐率!

    注意:

    最大吞吐率与流水段数无关,流水线仅在稳定时获得最大吞吐率

    使用效率

    流水线中个调研的平均利用率;又或者说是流水线工作时,处于工作状态的阶段部件数与总阶段部件数的比值
    在这里插入图片描述

    影响流水线性能的相关性

    结构相关

    结构相关也叫 资源相关。流水线中多条指令在同一个时间周期内,争用同一功能部件发生的冲突

    举个例子

    一条指令执行到最后一个流水,要将结果写会内存,但是这个时候,下一条指令开始取指了,如果是冯诺依曼结构,因为存储器都是同一个,这个时候就是冲突了,但如果是哈佛结构,那就不会冲突,因为有指令存储器和数据存储器

    图中很好解释了如何解决的
    在这里插入图片描述

    数据相关

    真正意义上影响流水执行的问题,因为这个是逻辑上的冲突,前面的讲到的数据相关其实能通过优化结构来解决

    举个例子

    一条指令的执行依赖于前一条指令的执行结果,但是有可能前一条指令还没得到结果,第二条指令就要拿前面的结果来做运算了,这个时候就冲突了

    一般来说目前研究的流水都是有序流动的简单流水,所以重点还是看RAW先写后读这个冲突
    在这里插入图片描述
    数据相关的解决方法

    旁路技术/专用数据通路技术

    解释一下

    前面提到了锁存器,这个锁存器其实是保存了计算的结果的,虽然还没执行写回,但是结果其实已经出来了,锁存器又不是摆设,可以将锁存器保存的结果直接导回去,在图中有体现!
    在这里插入图片描述

    控制相关

    简单来说就是在执行if 和 else的时候在条件判断结束前,是不知道要走哪一个分支的,但是由于流水操作,得取指,这个时候计算机就不知道取哪一个分支的地址了,这就是控制相关

    解决方法也很直观

    要么就延迟,延迟包治百病

    要么就猜

    静态预测: 简单来说就是每次都猜 if 或者 else

    动态预测:根据以往的判断,来判断出这次要猜什么 有点机器学习的感觉。。。。

    在这里插入图片描述

    例题

    在这里插入图片描述
    在这里插入图片描述
    下面这题先挂着,日后手写解答,目前暂时不会上那么高的强度
    在这里插入图片描述
    当时的作业
    在这里插入图片描述
    第二题答案
    在这里插入图片描述
    1. 首先,程序员可见的寄存器通用寄存器是可见的,PC也是可见的。汇编里有提到,设置缓存器的原因,单总线一次只能传一个数,要传两个不同的数必须将第一个数存下来,后面暂存器提供一个,总线提供一个
    2. 7种操作3位2进制数也没太大问题
    3. 3态门,为了将总线与其他设备隔离开
    4. 1;2;3;5;8是各个部件的使能端,所以得接入控制部件输出端,让控制部件能控制它们
    5. 6->9是总线到2路选择的一个输入,而7->4是2路选择器的输出结果

    6. 第六题没什么可以多说的,的确是这样,一条指令占2字节,所以这样做是较为方便的
    在这里插入图片描述
    简单说一下第一题和第三题
    第一题主要是60*2+1,这道题题目说这三条指令有一条是公用的,所以只需要乘2,不需要乘3
    第三题直接画和带公式就好了

  • 相关阅读:
    关于6轴球腕机械臂的肩部奇异描述纠正
    【Pandas总结】第四节 Pandas 缺失值处理(通过实例进行演示)
    浅谈——网络安全架构设计(二)
    临界区、临界资源、共享资源、临界调度原则
    RocketMQ源码阅读(十四)延迟消息
    精品基于Python实现的校园二手交易网站购物商城设计与实现
    《信息安全技术》学习笔记03
    Docker 及 Docker Compose 安装指南
    使用.NET简单实现一个Redis的高性能克隆版(四、五)
    MongoDB打破了原则引入SQL?
  • 原文地址:https://blog.csdn.net/weixin_50026222/article/details/125446367