《第十一课、精确异常处理,状态检修,状态恢复》由会员分享,可在线阅读,更多相关《第十一课、精确异常处理,状态检修,状态恢复(17页珍藏版)》请在金锄头文库上搜索。
1、第十一课、精确异常处理,状态检修,状态恢复 1、多周期执行 并非所有指令都需要相同的时间去“执行”。 理念:有多种不同的功能单元需要不同的周期数 可以流水线与否流水线 可以让独立的指令之前的长期等待指令之前开始执行不同的功能单元上执 行完毕 在流水线中出现的问题:在执行阶段,指令需要不同的周期数 整数加法 vs. FP 乘法 2、异常 vs. 中断 原因 异常:内部正在运行的线程 中断:外部的正在运行的线程 何时处理 例外:检测(和已知非推测)时 中断:当方便时 除了非常高的优先级的:停电、机器检查(错误) 优先级:过程(异常),取决于(中断) 处理 context:进程(异常),系统(中断)
2、 3 、精确异常/中断处理 当异常/中断准备处理,结构状态应该是一致的 所有前面的指令应完全撤退。 后来的指令可以不撤退。 撤退=提交=完成执行和更新结构状态 4、在流水线中确保精确异常 4.1、思路:使每个操作采用相同的时间 4.2、方法:重新排序缓冲区、历史缓冲区、远期寄存器堆、检查点 4.3、重新排序缓冲区 思路:完成乱序指令,在架构状态可视结果之前重新排序他们 1)ROB 条 需要有效位,以跟踪结果的准备 2)独立的操作码 结果首先写入 ROB,然后在提交时写入寄存器堆 如果以后的操作需要在重新排序缓冲区中的提取值 阅读重新排列缓冲区与寄存器堆同时进行。 3)如何获访问 一个寄存器值可
3、以在寄存器堆,重新排列缓冲区 简化重新排列缓冲区访问 思路:间接使用 首先访问寄存器堆 如果寄存器无效,寄存器堆存储包含(或将包含)寄存器值的重排序缓存条 目的 ID 寄存器到 ROB 条目的映射:如果有一个正在运行指令写入寄存器,寄存器堆 将寄存器映射到重新排序缓冲区条目 其次访问重新排序缓冲区 现在,排序缓冲区并不需要内容可寻址 Reorder Buffer in Intel Pentium III 4)重新排列缓冲区的寄存器重命名 输出和反相关性不是真正的依赖 为什么?相同的寄存器指的是互相没有什么联系的值 它们存在由于在 ISA 中缺乏寄存器的 ID 该寄存器 ID 重新命名为将保存寄
4、存器值的重排序缓存条目 寄存器 ID ROB 条目 ID 架构寄存器 ID物理寄存器 ID 重命名后,ROB 条目号用来指寄存器 这消除反相关性和输出相关性 给人的错觉有大量的寄存器 5)排序缓冲存储 cost 理念:通过专业的指令类型,减少重排序缓存条目存储 是否所有的指令所需要的所有领域? 你可以重复使用的指令之间的一些领域? 可以实现每个指令类型有各自的缓冲区? LD,ST,BR,ALU 6)顺序流水线重新排序缓冲区 译码(D):在 ROB 访问 REGFILE/ ROB,分配项,检查指令才能执行,如果 是这样调度指令 执行(E):指令可以完成乱序执行 完成(R):将结果写入重新排序缓冲
5、区 撤退/提交(W):检查是否有异常;如果没有,结果写到结构寄存器堆或存 储器;否则,刷新流水线和异常处理程序启动 有序调度/执行,乱序完成后,顺序撤退 4.4 历史缓冲区 1)理念:当指令完成时,更新寄存器堆,单发生异常时则不更新。 当指令被编译时,它保留一个 HB 条目 当指令完成时,它将目的地址的旧值存储在 HB 中 当旧指令未见异常/中断,HB 条目被丢弃 当旧指令有异常需要处理,在 HB 条目中的旧值从尾到头回写到结构状态 2) 优势: 寄存器堆中包含了最新内容 传入的指令值 历史缓冲区的访问不是在关键路径上 缺点: 需要读取目标寄存器的旧值 需要在异常时展开历史缓冲区 增加异常/中
6、断处理延迟 3)两种方法的比较 重新排序缓冲器 悲观的寄存器堆更新 更新只有非推测值(程序顺序) 访问新值时导致复杂性/延迟 历史缓冲区 乐观的寄存器堆更新 立即更新,但记录的旧值进行恢复 记录旧值时导致复杂性/延迟 4.4 远期寄存器堆+ROB 1) 思路:保持 2 个寄存器(投机和架构) 架构寄存器堆:更新了精确异常程序顺序 使用一个重新排序缓冲区,以确保按顺序更新 远期寄存器堆:只要一个指令完成更新(如果该指令是最近写进寄存器) 远期寄存器堆用于快速访问最新的寄存器的值(投机状态) 前端寄存器堆 架构寄存器堆用于在异常状态恢复(架构状态) 后端寄存器堆 2)远期寄存器堆 优点: 无需读取
7、来自 ROB 的新值(无 CAM 或间接)或目标寄存器的旧值 缺点: 多个寄存器堆 在发生异常时需要复制架构寄存器堆到远期寄存器堆 3)远期寄存器堆和重新排序缓冲器的顺序流水线 译码(D):在 ROB 访问 REGFILE/ ROB,分配项,检查指令才能执行,如 果是这样调度指令 执行(E):指令可以完成乱序执行 完成(R):将结果写入重新排序缓冲区 撤退/提交(W):检查是否有异常;如果没有,结果写到结构寄存器堆或存 储器;否则,刷新流水线和异常处理程序启动 有序调度/执行,乱序完成后,顺序撤退 4)远期映射 in Intel Pentium 4 5)重新排列缓冲区 vs. 远期映射 4.5
8、 检查点 当一个分支被编译 复制远期寄存器堆/映射,并将其与分支相关联 当一条指令产生一个寄存器值 所有远期寄存器堆/映射检查点都会更新值 当检测到分支预测错误 Restore the checkpointed future file/map for the mispredicted branch when the branch misprediction is resolved Flush instructions in pipeline younger than the branch Deallocate checkpoints younger than the branch 第十二课 一
9、、回忆: 1、思考问题 指令在流水线上执行时, 硬件和软件在顺序时有什么样的作用? 基于软件的指令调度 静态调度 基于硬件的指令调度 动态调度 使静态调度困难,该编译器不知道什么样的信息? 答:任何事在运行时确定 可变长度的操作延迟,内存地址,转移方向 2、动态指令调度 硬件在每个指令的基础上具有动态事件的知识 高速缓存未命中 分支预测失误 加载/存储地址 二、乱序执行(动态指令调度) 1、一个顺序流水线 问题:一个真正的数据依赖性停止派遣年轻的指令到功能(执行)单位 调度:发送指令到功能单元的行为 2、乱序执行(动态调度) 理念:将相关指令移动出的那些独立的方式 监测在休息区的每个指令的源“
10、值” 当指令的所有源“值”都可以,“火”(即调度)的指令 指令派遣在数据流(而不是控制流)顺序 受益: 延迟容忍:允许独立指令在很长的延迟期操作存在执行并完成 3、顺序 vs. 乱序调度 4、现代流水线中的两个 humps Hump1:保留站(调度窗口) Hump2:重新排序(排序缓冲,又名指令窗口或活动窗口) 5、一般结构的乱序处理器 6、乱序执行的异常处理 、思路:将它们提交到建筑前的状态前使用重新排序缓冲器对指令重新排序 当它完成执行指令,更新寄存器别名表(本质上是一个远期寄存器堆) 当它是机器中最老的,并已完成执行,一个指令更新架构寄存器堆时 、大多数现代处理器使用 重新排序缓冲器,以
11、支持指令顺序撤退 单个寄存器堆来存储寄存器(投机和建筑) - INT 和 FP 仍然独立 远期寄存器映射 用于重命名 架构寄存器映射 用于恢复状态 7、一个现代处理器的例子 8、乱序执行概念的总结 寄存器重命名消除虚假的依赖,使生产商链接到消费者 缓冲使流水线为独立 OPS 移动 标签广播使指令之间产生通信(产生价值的准备) 唤醒和选择使乱序调度 9、数据流限制 乱序引擎动态地构建了一块程序的数据流图 该数据流图限于指令窗口 指令窗口:所有的解码,但尚未退役 第十三课 1、其他途径并发(或指令级并行性) 并发途径(指令级): 流水线 乱序执行 数据流(在 ISA 级别) SIMD 处理(矢量和
12、阵列处理器,图形处理器) VLIW 解耦执行访问 收缩阵列 2、数据流:开拓不规则并行 2.1 记住:RAT 和 RS 的状态在周期 7 2.2 记住:数据流图 2.3 复习:更多关于数据流 在一个数据流机器中,一个程序由数据流节点组成 当一切的输入准备就绪时,一个数据流节点 fires(获取和执行), 数据流节点及其 ISA 表示 2.4 数据流节点 数据流节点() 数据流操作符的一个小设置可被用来定义一个通用的编程语言 2.5 数据流图 2.6 数据流程例子 2.7 控制流 vs.数据流 2.8 关于循环和函数调用 问题:多个动态实例对活动的相同的指令是活动的(即,由于循环迭代或从不 同的
13、位置函数调用) IP 不足以将同一的静态指令里的这些不同的动态实例区分开来 解决方案:通过创建新的标签/框架区别不同实例(在新的迭代或调用开始) 50 数据流特性 2.9 框架和执行的例子 需要只为一个操作数/操作员提供存储 2.10 数据流处理器 2.11 数据流的优缺点 优势:利用不规则的并行性非常好 只有真正依赖约束处理 缺点:调试困难(没有精确的状态) 中断/异常处理是困难的 实现动态数据结构很难在纯数据流模型 太多的并行? (并行控制所需的) High bookkeeping 开销(标签匹配,数据存储) 指令周期很低效(取决于指令之间的延时),内存位置不被占用 2.12 数据流总结 数据可用性决定执行顺序 它的来源是准备就绪,一个数据流节点 fires(获取和执行) 程序表示为数据流(节点)图 在 ISA 级别的数据流一直没有(因为)成功 引擎盖下的数据流实现(同时保持连续 ISA 语义)已经非常成功 乱序执行