考虑以下说明:
addi $t0, $zero, 15
mystery:
addi $t0, $t0, -5
bne $t0, $zero, mystery
boo:
addi $t0, $t0, 5
beq $t0, $zero, boo
lw $t0, 4($t1)
上述MIPS指令由5级流水线数据路径执行,具有转发、未采取的分支预测和决策转移到 ID阶段。
我在实践中遇到了这个问题,但我仍然没有完全理解它。如何找到时钟周期中所需的停顿量。
我得到的指令总数为 10,理想管道为 14,但我不明白停止的完整概念,任何帮助将不胜感激
我此时一直在吐痰,我尝试在分支机构操作中拖延,但我似乎无法掌握拖延的概念。
对于有条件的分支,已采取的分支和未采取的分支有不同的档位要求。
因此,您需要确定在完整的代码执行中有多少个采用的分支与未采用的分支。
并且只有 2 个已采用的分支(在
mystery
循环中向后运行 3 次,意味着向后跳转两次),否则有 2 个未采用的分支,一个退出每个循环。
未采取的分支被称为“预测”。 虽然不是很复杂,但信息量很大,它只是意味着处理器只是假设分支没有被采用就继续前进,即好像它甚至不是分支指令,例如就好像它是一个
nop
。 如果“预测”正确,它将全速运行。
但是,对于已采用的分支,它必须使预测的未采用路径上的任何工作无效,因为该路径对于程序来说是不正确的。 这意味着它将丢失在错误路径上放入这些指令中的任何周期。
此外,对于采取的分支,存在数据危险。 由于在您的代码片段中,两个分支指令都遭受原始数据危险,因此理解这一点将告诉您沿着错误的路径消耗了多少指令,例如有多少浪费的周期将不得不被丢弃,这些将被称为停顿。
addi
的EX阶段完成后,立即知道addi
的结果。
而分支指令据说可以在其ID阶段判断其预测是否正确,然后决定是全速继续还是取消错误预测的未采取的代码路径。
但是,分支指令的 ID 阶段(更愿意做出采取/不采取的决定)与先前
addi
指令的 EX 阶段重叠,因此分支预测的实际确定根本不可能发生在在 addi
的 EX 期间,因此必须在 addi
的 EX 之后的循环中发生。
看这三个说明:
mystery:
addi $t0, $t0, -5
bne $t0, $zero, mystery
boo:
addi $t0, $t0, 5
beq $t0, $zero, boo
循环 | 如果 | 身份证 | EX | 内存 | WB |
---|---|---|---|---|---|
1 | 阿迪-5 | ||||
2 | bne | 阿迪-5 | |||
3 | 阿迪+5 | bne | 阿迪-5 | ||
4 | beq | 阿迪+5 | bne | 阿迪-5 |
我们可以看到,由于
bne
上紧接的前一条指令存在 RAW 危险,$t0
无法做出最终决定,因此它必须等到 bne
位于 EX 本身中,即一个周期后。
因此,沿着错误预测的未采取路径的两条指令已被输入到管道中,并且它们都必须被取消。 重定向必须取消这些指令(在不正确的路径上)并将下一个 PC 重置到正确的(已采取的)分支目标。 这将发生在周期 4 中,因此到周期 5 时,处理器应该处于正确的代码路径上,丢失了 2 个周期,我们可以将其称为停顿。