不采取分支预测中的无条件分支行为

问题描述 投票:0回答:1

我在nanoMips中有以下代码:

loop: lw $t1, A($t0)
lw $t2, B($t0)
sub $t3, $t1, $t2
beq $t3, $r0, else
sw $t2, A($t0)
b end

练习要求我在更大的代码中实现不采取分支预测,我的问题是当不满足beq条件并且我到达无条件跳转时,不采取分支预测是否也应用在这个分支中?

在这种情况下,预测总是错误的,因此会导致程序的性能出现问题,对吧?

mips cpu-architecture branch-prediction
1个回答
0
投票

CPU 应该只在还为时过早的情况下进行预测。 例如在解码条件分支之后,在获取寄存器操作数并比较它们之前。

无条件直接分支的目标在解码后立即已知,所以不,你不应该使用你已经知道是错误的不正确的“预测”。


无条件直接分支的预测是真实 CPU 中的事情,但仅在获取阶段的解码之前进行。 如果没有预测,提取阶段将在分支之后提取指令,因为解码阶段尚未对分支进行解码以找出我们应该提取的位置。 因此,由于无用的获取,管道中存在泡沫。
特别是在更长更宽的管道中,预测接下来要获取哪个 16 字节机器代码块非常有用,即在解码之前预测分支的“存在”。 慢速 jmp 指令展示了一个例子,说明在正确的预测下速度很快(在现代 x86 上),而当有太多 jmp 以至于 BTB(分支目标缓冲区)没有空间时速度很慢保留所有预测。

jr $a0

这样的无条件间接跳转也会在高性能CPU中被预测,你必须再次预测整个目标地址,而不仅仅是被采用/不被采用。 特别是在无序执行的情况下,寄存器值可能在很多周期内都不可用。

在简单的 MIPS 中,这是不需要的:寄存器值已经与查看 R 类型指令的操作码/功能字段并确定它是跳转的逻辑并行获取。

真正的MIPS经典RISC管道不需要任何分支预测

MIPS 有一个

分支延迟槽

:分支执行后的指令在控制转移到分支目标之前。 例如,由于在 EX 和 IF 中使用半周期的巧妙设计,这一延迟槽足以完全隐藏 MIPS R2000 / R3000 中的分支延迟。 请参阅 MIPS 如何在不停止的情况下处理上一条 ALU 指令的分支? 如果你正在学习的MIPS版本没有这个,那么它就是一个简化的MIPS什么的,而不是商业MIPS CPU实现的真正的MIPS ISA。

这对于教学来说很好,但你也可以学习 RISC-V,它没有分支延迟槽,但在很多方面很像 MIPS。 (RISC-V 的机器代码指令格式不像 MIPS 那么简单,旨在使立即数的硬件解码需要尽可能少的门,特别是为立即数的符号扩展保持关键路径尽可能短。)


直到后来出现更高性能的 MIPS CPU,分支预测才变得有用。 (分支延迟槽基本上成为一种不便;暴露了经典 5 级有序设计的管道细节,后来的 CPU 必须保持兼容,即使它们不是那样工作的。)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.