我们正在一台机器上执行以下指令
如果机器是流水线的,大约需要 200 ps * 3 = 600 ps。
如果流水线机器运行 1,000,003 条指令,我想知道执行时间是多少?是 1,000,000 * 200 ps + 600 ps 吗?
我们正在一台机器上执行以下指令
如果机器是流水线的,大约需要 200 ps * 3 = 600 ps。
如果流水线机器运行 1,000,003 条指令,我想知道执行时间是多少?是 1,000,000 * 200 ps + 600 ps 吗?
该图适用于经典的 5 级 MIPS 流水线架构。现代芯片使用超标量设计,但让我们忽略这一点[至少目前]。
这里的问题是该图显示了各种类型指令的时间[对于每个 T 状态 T1-T5],但是没有示例程序可以执行,除非该图也是循环的示例。如果是这种情况,请继续...
另一个问题是管道“危险”。也就是说,特定指令的特定阶段(T 状态)必须“停止”,因为它取决于先前指令的输出。例如:
L1: add $t1,$t2,$t3
L2: add $t6,$t4,$t1
第二条指令必须停止其“寄存器读取”(T2),因为它必须等待前一条指令的“寄存器写入”(T5)阶段完成[因为它需要 的最终值$t1
]。
所以,而不是一个表现良好的管道,如:
1: L1:T1
2: L1:T2 L2:T1
3: L1:T3 L2:T2
4: L1:T4 L2:T3
5: L1:T5 L2:T4
6: L2:T5
我们最终得到:
1: L1:T1
2: L1:T2 L2:T1
3: L1:T3 L2:stall
4: L1:T4 L2:stall
5: L1:T5 L2:stall
6: L2:T2
7: L2:T3
8: L2:T4
9: L2:T5
在现代实现中,有一些架构技术可以避免这种情况(例如“转发”、无序执行),但我们必须知道特定的架构实现才能知道它必须使用哪些工具来缓解风险。
我最好的猜测如下......
再一次,如果我们忽略危险,我们需要一个特定的程序/序列来进行计算。
如果我们假设程序是图表,对于 1,000,000 条指令,它的循环迭代次数是1,000,000 / 4
或250,000
。而且......我们也忽略了分支延迟槽。
一个循环迭代的时序图如下所示:
label inst start exec end
time time time
----- ---- ----- ---- ----
L1: lw 0 800 800
L2: sw 200 700 900
L3: R 400 600 1000
L4: beq 600 500 1100
请注意,所有指令都在 L4 之前完成。因此,主导时间是 L4 的结束时间。因此,250,000 * 1100 ps
或多或少是 275 我们。
更新:
但我的教授告诉我答案是 1,000,000 * 200 ps + 1400 ps
好吧,你应该[显然;-)]相信你的教授而不是我[我确实强调“猜测”]。
但是,同样,我们必须知道实现:分支预测等。我假设第二个循环上的 L1 直到循环 1 上的 L4 完成后才能开始。
如果循环/序列完全展开[并且没有分支],例如重复lw, sw, R, R
250,000 次,则为1,000,000 * 200 ps
IMO。
我认为教授的分析假设循环 2 的 L1 的 T1 可以与循环 1 的 L4 的 T2 同时开始。
一个有用的序列示例可以是memmove
具有重叠源/目标的序列[寄存器已经预设]:
L1: lw $t0,4($t1)
L2: sw $t0,0($t1)
L3: addu $t1,$t1,$t2
L4: bne $t1,$t3,L1
同样,这假设没有分支延迟时隙。为了使它们与它们一起工作而不仅仅是附加 a nop
,序列将是L1, L2, L4, L3
但是,我只是重读了细则:这个计算假设多路复用器、控制单元、PC 访问和符号扩展单元没有延迟。
因此,这可能是为什么存在/曾经存在差异的关键。再一次,当有疑问时,相信你的教授。