Pet*_*des 6 assembly pipeline mips cpu-architecture
addiu $6,$6,5
bltz $6,$L5
nop
...
$L5:
Run Code Online (Sandbox Code Playgroud)
除了缓存未命中,经典 MIPS 甚至无法做到这一点,而不会出现停顿,这如何安全?(MIPS 最初代表没有互锁流水线级的微处理器,并且有一个加载延迟槽而不是互锁。)
原始 MIPS I 是经典的 5 阶段 RISCIF ID EX MEM WB设计,通过在 ID 阶段及早检查分支条件,通过单个分支延迟槽隐藏其所有分支延迟(更正:这是错误,请阅读此答案;不要不要被基于这个错误前提的问题中的其他细节所误导)。这就是为什么它仅限于等于/不等于或符号位检查(如 lt 或 ge 零),而不是两个需要通过加法器进行进位传播的寄存器之间的 lt。
这是否意味着分支需要比 ALU 指令早一个周期准备好输入? 的bltz进入,所述同一周期ID阶段addiu进入EX。
MIPS I(又名 R2000)使用从 EX 输出到 EX 输入的旁路转发,因此普通整数 ALU 指令(如addu/链xor)具有单周期延迟并且可以在连续周期中运行。
MIPS 代表“没有互锁流水线阶段的微处理器”,因此它不检测 RAW 危害;代码必须避免它们。(因此,第一代 MIPS 上的加载延迟插槽,在这种情况下,MIPS II 添加了互锁以停止,使首字母缩略词:P 无效)。
但是我从来没有看到任何关于计算分支条件多条指令以避免停顿的讨论。(addiu/bltz 示例是由 MIPS gcc5.4-O3 -march=mips1 在Godbolt上发出的,它确实尊重加载延迟槽,nop如果需要,可以填充。)
它是否使用某种技巧,例如在时钟的下降沿读取 EX 输入,并且 ID 在上升沿之前不需要转发寄存器值?(随着 EX 足够早地产生结果以使其工作)
我想如果时钟速度的上限足够低以使缓存访问是单周期的,那将是有意义的。
MIPS 中的停顿或气泡声称负载结果上的lw+ abeq需要2 个停顿周期,因为它无法转发。这对于实际的 MIPS I 来说是不准确的(除非 gcc 有问题)。不过,它确实提到了半个时钟周期,允许在同一整个周期内写入一个值然后从寄存器文件中读取。
TL:DR: Classic MIPS I 检查 EX 前半周期的分支条件,因此转发到它们并不特殊。
\n\nIF只需要第二个半周期的地址,以便EX可以转发给它。
\n\n这些因素相结合,仅产生 1 个周期的分支延迟(被 1 个延迟槽隐藏),对于依赖于前一个 ALU 指令的分支来说没有问题。
\n\n在 MIPS I (R2000) 上运行sltu/beq绝对是安全的。这被列为扩展bgeu例如,在真正的 MIPS 手册和书籍中,
GCC 在实践中使用类似的序列,即使march=mips1尊重加载延迟槽和真实 MIPS R2000 的其他功能。
MIPS 的 IF 直到第二个半个时钟周期才需要地址,从而允许 EX 足够快地生成地址。
\n\n摘自参见 Dominic Sweetman 的 MIPS Run(涵盖 MIPS I 到 MIPS IV),第1.5.1 章指令约束
\n\n\n\n\n我们稍后会看到,高效的条件分支意味着是否分支的决定必须被压缩到只有一半的管道阶段;该架构通过保持分支决策测试非常简单来提供帮助。因此,条件分支(在 MIPS 中)测试单个寄存器的符号/零或一对寄存器的相等性。
\n
图1.3:管道和分支延迟显示了在 EX 的前半部分中计算的分支条件,并在 IF 的后半部分中使用,总分支延迟仅为 1 个周期/管道级 (ID)/指令。 IF 直到第二个半个时钟周期才真正开始。 (并继续进入 ID。ID 的实际解码/寄存器提取仅占用时钟周期的最后一部分。)
\n\n这与我在问题中建议的结果相同(在 ID 末尾检查分支条件),只不过它只需要 EX -> EX 转发来根据上一个 ALU 指令的结果进行分支。
\n\n也许我记错或误解了我之前读过的有关半周期分支决策的内容。这个半周期的事情很可能正是我记忆中看到的。
\n\n进一步引用参见MIPS Run 1.5.5 程序员可见的流水线效果
\n\n\n\n\n\xe2\x80\xa2 延迟分支:[第一段解释分支延迟槽]
\n\n如果硬件没有做任何特殊的事情,则是否分支的决定以及分支目标地址将及时出现在 ALU 管道阶段 \xe2\x80\x94 的末尾,以及时获取分支目标指令\n 不是下一条指令,而是两条。但是分支非常重要,\n 足以证明特殊处理的合理性,并且您可以从图 1.3 [如上所述]\n 中看到,通过 ALU 提供了一条特殊路径,以使分支地址提前半个时钟周期可用。加上指令获取阶段的奇数半时钟周期移位,这意味着分支目标可以及时获取成为下一个,因此硬件运行分支指令,然后运行分支延迟槽指令,然后是分支目标 \xe2\x80\x94,没有其他延迟。
\n\n... [不要浪费你的分支延迟槽]
\n\n... [如果安全的话,许多 MIPS 汇编器会为您重新排序指令,以隐藏分支延迟]
\n
请参阅 MIPS Run的序言,作者是 John L. Hennessy,\nMIPS Technologies 等公司的创始人。这并不能证明他签署了书中所有内容的准确性,但它很好地证明了这本书\关于 MIPS 如何管理此技巧的描述是准确的。
\n\n它很容易理解并且 100% 可信;我们已经知道数据缓存具有单周期获取延迟(在 EX 阶段的地址生成之后)。
\n| 归档时间: |
|
| 查看次数: |
787 次 |
| 最近记录: |