用了wordpress的网站,网站制作小图标,网站seo关键词排名推广,各种网站建设报价系列文章目录
目录 流水线冒险数据冒险数据相关与数据冒险寄存器先读后写旁路取数使用型冒险阻塞 控制冒险分支引发的控制冒险假设分支不发生动态分支预测双预测位动态分支预测缩短分支延迟带冒险控制的单周期流水线图 异常MIPS中的异常MIPS中的异常处理另一种异常处理机制非精…系列文章目录
目录 流水线冒险数据冒险数据相关与数据冒险寄存器先读后写旁路取数使用型冒险阻塞 控制冒险分支引发的控制冒险假设分支不发生动态分支预测双预测位动态分支预测缩短分支延迟带冒险控制的单周期流水线图 异常MIPS中的异常MIPS中的异常处理另一种异常处理机制非精确异常精确异常流水线中的异常带异常处理的流水线异常的性质多个异常处理 中断中断系统中断的基本类型中断的产生方式中断处理方式是否屏蔽中断源中断响应方式中断重数 中断源的种类中断请求方式请求结构中断请求标记 INTR禁止中断和中断屏蔽禁止中断中断屏蔽中断判优 在这里插入图片描述中断响应中断处理程序入口中断处理及中断返回中断嵌套中断屏蔽 流水线冒险
数据冒险 数据相关与数据冒险 $ v0寄存器($ 2)被五条指令使用其中sub指令将结果-20写入$v0另外4条指令预期读取数据-20与sub指令数据相关但是sub指令在CC5才将-20写入$ v0and和or在CC3/CC4就要读取-20此时$v0的值还是10于是产生数据冒险(data hazard) 寄存器先读后写
约定寄存器前半拍写后半拍读在CC5中sub先写结果-20再由add读取可避免一次冒险 旁路 实际上and和or要使用的数据-20在CC3就已经由ALU计算生成我们可以从EX/MEM寄存器将数据直接传给and指令的ALU从MEM/WB寄存器将数据传给or指令的ALU这种跳过寄存器写回、直接从流水线寄存器取得数据的方法称为转发(forward)或旁路(bypass)其中and指令将sub的ALU运算结果作为ALU的rs输入形成ALU-ALU旁路 1a. EX/MEM.RegisterRd ID/EX.RegisterRs or指令将sub的ALU运算结果(MEM级)作为ALU的rt输入称为MEM-ALU旁路
配备两种旁路,则称为全旁路
取数使用型冒险
考虑指令序列 lw $t0,12( $s0 ) add $t1, $t0 , $t0 下一条指令使用lw的目标寄存器rt时访存读出的数据在MEM级才产生尝试添加旁路发现数据流向和时间相反对这种取数-使用型数据冒险必须在lw指令后添加一个气泡/阻塞周期 阻塞
add 指令已经执行IF和ID周期我们并不是真的塞入一条空指令nop而是把add的控制信号全部清零、使其不改变任何状态单元将其变为空指令同时将add指令的地址重新写回PCPC4-4在lw的EX周期重新执行add指令阻塞由冒险检测单元控制实现 控制冒险
分支引发的控制冒险 分支指令beq在MEM级才能决定是否分支此前beq后的三条指令都已被取到流水线分支成功执行了分支失败才应该执行的指令就产生了分支冒险是一种典型的控制冒险control hazard 假设分支不发生
当我们猜测每个分支语句发生的概率很小如循环中用于退出循环的beq reg1$zeroExit指令我们可以采取总是假设分支不发生的策略执行那些紧跟在beq后的指令跳过分支如果预测失败不产生额外开销且预测成功率能达到50%就能减少减少50%的分支冒险开销 也有总是假设分支发生 动态分支预测
上面这种方法只是简单的假设全部分支都不发生是一种静态分支预测
通过向数据通路添加称为分支预测缓存(分支历史记录)的小型索引存储器区保存近几次分支的记录,进而预测分支是否发生这样的策略称为动态分支预测动态分支预测的准确率通常高达90%
考虑一个循环进行9次循环分支(分支发生)后退出(分支不发生) 使用单预测位(初始化为表示不分支的0)会产生两次预测错误
进入第1次循环后要继续循环分支然而预测位为0预测不分支产生一次预测错误进入第9次循环后不再循环分支然而预测位为1预测分支产生第二次预测错误 双预测位动态分支预测 使用双预测位时,则只会产生一次预测错误两个预测位表示0~3这4个数初始化为0
分支一次1且不超过3不分支一次-1且不超过0当预测位为0、1时,预测分支不发生当预测位为2、3时,预测分支发生 缩短分支延迟
在此前的分析中beq在MEM级才能决定是否分支
如果能将整个分支过程提前到EX级就能将分支错误时的开销从3条指令(3个周期)缩短到2条指令(2个周期)提前到ID级,就能将分支错误开销进一步降低到1条指令
这种缩短分支延迟的策略需要提前2件事: 1.计算分支目标地址 2.判断分支条件
PC4的值在IF周期已经计算出来完全可以在ID周期计算出分支目标地址在ID级从寄存器堆取出rs和rt的数据送入一个相等检测单元判断相等以后即可向控制PCSrc的多选器发出信号将分支目标地址写回PC,在ID级完成分支
如果beq上一条指令是R型指令且需要比较R型指令的运算结果则在R型ALU结果旁路到IF/ID寄存器的基础上还需要将beq指令阻塞一个周期 如果beq上一条指令是lw指令取得的数据需要阻塞2个周期 带冒险控制的单周期流水线图 支持旁路的旁路单元支持阻塞的冒险检测单元用于在ID级比较两数是否相等的相等检测单元 异常
MIPS中的异常
在MIPS中系统中中断、陷阱、系统调用和任何可以中断程序正常运行的情况都称为异常
外部事件——中断内存翻译异常程序或硬件探测到的错误数据完整性错误系统调用和陷入 MIPS中的异常处理
保存出错指令 异常程序计数器EPCEPC寄存器用于指向异常发生时指令跳转前的执行位置当异常时返回这个地址 继续执行 保存问题产生的原因 状态寄存器 Cause register我们假定一位0表示未定义指令1表示算数溢出 异常处理系统跳转至统一的入口地址 8000 0180
另一种异常处理机制
向量中断 由异常原因决定中断控制的转移地址 例如 未定义指令 8000 0000算数溢出 8000 0180 指令可能是 处理中断跳转到实际的中断处理程序
非精确异常
常规异常一般为软件的异常异常发生时跳转前最后被执行的指令是其MEM阶段刚好被执行完的那条指令。受影响指令是EX阶段刚好执行完的那条指令。仅仅是停止流水线并保存状态,包括产生异常的原因: 哪条(些)指令产生了异常哪些可以完成或清除,可能需要“手动”完成对于复杂多发无序的流水线,此方法是不可行的 而中断一般为硬件异常中断可以是芯片内部也可以是芯片外部触发产生硬件简单但处理软件复杂
精确异常
在运行流程中没有任何多余效应的异常 即当异常发生时,受影响指令之前的指令被完全执行而受影响指令及后面的指令还没开始执行 如果受影响指令在分支延迟时间片中则硬件自动处理EPC在重新执行分支指令时分支延迟时间片中的指令会被再执行一次精确异常的实现对流水线的流畅性是有一定的影响的有助于保证软件设计上不受硬件实现的影响但异常太多,系统执行效率就会受到影响
流水线中的异常
控制冒险的另一种形式假设加法指令add $1,$2,$1在执行阶段产生了算术溢出 防止$1被破坏完成前面的指令清除add和后面的指令设置Casue和EPC寄存器的值把控制转交给异常处理程序 类似于分支预测错误的情形 使用许多相同的硬件
带异常处理的流水线 异常的性质
可重新执行的异常 流水线可以先清除这条指令在异常处理完后再重新执行这条指令 从头开始取指和执行 将导致异常的指令地址PC保存到EPC中 找到引起异常的指令实际上保存的是PC4 异常处理例程必须调整,从保存的地址中减去4
多个异常处理
流水线重叠执行多条指令 在一个时钟周期内可能发生多个异常 简单方法:从最早发生异常的指令开始处理异常 清除后续的所有指令精确异常 复杂的流水线中 每周期执行多条指令乱序的完成时间保持精确异常处理非常困难 中断
中断系统
当设备准备好或发生故障时 控制器向CPU发出中断申请 中断类似于异常 但对指令执行来说中断是异步的能够在指令之间调用处理程序中断状态通常能指出中断设备 中断优先级 更急迫需要的设备赋予更高的优先级能够中断一个低优先级的中断处理程序
中断的基本类型
中断的产生方式
强迫中断由某种随机产生的紧急事件引发的中断自愿中断由程序中事先安排好的中断指令引发
中断处理方式
程序中断CPU响应中断后转去执行相应的中断处理程序简单中断DMA方式CPU响应中断后不执行中断处理程序只是让出几个总线周期给DMAC完成DMA操作
是否屏蔽
非屏蔽中断优先级高用于应急处理可屏蔽中断优先级低用于一般外设传送
中断源
内中断由CPU内部软硬件原因引发如单步中断外中断CPU以外的部件引发
中断响应方式
向量中断 将所有的中断处理程序的入口地址第一条指令的地址排成一张表称为中断向量表在中断响应时CPU通过这张表找到各个中断处理程序的入口地址 非向量中断 中断源不提供中断服务程序的入口地址而通过软件查询的方法得到
中断重数
单重中断在CPU执行中断服务程序过程中不能再被打断多重中断中断嵌套在执行某个中断服务程序的过程中CPU可去响应级别更高的中断请求 中断源的种类
① 由外围设备引起的中断要求CPU介入I/O操作例如: * 慢速设备的缓冲寄存器准备好接收或发送数据 * 信息块传送的前、后处理 * 设备的启动或非数据控制动作(如磁带、磁盘定位)的完成 * I/O的任一环节出错等 ② 由运算器产生的中断。 ③ 由存储器产生的中断。 ④ 控制器产生的中断。 ⑤ 过程控制产生的中断。 ⑥ 时钟定时中断。 ⑦ 电源故障中断。 中断请求方式
请求结构
独立请求线
可直接识别中断源中断请求线数目有限 公共请求线通过软硬件识别中断源中断源数目可以扩充
二维结构
同级别采用相同请求线不同级别采用不同请求线
中断请求标记 INTR
一个请求源对应一个INTR中断请求标记触发器 多个INTR组成中断请求标记寄存器
禁止中断和中断屏蔽
禁止中断
产生中断源后由于某种条件的存在CPU不能中止现行程序的执行称为禁止中断一般在CPU内部设有一个**“中断允许”触发器**。该触发器置“1”状态才允许中断源等待CPU响应该触发器被清除则不允许所有中断源申请中断“中断允许”触发器通过**“开中断”、“关中断”**指令来置位或复位
中断屏蔽
当产生中断请求后用程序方式有选择地封锁部分中断而允许其余的中断仍得到响应称为中断屏蔽实现方法是 为每一个中断源设置一个中断屏蔽触发器来屏蔽该设备的中断请求具体来说用程序方法将该触发器置“1” “0”
中断判优
按中断性质和处理的轻重缓急进行排队 CPU现行程序与中断请求之间 现行程序优先级低于中断请求优先级CPU可以响应中断请求 各中断请求之间 硬件排队方式 优先级高的自动封锁优先级低的中断请求速度快成本高难于修改 软件查询方式 查询顺序可通过编程改变灵活查询、判优靠程序实现占用CPU时间速度慢
硬件实现排队器 软件实现程序查询 中断响应
保存断点 入栈或存入指定内存单元 关中断 防止中断响应过程被打断 形成中断服务程序入口
由中断隐指令实现并不是真正的指令由硬件直接实现的中断响应过程中的基本操作 中断处理程序入口
硬件方法向量中断 硬件自动形成中断处理程序的入口地址中断向量向量地址通常有两种情况 向量地址是中断服务程序的入口地址 CPU不需要再经过处理就可以进入相应的中断服务程序适合于中断源比较少的情况。 向量地址是中断向量表的指针 中断源给出的向量地址是中断服务程序入口地址的地址。例8086中断系统 软件查询法八个中断源 12… 8 按降序排列 中断处理及中断返回
开中断 允许中断嵌套 中断服务 根据中断源的要求进行具体的服务操作 关中断并恢复现场 防止受干扰先关中断然后从堆栈弹出原现场信息 开中断 由于中断程序的插入时随机的无法在返回原来的程序之后开中断必须在中断返回之前由中断服务程序执行开中断指令 中断返回 从堆栈中弹出断点地址便可从服务程序返回到原来程序的断点处执行原程序 中断嵌套
概念 一个系统中有多个中断源若CPU正在某中断服务程序时有更重要的中断源申请中断则CPU就中止正在服务的程序转为新的中断源服务在处理完毕后再返回到被中止的服务程序直至处理完返回主程序 中断嵌套的关键 中断处理程序中开中断利用堆栈保证中断的逐级返回 中断屏蔽
中断优先级包括两层含义 响应优先级 多个中断源同时发出中断请求时由硬件排队线路决定的CPU的响应次序称为硬排队 处理优先级 CPU在处理中断的过程中优先执行哪个中断服务程序的次序可以由中断屏蔽码来改变优先级顺序称为软排队 中断屏蔽 通过改变中断屏蔽码来改变中断优先级的技术
屏蔽字