为什么加速会随着管道级数的增加而减少



我正在看一个关于链接处流水线的视频教程。

在时间4:30,讲师说,随着阶段数量的增加,我们还需要添加流水线寄存器,这会产生开销,并且由于这种加速不能随着阶段数量增加而增加到超过最佳值。

有人能详细说明一下吗?我的怀疑是,流水线寄存器可能会给单个阶段的周期时间增加一些延迟,那么为什么当阶段的数量与少数阶段相比很大时,它会成为一个问题呢?

谢谢。

锁存器本身确实有一个小延迟(它们毕竟是在"工作",即切换)。就其本身而言,这只会产生一种接近固定峰值性能值的渐近方法。例如,从等于锁存器延迟的每个阶段的(已经不切实际的)微小实际工作时间开始,管道深度的加倍(不包括其他现实世界的限制)将减少到锁存器的循环时间加上1/2锁存器延时(将时钟速度增加略高于33%),但再次加倍管道深度只会减少到锁闩器的周期时间加上1/4锁存器时延。

即使在无限数量的流水线阶段,每个阶段(不知何故)都做无穷小的功,最小循环时间也将等于一个锁存延迟,相对于锁存延迟等于实际工作时间的流水线深度,时钟速度将加倍。在稍微实际的层面上,实际工作的一个晶体管开关延迟是一个相对困难的约束。

但是在锁存延迟本身阻止进一步改进之前,其他现实因素限制了增加管道深度的好处。

在更物理的层面上,排除面积和功率/热密度的限制,在如此高的时钟速度下,让时钟信号在整个设计中以非常高的精度均匀转换是一项挑战。当工作时间中吸收变化的裕度较小时,时钟偏斜和抖动变得更加显著。(这甚至不包括制造或温度等环境条件的变化。)

除了这些更多的物理约束之外,依赖性约束往往会阻止更深层次的管道提高性能。虽然控制相关性(例如,分支的条件评估)通常可以通过预测来隐藏,正如Gabe在回答中指出的那样,分支预测失误可能需要管道刷新。即使在99%的预测准确率和每十条指令一个分支(95%和每五条指令一次分支的可能性更大)下,千级分支分辨率延迟(即,排除分支分辨率后的阶段,并假设分支目标不晚于分支方向可用)也意味着一半的性能是由分支预测失误造成的。

指令缓存未命中也是一个问题。如果有一个完美的控制流预测,可以使用预取来隐藏延迟。这实际上成为分支预测问题的一部分。此外,请注意,增加缓存大小以降低未命中率(或增加分支预测器大小以降低预测失误率)会增加访问延迟(管道阶段计数)。

数据值依赖关系更难处理。如果执行需要两个周期,那么具有数据依赖性的两个顺序指令将无法背靠背执行。虽然从理论上讲,价值预测在某些情况下会有所帮助,但在相对有限的情况下最有帮助。一些操作也可以是宽度流水线操作(例如,加法、减法、逐位逻辑操作和左移位)。然而,这种伎俩是有限度的。

数据缓存未命中成为此数据依赖性问题的一部分。数据存储器地址往往比指令地址更难预测。

这个谷歌学者搜索提供了一些关于这个主题的更详细(和技术)的阅读。

如果不看长达一小时的视频,我会说,当有大量阶段时,实际问题是管道停滞更严重。如果您有一个14阶段的管道,并且预测错误了一个分支,那么在发出另一条指令之前,您必须再次填充这14个阶段。

相关内容

  • 没有找到相关文章

最新更新