【发布时间】:2014-01-08 20:27:45
【问题描述】:
我正在link 观看有关流水线的视频教程。
在 4:30 时,讲师说随着阶段数的增加,我们还需要添加流水线寄存器,这会产生开销,并且由于这种加速不能随着阶段数的增加而超过最佳值。
有人可以详细说明一下吗?我的疑问是流水线寄存器可能会给各个阶段的周期时间增加一些延迟,那么当阶段的数量与少数相比时,为什么它会成为一个问题呢?
谢谢。
【问题讨论】:
标签: computer-architecture pipelining
我正在link 观看有关流水线的视频教程。
在 4:30 时,讲师说随着阶段数的增加,我们还需要添加流水线寄存器,这会产生开销,并且由于这种加速不能随着阶段数的增加而超过最佳值。
有人可以详细说明一下吗?我的疑问是流水线寄存器可能会给各个阶段的周期时间增加一些延迟,那么当阶段的数量与少数相比时,为什么它会成为一个问题呢?
谢谢。
【问题讨论】:
标签: computer-architecture pipelining
锁存器本身确实有一个小的延迟(它们毕竟是在“工作”,即切换)。就其本身而言,这只会对固定的峰值性能值产生渐近方法。例如,从每个阶段的(已经不切实际的)微小的实际工作时间等于锁存延迟开始,流水线深度加倍(不包括其他实际约束)将减少锁存延迟的周期时间加上 1/2 锁存延迟(增加时钟速度提高了 33% 以上),但再次将流水线深度加倍只会减少锁存延迟的周期时间加上 1/4 的锁存延迟。
即使在无限个流水线阶段,每个阶段(不知何故)做无穷小的工作,最小周期时间将等于一个锁存延迟,相对于锁存延迟的流水线深度,时钟速度加倍等于实际工作时间。在稍微实用的层面上,实际工作的一个晶体管开关延迟是一个相对较硬的约束。
但是,在闩锁延迟本身阻止进一步改进之前,其他现实世界因素限制了增加管道深度的好处。
在更物理的层面上,不包括面积和功率/热密度限制,在如此高的时钟速度下,让时钟信号在整个设计中以非常高的精度均匀地转换是具有挑战性的。当工作时间吸收变化的余量较少时,时钟偏差和抖动变得更加显着。 (这甚至不包括制造或温度等环境条件的变化。)
除了这些更多的物理约束之外,依赖约束往往会阻止更深的管道提高性能。虽然控制依赖关系(例如,分支的条件评估)通常可以通过预测隐藏,如Gabe notes in his answer,但分支错误预测可能需要管道刷新。即使在 99% 的预测准确度和每 10 条指令一个分支(95% 和每 5 条指令一个分支的可能性更大)下,千级分支解析延迟(即,排除分支解析后的阶段并假设分支目标不迟于分支方向)意味着一半的性能被分支错误预测所占据。
指令缓存未命中也是一个问题。如果有完美的控制流预测,可以使用预取来隐藏延迟。这有效地成为分支预测问题的一部分。另请注意,增加缓存大小以降低未命中率(或增加分支预测器大小以降低误预测率)会增加访问延迟(流水线阶段计数)。
数据值依赖更难处理。如果执行需要两个周期,则具有数据依赖性的两条顺序指令将无法背靠背执行。虽然从理论上讲,价值预测在某些情况下会有所帮助,但在相对有限的情况下最有帮助。某些操作也可能是width-pipelined(例如,加法、减法、按位逻辑运算和左移)。但是,这样的技巧是有局限性的。
数据缓存未命中成为此数据依赖问题的一部分。数据存储器地址往往比指令地址更难预测。
This Google Scholar search 提供了有关此主题的一些更详细(和技术)的阅读材料。
【讨论】:
如果不看长达一小时的视频,我会说当有大量阶段时的实际问题是管道停顿更严重。如果你有一个 14 阶段的流水线并且错误地预测了一个分支,那么你必须在发出另一条指令之前再次填充这 14 个阶段。
【讨论】: