计算机中的流水线技术到底是个啥?

作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:

https://github.com/sunshinelyz/mykit-delay

PS: 欢迎各位Star源码,也可以pr你牛逼哄哄的代码。

写在前面

流水线技术是计算机中的一种相当重要的技术。简单的说,流水线技术的出现使得计算机能够支持并行计算,能够并行执行任务。尽管流水线技术非常重要,但是很多小伙伴对流水线技术还是一知半解,甚至很多小伙伴根本不知道什么是流水线技术,今天,我们就一起来说说什么是流水线技术。

文章已收录到:

https://github.com/sunshinelyz/technology-binghe

https://gitee.com/binghe001/technology-binghe

流水线概念

流水线是指在程序执行时,多条指令重叠进行操作的一种准并行处理的实现技术。各种部件同时处理是针对不同指令而言的,它们同时为多条指令的不同部分进行工作,以提高各部件的利用率和指令的平均执行速度。

流水线的相关参数计算包括:流水线执行时间计算、流水线吞吐率、流水线加速比、流水线效率。

在计算机中,对于指令的操作主要分为三个部分:取指、分析和执行。如下所示。

如果执行取值、分析和执行各需要1ms的话,则串行执行三条指令的时间总共需要9ms。这是因为一条执行的操作需要经过取指、分析和执行三个步骤,每个步骤需要1ms,执行一条指令的时间为3ms,则串行执行三条指令的时间为9ms。我们可以用下图来表示这个过程。

在上图的表示中,貌似执行三条指令使用9ms是没啥问题的。但是,如果我们把图形改造一下,我们就会发现相应的问题。我们使用下面的图形来表示执行三条指令的情况。

此时,我们发现,在上图执行指令操作的过程中,有很多空白的格子,而空白的格子表示在执行执行的过程中有空余的时间片资源没有利用起来。很显然,没有必要等待指令1完全执行完毕后再执行指令2,同样的,没有必要等待指令2完全执行完毕后再执行指令3。而且,我们发现按照上图执行完三条指令需要9ms时间。

此时,如果将空余的时间片利用起来,则可以使用下图来表示。

此时,在执行三条指令的过程中,取指操作对指令1执行完取指后,马上对指令2进行取指,然后又马上对指令3进行取指;分析操作同样是对指令1执行完分析后,马上对指令2进行分析,然后又马上对指令3进行分析;执行操作也是对指令1执行完毕后,马上对指令2进行执行操作,然后又马上对指令3进行执行操作。期间,将空余的时间片资源充分的利用起来了。而且,我们发现,充分利用空余的时间片后,执行三条指令的时间由原来的9ms变为现在的5ms。

从另一个角度,我们发现执行完第一条指令时,需要3ms,执行完第二条指令时,只需要在执行完第一条指令的基础上增加1ms。同样的,执行完第三条指令时,只需要在执行完第二条指令的基础上增加1ms。以后每增加一条指令,只需要增加1ms的时间便可以执行完此条指令。

这就是计算机中的流水线技术。接下来,我们就说说流水线技术的相关计算问题。

流水线计算

关于流水线计算,我们先来看一个图。

在上图中,我们可以看出,执行完第一条指令时,需要3ms时间,执行完第二条指令时,只需要在执行完第一条指令的基础上增加1ms;执行完第三条指令时,只需要在执行完第二条指令的基础上增加1ms。以此类推,执行完第n条指令时,只需要在执行第n-1条指令的基础上增加1ms。说到这里,不知道小伙伴们有没有思考这样一个问题,流水线技术的这种规律就涉及到一个非常重要的概念,叫作 流水线周期

流水线周期为执行时间最长的一段,上图中的流水线周期为1ms

流水线的计算公式为:

代码语言:javascript
复制
1条指令执行时间 + (指令条数 -1)*  流水线周期

流水线的理论公式如下所示。

代码语言:javascript
复制
(t1 + t2 + ... + tk) + (n-1) * △t

其中t1,t2...tk表示执行一条指令的每个步骤分别需要的时间,n为指令的条数,△t为流水线周期。

流水线的实践公式如下所示。

代码语言:javascript
复制
k*△t + (n-1) * △t

其中,k为执行一条指令的步骤数,n为指令的条数,△t为流水线周期。

这里,给小伙伴们举一个例子。

例如,一条执行的执行过程可以分解为取指,分析和执行三步,在取指时间t取指=3△t,分析时间分析=2△t,执行时间t执行=4△t的情况下,若按照串行方式执行,则10条指令全部执行完需要多少△t?若按照流水线方式执行,流水线周期为多少△t?使用流水线方式时,执行完10条指令需要多少△t?

(1)串行方式比较简单,就是将每条指令的执行时间进行累加。

(3△t + 2△t + 4△t) * 10 = 90△t。

(2)在执行一条指令的过程中,取指为3△t,分析为2△t,执行为4△t。根据流水线中对于流水线周期的定义:流水线周期为执行时间最长的一段,所以,流水线周期为4△t。

(3)使用流水线方式时,执行完10条指令需要的时间可以使用如下方式进行计算。

这里,我们分别计算下理论时间和实践时间。

  • 理论时间

(3△t + 2△t + 4△t) + (10-1) * 4△t = 45△t。

  • 实践时间

3 * 4△t + (10-1) * 4△t = 48△t。

超标量流水线

关于超标量流水线,我们可以使用下图来表示。

在超标量流水线中,有一个概念叫作度。度表示在超标量流水线中,由几条流水线组成。例如上面的图中,超标量流水线由两条流水线组成,所以,度为2。此时的超标量流水线可以同时进行2个操作。也就是说,可以同时执行两个取指操作,可以同时执行两个分析操作,也可以同时执行两个执行操作。

如果此时有10条指令需要执行,使用以上超标量流水线的话,只需要10 / 2 = 5 条指令的时间。

流水线吞吐率计算

流水线的吞吐率(TP)是指在单位时间内流水线所完成的任务数量或输出的结果数量。计算流水线吞吐流程的最基本的公式如下所示。

流水线最大吞吐率计算公式如下所示。

流水线的吞吐率计算问题相对来说还是比较简单的。

好了,今天就到这儿吧,我是冰河,大家有啥问题可以在下方留言