0

我正在链接上观看有关流水线的视频教程。

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

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

谢谢。

4

2 回答 2

4

锁存器本身确实有一个小的延迟(它们毕竟是在“工作”,即切换)。就其本身而言,这只会对固定的峰值性能值产生渐近方法。例如,从每个阶段的(已经不切实际的)微小的实际工作时间等于锁存延迟开始,流水线深度加倍(不包括其他实际约束)将减少锁存延迟的周期时间加上 1/2 锁存延迟(增加时钟速度提高了 33% 以上),但再次将流水线深度加倍只会减少锁存延迟的周期时间加上 1/4 的锁存延迟。

即使在无限数量的流水线级中,每个级(以某种方式)做无穷小的工作,最小周期时间将等于一个锁存延迟,相对于锁存延迟等于实际工作时间的流水线深度,时钟速度加倍。在稍微实用的层面上,实际工作的一个晶体管开关延迟是一个相对硬的约束。

然而,在闩锁延迟本身阻止进一步改进之前,其他实际因素限制了增加流水线深度的好处。

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

除了这些更多的物理约束之外,依赖约束往往会阻止更深的管道提高性能。虽然控制依赖关系(例如,分支的条件评估)通常可以通过预测隐藏,正如Gabe 在他的回答中指出的那样,分支错误预测可能需要管道刷新。即使在 99% 的预测准确度和每 10 条指令一个分支(95% 和每 5 条指令一个分支的可能性更大)下,千级分支解析延迟(即,排除分支解析后的阶段并假设分支目标不迟于分支方向)意味着一半的性能被分支错误预测所占据。

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

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

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

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

于 2013-12-20T18:18:03.447 回答
1

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

于 2013-12-20T03:59:55.577 回答