tl; dr
较短的流水线意味着更快的时钟速度,但可能会降低吞吐量。另外,请参阅底部的答案2和3(我保证它们很短)。
较长版本:
这里有几件事情要考虑:
- 并非所有指令都花相同的时间
- 并非所有指令都取决于立即执行的操作(甚至十个或二十个)
一个非常简化的流程(现代英特尔芯片中发生的事情非常复杂)具有以下几个阶段:
获取->解码->内存访问->执行->写回->程序计数器更新
每次->都会产生时间成本。此外,每个滴答声(一个时钟周期),所有内容都会从一个阶段移动到下一个阶段,因此,最慢的阶段将成为所有阶段的速度(实际上,它们的长度要尽可能长才行)。
假设您有5条指令,并且想要执行它们(图片摘自Wikipedia,此处PC更新尚未完成)。它看起来像这样:
即使每条指令需要5个时钟周期来完成,一条完成的指令也会在每个周期中从管道中出来。如果每级花费的时间是40 ns,中间位花费的时间是15 ns(使用上面的我的六级流水线),则需要40 * 6 + 5 * 15 = 315 ns才能得到第一条指令。
相反,如果我要完全消除流水线(但保持其他所有条件不变),则仅用240 ns即可得出第一条指令。(这种获取“第一条”指令的速度差异称为等待时间。通常它不如吞吐量(每秒的指令数量)重要。
但是,真正的不同是,在流水线示例中,每60 ns我会执行一次新的指令(在第一个指令之后)。在非流水线中,每次花费240。这表明管道擅长提高吞吐量。
更进一步,似乎在内存访问阶段,我将需要一个加法单元(进行地址计算)。这意味着,如果有一条指令不使用该循环的mem阶段,那么我可以再做一次添加。因此,我可以在一个滴答声中在一个处理器上完成两个执行阶段(其中一个处于内存访问阶段)(调度是一场噩梦,但我们不要去那里了。此外,PC更新阶段还需要在其中添加一个单元) (如果是跳跃的话,那么我可以在一跳内执行三个加法执行状态)。通过具有管道,可以将其设计为使得两个(或更多)指令可以使用不同的阶段(或jumpfog阶段等),从而节省了宝贵的时间。
请注意,为了做到这一点,处理器会做很多“魔术”(乱序执行,分支预测等等),但这允许多条指令的发布比没有管道的情况更快(请注意,管道也是如此)长期管理非常困难,仅在阶段之间等待就需要支付更高的费用)。不利的一面是,如果使流水线过长,则会获得疯狂的时钟速度,但会失去许多原始的好处(拥有可以在多个地方同时使用的相同类型的逻辑,并且可以同时使用) )。
答案2:
SIMD(单指令多数据)处理器(与大多数GPU一样)在许多信息位上进行了大量工作,但是它们花费的时间更长。读取所有值需要更长的时间(这意味着时钟会变慢,尽管这在一定程度上具有更宽的总线可以抵消),但是您一次可以完成更多的指令(每个周期更有效的指令)。
答案3:
因为您可以“欺骗”人为地延长周期数,因此每个周期可以执行两条指令(只需将时钟速度减半)。也可以每两个滴答滴答地做一次而不是一个滴答滴答(给出2倍的时钟速度,但是每秒不改变指令)。