什么是流水线技术?它如何提高执行速度?

12

我认为如果有问题让你烦恼,那么没有任何问题是愚蠢的。我有一个关于管道流水线的问题。

什么是管道流水线?

理论上说:“使用流水线技术,CPU在第一条指令执行完成之前就开始执行第二条指令。 管道流水线 提高了处理速度,因为CPU不必等待一条指令完成整个机器周期。”

我的问题是,在单处理器系统中工作时,一次只能执行一个指令,那么当我的CPU处于忙碌状态时,如何同时操作获取下一个指令呢?如果我缺乏概念上的清晰性,请为我解释一下。如果有单独的硬件可以实现同时处理,那么这个硬件是什么?请详细说明。


7
这正是100年前亨利·福特所做的。在开始下一辆汽车(或指示)之前,无需等待一辆汽车(或指示)完成。 - Bo Persson
我很惊讶没有人提到,但是流水线技术可以提高吞吐量,从而实现更好的IPC和性能。 - Nubcake
5个回答

12
流水线技术与单处理器和多处理器系统无关,它与在硬件上执行单个指令时考虑的步骤有关。假设你想要实现MIPS "add-immediate"(加立即数)指令addi $d, $s, $t,该指令将存储在由$s命名的寄存器中的整数与直接编码在指令中的整数$t相加,并将结果存储在由$t命名的寄存器中。想一想需要执行哪些步骤才能完成这个任务。下面是一种分解方式(仅供参考,不一定对应真实的硬件):
  1. 解析(二进制编码的)指令以找出它是哪种指令。
  2. 一旦识别出它是一个addi指令,解析源寄存器、目标寄存器和要添加的整数。
  3. 读取适当的寄存器,并计算其值和立即整数的总和。
  4. 将结果写入命名的结果寄存器中。
现在请记住,所有这些都需要在硬件中构建,这意味着每个事物都有与之相关联的物理电路。如果您一次执行一个指令,那么四分之三的这些电路将一直闲置,无所事事。流水线技术利用了这一观察结果:如果处理器需要连续执行两个addi指令,则可以:
  1. 识别第一个指令
  2. 解析第一个指令,并使用本来就会空闲的电路识别第二个指令
  3. 添加第一个指令并解析第二个指令
  4. 写出第一个指令并添加第二个指令
  5. 写出第二个指令
因此,即使每个指令需要4个处理回合,处理器也在仅5个回合内完成了两个指令。
由于有时必须等待一条指令完成才能知道下一条指令要做什么(甚至是下一条指令是什么),所以这变得更加复杂,但这就是基本思想。

还有一件事。通过流水线处理,功能单元(获取/解码/执行/写回)之间的独立性更强了。因此,这些单元本身可以比整个块更紧凑。这使得时钟速度更高,因为硬件传播延迟降低了(电子需要时间穿过硅并切换晶体管)。 - Nico Erfurth

10

确实有专门用于获取指令的硬件。这里有一整套分离的硬件,排列成一个流水线。每个部分同时执行一个独立指令的一部分。在每个时钟边沿,一个阶段的结果传递到下一个阶段。


谢谢。我想更清楚地了解它是如何发生的?任何有用的链接都可以真正帮助。 - Sandeep
1
@happy2Help:也许像这样?http://en.wikipedia.org/wiki/Classic_RISC_pipeline - Oliver Charlesworth

5

我仍然记得大学时候的第二版,预测x86即将迎来热死亡。无论如何,这是一本优秀的书。 - Brett Hale
事实证明,我在课堂上真正使用的书不是Hennessy和Patterson的,而是Patterson和Hennessy的《计算机组成与设计:硬件/软件接口》,第二版。http://www.amazon.com/Computer-Organization-Design-Fourth-Architecture/dp/0123744938这太令人困惑了! - Crashworks
我能直接阅读第五版,还是必须先阅读之前的版本?我问这个问题是为了能够相应地购买这本书。请回复。 - Sandeep
@happy2Help 你可以从当前版本开始阅读;以前的版本只是同一本书的旧版。毕竟,作者必须更新教材,以跟上新的计算机技术!同样的作者还有另一本涵盖大部分相同主题但风格不同的教材:http://www.amazon.com/Computer-Organization-Design-Fourth-Architecture/dp/0123744938你可以看看两本书,找出哪本更适合你。 "硬件/软件"接口是我在课堂上真正使用的书。 - Crashworks
嘿,谢谢。我从网上阅读了CA的第一章节。我觉得它非常好,于是我订购了这本书。我会读完后再告诉你我的感受。感谢你推荐这本好书。 - Sandeep

3
想象一下那些"How its made"或其他电视节目,你能看到工厂的生产过程。想象一下汽车工厂的制造过程。在汽车工厂中,“汽车”从一个车架或车身开始,并随着移动逐渐增加各种零部件。如果你坐在工厂外面,你会看到轮胎、油漆桶、电线卷和钢材被运进工厂,而一辆辆汽车源源不断地出去。即使是单个(单处理器)工厂,也不意味着它不能有装配线(流水线)。带有管道的单处理器不一定像工厂里的汽车一样一辆一辆地建造,同样的,你程序的执行也是在流水线上的每个站点逐步完成一点。
管道中典型的简单阶段包括获取(fetch)、解码(decode)和执行(execute)三个阶段。执行一条指令最少需要三个时钟周期 (通常由于输入/输出速度慢,需要更多的时钟周期),假设在管道中有三个阶段。当执行阶段处于执行指令a时,你同时可以在解码阶段进行指令b的解码以及在获取阶段获取指令c。回到汽车工厂,他们可能每7分钟生产出“一辆汽车”,这并不意味着制造一辆汽车需要7分钟,可能需要一周的时间来制造一辆汽车,但他们每7分钟启动一个新的汽车并且在每个站点的平均时间是可以让你每七分钟制造出一辆汽车。同样,在这里,使用流水线并不意味着你可以以处理器的时钟速率获取(fetch)、解码(decode)和执行(execute)这三个步骤。就像工厂一样,这更多地是一个平均值问题。如果你能以处理器时钟速率喂给管道中的每个阶段,那么它将在每个时钟周期内完成一条指令(如果设计为这样做)。现在的情况是你不能以这么快的速度提供数据/指令,会出现流水线停顿等问题,导致你必须重新开始或放弃一些进展并回退一些步骤。
流水线技术就是采用装配线的方法来执行处理器中的指令。

0

我认为这是在代码中存在分支时使用的,逻辑预测将采取哪个分支,并将该分支的指令预加载到缓存中。如果预测被证明是错误的,则需要放弃这些指令并加载备用指令,导致损失。但我相信代码中有模式,使得预测通常是正确的,特别是现代编译器反复重复模式。

我对实际实现不是很了解,但我并不认为一定需要额外的硬件,尽管它对于最佳速度非常有用。


3
不,那只是分支预测。虽然它在概念上与流水线的一部分相似(在到达某些指令之前执行内存访问),但在我看来,这是一个完全不同的东西。 - user395760
是的,这是一些不同的东西。 - Oliver Charlesworth
我查了一下,并在此处找到了一个(太简单?)的动画:http://www-cs-faculty.stanford.edu/~eroberts/courses/soco/projects/2000-01/risc/pipelining/pipelining1.mov。但我在想……这种技术只用于RISC处理器吗,还是只是起源于那里? - Marty Fried
1
@Marty:当处理器执行分支时,它将使用紧随其后的指令填充其流水线。因此,如果采用分支,流水线中的所有内容都无法使用,处理器必须放弃所有内容并开始在分支目标处加载指令。因此,分支预测是处理器尝试猜测分支后要执行哪个指令,以便它不必清空其流水线。而且,你很难找到今天不使用流水线的处理器。 - indiv
谢谢;我想我在硬件理论方面有些落后了。仅仅跟上新的编程技术就已经很困难了。早在我刚开始工作的时候,我掌握了硬件知识,这也许就是为什么之后就一蹶不振了 :) 不过,8080处理器就简单多了! - Marty Fried

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接