CSAPP学习笔记 -- 第四章 处理器体系结构(四)

 
4.5.5 流水线冒险
当相邻指令存在相关时可能会导致流水线产生计算错误,称为冒险
  • 数据冒险(优先级高)
    • 数据相关:下一条指令会使用到这一条指令计算出的结果
    • 数据冒险的类型
  • 控制冒险
    • 控制相关:一条指令要确定下一条指令的位置时
 
  • 在周期7开始以后,两条irmovq都已经通过写回阶段,所以寄存器文件保存着更新过的%rdx和rax的值
  • 因此,当addq指令在周期7经过译码阶段时,它可以读到源操作数的正确值
  • 在此示例中,两条irmovq指令和addq指令之间的数据相关没有造成数据冒险。
  • 因为3条nop指令创造了一些延迟,使得addq指令操作数全部正确
 
避免冒险的几种技术
  • 用暂停来避免数据冒险
    • 暂停是避免冒险的常见技术,暂停时,处理器会停止流水线中一条或者多条指令,直到冒险条件不再满足
    • 让一条指令停顿在译码阶段,直到产生它的操作数的指令通过了写回阶段,这样我们的处理器就能避免数据冒险
    • 每次要把一个指令阻塞在译码阶段,就在执行阶段插入一个气泡,气泡就像一个自动产生的nop指令——他不会改变寄存器、内存、条件码和程序状态,如下图
    • 这会导致流水线暂停长达3个时钟周期,严重降低了整体的吞吐量
  • 用转发来避免数据冒险
    • 和暂停技术相比,与其等到源操作数的写回阶段完成,不如将其传到流水线寄存器E作为源操作数
    • 这种将结果值直接从一个流水线阶段传到较早阶段的技术称为数据转发(简称转发,又是也叫旁路)
    • 它使得指令能够通过流水线而不需要任何暂停
    • 数据转发需要在基本的硬件结构中增加一些额外的数据连接和控制逻辑
  • 加载/使用数据冒险
    • 将暂停和转发结合起来,避免加载/使用数据冒险
    • 这种用暂停来处理加载/使用冒险的方法称为加载互锁
    • 加载互锁和转发结合起来足以处理所有可能类型的数据冒险
  • 避免控制冒险
    • 当处理器无法根据处于取指阶段的当前指令来确定下一条指令的地址时,就会发生控制冒险
    • 控制冒险只会出现在ret指令和跳转指令,后者只会在条件跳转方向预测错误时才会造成麻烦
    • 插入3个气泡,等待ret到达写回阶段
    • 因为预测跳转指令会选择分支,所以周期3中会取出位于跳转目标处的指令,而周期4中会取出该指令后的那条指令。在周期4,分支逻辑发现不应该选择分支之前,已经取出了两条指令,它们不应该继续执行下去了。幸运的是,这两条指令都没有导致程序员可见的状态发生改变。只有到指令到达执行阶段时才会发生那种情况,在执行阶段中,指令会改变条件码。我们只要在下一个周期往译码和执行阶段中插入气泡,并同时取出跳转指令后面的指令,这样就能取消(有时也称为指令排除(instruction squashing))那两条预测错误的指令。这样一来,两条预测错误的指令就会简单地从流水线中消失,因此不会对程序员可见的状态产生影响。唯一的缺点是两个时钟周期的指令处理能力被浪费了。
 
4.5.6 异常处理
我们的指令集体系结构包括了三种不同的内部产生的异常
  • halt指令
  • 有非法指令和功能码组合的指令
  • 取指或数据读写试图访问一个非法地址
 
我们把导致异常的指令称为异常指令
 
异常问题
  • 当出现多个异常时如何处理
    • 处理异常的基本原则:由流水线中最深的的指令引起的的异常,优先级最高
    • 在流水线结构中加入异常处理逻辑
  • 由于分支预测错误,异常指令被发现非法同时被取消
    • 在流水线结构中加入异常处理逻辑
  • 流水线化的处理器会在不同阶段更新系统状态的不同部分,违背了异常指令之后的所有指令都不能影响系统状态的要求
    • 当处于访存或写回阶段中的指令导致异常时,流水线控制逻辑必须禁止更新条件码寄存器或是数据内存
 
让我们来看看这种处理异常的方法是怎样解决刚才提到的那些细节问题的。当流水线中有一个或多个阶段出现异常时,信息只是简单地存放在流水线寄存器的状态字段中。异常事件不会对流水线中的指令流有任何影响,除了会禁止流水线中后面的指令更新程序员可见的状态(条件码寄存器和内存),直到异常指令到达最后的流水线阶段。因为指令到达写回阶段的顺序与它们在非流水线化的处理器中执行的顺序相同,所以我们可以保证第一条遇到异常的指令会第一个到达写回阶段,此时程序执行会停止,流水线寄存器W中的状态码会被记录为程序状态。如果取出了某条指令,过后又取消了,那么所有关于这条指令的异常状态信息也都会被取消。所有导致异常的指令后面的指令都不能改变程序员可见的状态。携带指令的异常状态以及所有其他信息通过流水线的简单原则是处理异常的简单而可靠的机制。
 
 
 
能力有限,后续小节跳过
posted @ 2020-08-18 21:59  Yoke_cc  阅读(363)  评论(0编辑  收藏  举报