【问题标题】:How to find the execution time for a pipelined machine? [closed]如何找到流水线机器的执行时间? [关闭]
【发布时间】:2026-01-08 16:00:01
【问题描述】:

我们正在一台机器上执行以下指令

如果机器是流水线的,大约需要 200 ps * 3 = 600 ps。

如果流水线机器运行 1,000,003 条指令,我想知道执行时间是多少?是 1,000,000 * 200 ps + 600 ps?

【问题讨论】:

  • @Yvette 不,IMO,这在很大程度上是一个计算机工程、计算机体系结构、计算机编程问题。任何做 mips asm 的人都想规划管道以获得最大性能。

标签: mips computer-science cpu-architecture instructions pipelining


【解决方案1】:

该图适用于经典的 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 / 4250,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。

我认为 prof 的分析假设 L1 的 T1 for loop 2 可以与 L4 的 T2 for loop 1 同时开始。

一个有用的序列示例可能是具有重叠源/目标的memmove 序列[寄存器已经预设]:

L1:     lw      $t0,4($t1)
L2:     sw      $t0,0($t1)
L3:     addu    $t1,$t1,$t2
L4:     bne     $t1,$t3,L1

再次,这假设 没有个分支延迟槽。为了使这项工作他们只需附加一个nop,序列将是L1, L2, L4, L3

但是,我只是重读了细则:这个计算假设多路复用器、控制单元、PC 访问和符号扩展单元没有延迟。

所以,这可能是为什么存在/曾经存在差异的关键。再次重申,如有疑问,请相信您的教授。

【讨论】:

  • 但是我的教授告诉我答案是 1,000,000 * 200 ps + 1400 ps
  • 每 200ps 一条指令,但最后一条完成。最后一条指令仍然需要在最后运行 4 个阶段,这又增加了 4 个周期。所以 10^6*200ps+3*200ps (3 inst) + 4*200 ps (最后一条指令的管道消耗) = 10^6*200ps+7*200ps = 10^6*200ps+1400ps
最近更新 更多