TIP

流水线执行方式对比的是串行执行方式,串行执行方式比较简单,一个指令执行完下一个指令才可以执行,流水线执行方式有点颠覆我以前的想法。

首先先来看一道题吧。

# 例题1

若每一条指令都可以分解为取指、分析和执行三步。已知取指时间t取指=4Δt,分析时间t分析=3Δt,执行时间t执行=5Δt。如果按串行方式执行,执行完100条指令需要___Δt。如果按照流水方式执行,执行完100条指令需要___Δt。

串行执行方式都不需要多说,执行一条指令需要花12Δt,那么执行100条则需要1200Δt。

那么流水线方式呢?我以前做法就是,第一条指令完成取指,就可以运行第二条指令的取指······,直到运行到第100条指令,取指所需要花的时间为4Δt,每条指令只需要完成取指就行了,只要最后一条指令完成,其他指令一定也会完成的,所以所需要花的时间就是400Δt+3Δt+5Δt=408Δt,但是一看答案却不是这样的,而是507Δt,百思不得其解。

再来好好理一理思路。

t[1]取指
t[1]取指
t[1]分析
t[1]分析
t[2]取指
t[2]取指
t[1]执行
t[1]执行
t[2]分析
t[2]分析
t[3]取指
t[3]取指
t[2]执行
t[2]执行
t[3]分析
t[3]分析
······
······
t[3]执行
t[3]执行
······
······
t[n-1]取指
t[n-1]取指
······
······
t[n-1]分析
t[n-1]分析
t[n]取指
t[n]取指
t[n-1]执行
t[n-1]执行
t[n]分析
t[n]分析
t[n]执行
t[n]执行
Viewer does not support full SVG 1.1

由这个表格可以看清楚,t[1]完成取指,接着t[2],一直到t[n],可以看到最后执行的指令就是t[n],只要t[n]完成,所有的指令都会完成,好像我的想法没问题啊。

但是这次真的是想错了,每一列是作为一个整体完成的,也就是说,这一列的指令可以并行,完成的时间以这一列指令中,消耗时间最长的为准。起初看到类似这个图我仍不明白是什么意思,最后看到是每一列的指令步骤都要完成才能进入下一列,才知道这个公式咋来的。

这时候就会由一个公式:

TIP

T=t取指+max(t分析,t取指)+(n-2)*max(t取指,t分析,t执行)+max(t执行,t分析)+t执行

那么就按照这个公式来算吧。

4Δt+4Δt+5Δt*98+5Δt+5Δt = 508Δt

不对啊,这个算出来的也不是507Δt啊,难道还有一些地方没有注意到?怀着疑问,我又从网上找到了一道类似的题。

# 例题2

若每一条指令都可以分解为取指、分析和执行三步。已知取指时间t取指=5Δt,分析时间t分析=2Δt,执行时间t执行=5Δt。如果按顺序方式从头到尾执行完500条指令需___Δt。如果按照[执行]k、[分析]k+1 、[取指]k+2重叠的流水线方式执行指令,从头到尾执行完500条指令需___Δt。

这两道题可以说是同一道题,只是改变了以下数字。

串行执行需要时间500*12Δt=6000Δt

流水线执行需要时间5Δt+5Δt+498*5Δt+5Δt+5Δt=2510Δt

这个是没有问题的,可以和答案对的上。证明这个想法是对的。

我又从网上找啊找,找到了原题,但是我很失望,答案都是507Δt,更可笑是百度文库,明明计算结果是508Δt,但是答案却选一个507Δt。这个是百度文库的这道原题地址点我 (opens new window)

所以,书上再一次出错了,可怕的是竟然还有解释和运算步骤,不知道咋算的。这本书虽然是清华出版的,但是质量确实不高,什么缺图的,答案是错的,符号打印错的,不算多,也不算少,尤其是涉及的比较广,有的知识点还是头一次见,书上怎么说就怎么遵守,总体上对的肯定比错的几率大很多。

# 再论

我发现这两道例题不一样了。这道题,书上答案应该没有错。

好心累啊,搞不懂那多出来的一个周期是怎么来的。第一个参考链接还画有图,解释它们之间的区别,看不懂。要我自己想的就是,每条指令取指完之后就不用管了,再加上最后一条指令的分析和执行的时间,就是执行的总时间,这样算如果例题2不是特殊的重叠,算的时间也对,可能以前能算对也只是个巧合,把公式记下来算了。

这两道题是两种不同的流水线执行方式。

例题1,是最省时的执行方式。

TIP

T=t取指+t分析+(n-1)*max(t取指,t分析,t执行)+t执行

例题2,步骤重叠。

TIP

T=t取指+max(t分析,t取指)+(n-2)*max(t取指,t分析,t执行)+max(t执行,t分析)+t执行

# 参考链接

流水线指令执行 (opens new window)

流水线指令运行的总时间计算 (opens new window)