cpu - 为什么分支延迟槽被弃用或过时?
问题描述
当我阅读 RISC-V 用户级 ISA 手册时,我注意到它说“OpenRISC 有条件代码和分支延迟槽,这会使更高性能的实现变得复杂”。所以 RISC-V 没有分支延迟槽RISC-V 用户级 ISA 手动链接。此外,维基百科说大多数较新的 RISC 设计都省略了分支延迟槽。为什么大多数较新的 RISC 架构逐渐省略分支延迟槽?
解决方案
引用 Henessy 和 Patterson(计算机体系结构和设计,第 5 版)
谬误:你可以设计一个完美的架构。
所有架构设计都涉及在一组硬件和软件技术的背景下进行的权衡。随着时间的推移,这些技术可能会发生变化,而在做出这些决定时可能是正确的决定看起来像是错误的。(...) RISC 阵营中的一个例子是延迟分支。用五级流水线控制流水线危害是一件简单的事情,但对于每个时钟周期发出多条指令的较长流水线的处理器来说,这是一个挑战。
实际上,就软件而言,延迟分支只有缺点,因为它使程序更难阅读并且效率更低,因为插槽经常被 nop 填充。
在硬件方面,这是一个在八十年代有一定意义的技术决策,当时流水线是 5 或 6 个阶段,无法避免单周期分支惩罚。
但目前,管道要复杂得多。在最近的 pentium μarchitectures 上,分支惩罚是 15-25 个周期。因此,一条指令延迟分支是无用的,尝试用 15 条指令延迟分支隐藏这个延迟槽是无稽之谈,显然不可能(这会破坏指令集的兼容性)。
我们开发了新技术。分支预测是一项非常成熟的技术。使用当前的分支预测器,错误预测远低于具有无用 ( nop
) 延迟槽的分支数量,因此即使在 6 周期计算机(如 nios-f)上也更有效。
因此延迟分支在硬件和软件方面的效率较低。没有理由保留它们。
推荐阅读
- javascript - 尝试将数据写入控制台时 Firebase 抛出错误
- javascript - 如何在 React 中定位单个 map()'d 元素?
- visual-studio-code - Visual Studio 代码左侧的面板消失了
- r - 从R中的行制作列联表
- matlab - MATLAB CREATE DLL:命令“链接”以返回值“1”退出
- java - JFormattedTextField 仅返回默认值
- azure - Azure 的新用户:访问查询编辑器
- javascript - Firebase 云功能无法部署
- java - 修复了 Android 许可证状态 Unknown.flutter 安装
- error-handling - 如何捕获空目录属性变量错误 8000500D 的错误