【问题标题】:Why speedup reduces with increase in number of pipeline stages?为什么加速会随着流水线级数的增加而降低?
【发布时间】:2014-01-08 20:27:45
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: computer-architecture pipelining


    【解决方案1】:

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

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

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

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

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

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

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

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

    This Google Scholar search 提供了有关此主题的一些更详细(和技术)的阅读材料。

    【讨论】:

    • 英特尔的 NetBurst 架构 (en.wikipedia.org/wiki/NetBurst) 是一个有趣的案例研究,说明为什么长管道没有帮助。
    • @Gabe 当然,“long”是相对的。 MIPS R4000 被称为超流水线。 NetBurst 遭受的不仅仅是非常长的管道;威拉米特在几个领域都具有创新性,并且(我认为)遭受了晚死饮食的困扰。虽然这部分归因于深管道,但还涉及其他因素。忽略笔记本电脑的重要性并没有帮助它的声誉。泄漏功率增加也无济于事。 RDRAM 要求无助于早期接受。为了快速采用 x86-64,Prescott 被认为比早期的 Intel x86 具有更少的自定义逻辑。复杂导致复杂失败!
    • 这正是我的观点。流水线本身很好——但你无法预测足够多的分支来持续保持 31 级满载,而且泄漏电流使得它无法在 7GHz 左右运行,从而比竞争架构真正运行得更快。
    • @Gabe:Modern Microprocessors A 90-Minute Guide! 非常好,并且有一些很好的历史说明为什么长管道“速度恶魔”(高时钟,低 IPC)设计在特定时间段变得非常糟糕当 P4 出现时,就在 CPU 正在触及功率密度成为限制因素的“功率墙”之际。 P4 被设计为最终具有比实践中更高的时钟频率,比如我认为超过 5GHz。 (即便如此,跟踪缓存还是有问题的。)
    【解决方案2】:

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

    【讨论】:

    • 如果可以,请浏览视频的 4:00 - 5:00 时间,谢谢
    • 为什么摊位更糟?我不明白,你为什么不能清空管道并重新开始——为什么需要填满 14 个阶段?
    • @StackExploded:这正是错误的预测。必须丢弃 fetch 和发现错误预测点之间所有阶段的运行中指令(条件或间接分支的执行,正常分支的解码)正是使分支错误预测在更长的管道上更加昂贵的原因。 “停顿”是错误的词来描述管道中的指令来自不正确的执行路径的情况。
    • @StackExploded:但是,如果您的长管道分解了执行单元(如 FP add 或 FMA),那么它们在准备绕过依赖指令之前有更多的延迟周期,例如8 个周期(而不是现代 Intel 上通常的 4 个),那么较高的延迟更有可能导致相关指令之间的停顿。在结果准备好之前,您有一个更大的窗口来填充独立工作,您可以在依赖链中进行下一步。 (例如,数组的总和或点积,您需要更多的 FP 累加器来隐藏延迟并保持更多 FMA 处于运行状态。)
    猜你喜欢
    • 1970-01-01
    • 2019-04-14
    • 2021-05-06
    • 2018-09-22
    • 2023-02-23
    • 2019-09-17
    • 2021-02-16
    • 2013-01-09
    • 2020-01-31
    相关资源
    最近更新 更多