为什么较长的管道会导致单个延迟槽不够用?

2024-03-29

我在 Patterson & Hennessy 的文章中读到了以下声明计算机组织与设计教科书:

随着处理器使用更长的管道并在每个时钟周期发出多个指令,分支延迟变得更长,并且单个延迟槽是不够的。

我可以理解为什么“每个时钟周期发出多个指令”会使单个延迟槽不足,但我不知道为什么“较长的管道”会导致它。

另外,我不明白为什么较长的管道会导致分支延迟变得更长。即使使用更长的管道(一步完成一条指令),也不能保证周期会增加,那么为什么分支延迟会增加呢?


如果添加任何阶段before检测分支的阶段(并评估条件分支的采取/不采取),1 个延迟槽不再隐藏进入管道第一阶段的分支与正确的程序计数器地址之间的“延迟”after分支已知。

第一个获取阶段需要管道中稍后的信息来知道下一步要获取什么,因为它不itself检测分支。例如,在具有分支预测的超标量 CPU 中,它们需要在解码后预测分支的走向,从而单独且更早地预测下一个要获取的指令块。

1 个延迟槽仅在 MIPS I 中足够,因为分支条件是在上半场EX 中的一个时钟周期 https://stackoverflow.com/questions/56586551/how-does-mips-i-handle-branching-on-the-previous-alu-instruction-without-stallin/58601958#58601958,及时转发到 IF 的第二半,在此之前不需要获取地址。 (原始 MIPS 是经典的 5 级 RISC:IF ID EX MEM WB。)参见维基百科关于经典 RISC 流水线的文章 https://en.wikipedia.org/wiki/Classic_RISC_pipeline有关更多详细信息,特别是控制危险部分 https://en.wikipedia.org/wiki/Classic_RISC_pipeline#Control_hazards.


这就是为什么 MIPS 仅限于简单的条件,例如beq(通过 XOR 查找任何不匹配项),或者bltz(符号位检查)。它不能做任何需要加法器进行进位传播的事情(因此一般blt两个寄存器之间是只是一条伪指令 https://stackoverflow.com/questions/19923977/why-isnt-mips-blt-instruction-implemented-in-hardware).

这是非常严格的:较长的前端可以吸收较大/关联性更强的 L1 指令缓存的延迟,该缓存需要超过半个周期才能响应命中。 (MIPS 我解码的是very不过很简单,由于指令格式是有意设计的,因此机器代码位可以直接连接为内部控制信号。因此,您也许可以在“半周期”阶段进行解码,获取 1 个完整周期,但即使 1 个周期仍然很低,在更高的时钟速度下周期时间更短。)

提高时钟速度可能需要添加另一个读取阶段。解码必须检测数据危险并设置旁路转发;最初的 MIPS 通过不检测加载使用危险来简化这一过程,相反,软件必须尊重加载延迟槽,直到 MIPS II。即使有 1 个周期的 ALU 延迟,超标量 CPU 也可能存在更多危险,因此检测必须转发的内容需要更复杂的逻辑,以将旧指令中的目标寄存器与较新指令中的源进行匹配。

超标量管道甚至可能需要在指令获取中进行一些缓冲以避免气泡。多端口寄存器文件的读取速度可能会稍慢,可能需要额外的解码流水线阶段,尽管这可能仍然可以在 1 个周期内完成。

因此,除了由于超标量执行的本质而导致 1 个分支延迟槽不足之外,如果额外的阶段位于提取和分支解析之间,较长的管道也会增加分支延迟。例如一个额外的获取阶段和一个 2 宽的管道可以在分支后有 4 条正在运行的指令而不是 1。


但不是引入更多的分支延迟slots要隐藏这个分支延迟,实际的解决方案是分支预言。 (然而,一些 DSP 或高性能微控制器确实有 2 个甚至 3 个分支延迟槽。)

分支延迟槽使异常处理变得复杂;你需要一个错误返回and下一个地址,以防故障出现在所采用分支的延迟槽中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么较长的管道会导致单个延迟槽不够用? 的相关文章

  • 无序执行会导致推测内存访问吗?

    当无序处理器遇到类似情况时 LOAD R1 0x1337 LOAD R2 R1 LOAD R3 0x42 假设所有访问都会导致缓存未命中 处理器是否可以在请求 R1 甚至 0x1337 的内容之前向内存控制器请求 0x42 的内容 如果是这
  • 第一个计算机程序是如何创建的? [复制]

    这个问题在这里已经有答案了 可能的重复 第一个编译器是如何编写的 https stackoverflow com questions 1653649 how was the first compiler written 这个问题一直困扰着我
  • 如何确定SSE预取指令大小?

    我正在使用包含 SSE 预取指令的内联汇编的代码 预处理器常量确定是否使用 32 64 或 128 字节预取的指令 该应用程序在多种平台上使用 到目前为止 我必须在每种情况下调查对于给定 CPU 来说哪一个是最佳选择 据我所知 这是缓存行大
  • 变址寻址方式和隐式寻址方式

    索引寻址模式通常用于访问数组 因为数组是连续存储的 我们有一个索引寄存器 它在每次迭代中都会递增 当添加到基地址时 它会给出数组元素地址 我不明白这种寻址模式的实际需要 为什么我们不能通过直接寻址来做到这一点 我们有了基地址 每次访问的时候
  • RAM 如何以 O(1) 的速度访问内存中的任何位置

    我们被告知 RAM 内存的抽象是一个长字节数组 对于 CPU 来说 访问它的任何部分都需要相同的时间 能够同时访问 4 GB 在我的计算机上 中的任何字节的设备是什么 因为这对我来说似乎不是一个微不足道的任务 我问过同事和我的教授 但没有人
  • 由谁决定 I/O 映射和内存映射 I/O (x86)

    在 x86 架构中 我们使用 I O 指令 例如 IN 和 OUT 来进行 I O 映射 I O 据我所知 我们在内存映射 I O 中使用 MOV 等内存指令 这一切都很好 但是谁决定使用哪种 I O 方法呢 如果我想构建自己的设备 外围设
  • 字寻址和字节寻址之间的区别

    有人可以解释一下有什么区别吗Word and Byte可寻址 它与内存大小等有何关系 A byte is a 记忆单元 https en wikiversity org wiki Memory Unit for storage A 存储芯片
  • 部署到 OS X 10.6 和“使用旧版运行时的平台不支持 -fobj-arc”

    背景 我正在为 OS X 构建一个应用程序 部署目标为 10 6 我还没有将我的应用程序完全转换为 ARC 但我添加了一些将从 ARC 中受益的新类 因此我设置了 fobj arc这些类的编译器标志 编译失败通用 32 64 位英特尔架构
  • MESI协议中的L3$角色是什么

    我想了解intel Broadwell中MESI的更多细节 假设一个cpu插槽有6个核心 core 0 到 core 5 他们每个人都有自己的 L1 和 L2 并共享 L3 共享内存中有一个var X x位于cache line 称为 XC
  • 全关联缓存是否比直接映射缓存具有更高的未命中率?

    以下是一个面试问题 为什么全关联缓存的未命中率可能高于直接映射缓存 我认为这根本不可能 有人可以分享一些对此的见解吗 你应该假设它们大小相同吗 如果不是 则如果大多数未命中是 容量 未命中 而不是冲突未命中 则较小的全关联高速缓存仍然可能会
  • 文件支持的内存映射的 CPU 缓存行为/策略?

    有谁知道哪种类型的CPU缓存行为或策略 例如不可缓存的写组合 被分配给内存映射文件支持现代 x86 系统上的区域 有什么方法可以检测是哪种情况 并可能覆盖默认行为吗 Windows 和 Linux 是人们感兴趣的主要操作系统 编者注 这个问
  • 计算三级缓存的实际/有效CPI

    a 给定一个具有两级高速缓存 L1 和 L2 的内存系统 以下是规格 L1缓存命中时间 2个时钟周期 一级缓存命中率 92 L2 缓存的未命中惩罚 L2 的命中时间 8 个时钟周期 二级缓存命中率 86 主存丢失惩罚 37 个时钟周期 暂时
  • gcc 优化标志 -O3 使代码比 -O2 慢

    我找到这个话题为什么处理排序数组比处理未排序数组更快 https stackoverflow com questions 11227809 why is processing a sorted array faster than an un
  • 长延迟指令

    I would like a long latency single uop x861 instruction in order to create long dependency chains as part of testing mic
  • 可以直接使用程序集访问缓存吗?

    就效率而言 缓存是一个核心问题 我知道缓存通常会自动发生 但是 我想自己控制缓存的使用 因为我认为我可以比一些不知道确切程序的启发式方法做得更好 因此 我需要汇编指令来直接移入或移出高速缓存单元 like movL1 address con
  • GCC最高指令集,兼容多种架构

    我正在由具有不同架构的机器组成的集群上运行作业 gcc march native Q help target grep march cut f3给了我其中之一 broadwell haswell ivybridge sandybridge
  • C 易失性变量和高速缓存

    缓存是由缓存硬件对处理器透明地控制的 因此如果我们在C程序中使用易失性变量 如何保证我的程序每次都从指定的实际内存地址读取数据而不是缓存 我的理解是 Volatile 关键字告诉编译器不应优化变量引用 而应按照代码中的编程方式读取变量引用
  • 字大小及其指示

    请参阅下面关于各种指令集架构中的字长以及它与汇编语言的关系的问题 感谢您提供的所有帮助 先说几个事实 如有错误 请指正 处理器架构的字长表示 编辑 其中一些是错误的 请参阅下面 Seva 的帖子 每个寄存器的最大尺寸 每个内存地址的最大尺寸
  • RISC-V 规范引用了“hart”一词 - “hart”是什么意思?

    我找到了参考文献hart在第 35 页RISC V 2 1 规范 https content riscv org wp content uploads 2016 06 riscv spec v2 1 pdf 但是 我找不到它的定义hart在
  • CPU缓存:两个地址之间的距离是否需要小于8字节才能具有缓存优势?

    这似乎是一个奇怪的问题 假设缓存行的大小为 64 字节 此外 假设 L1 L2 L3 具有相同的缓存行大小 this https stackoverflow com a 15333156 8385554帖子说英特尔酷睿 i7 就是这种情况

随机推荐