加载中...
流水线把一条指令的执行拆成多个阶段并行推进,让处理器每个时钟周期都能完成一条指令的吞吐。现代超标量流水线深度普遍在 10 到 19 级,控制冒险和数据冒险是流水线设计的核心挑战。

| 经典五级流水 | 取指 / 译码 / 执行 / 访存 / 写回 |
| Pentium 4 流水线深度 | 31 级(Prescott) |
| 现代主流深度 | 10~19 级 |
最朴素的处理器每条指令独占整个时钟周期,执行时序是「取指→译码→执行→访存→写回」,五个步骤全部完成才开始下一条。把这五步变成流水线后,第一条指令进入译码时,第二条已经在取指,五条指令同时在五个阶段流动,理论吞吐翻五倍。Intel Pentium(1993)采用两条并行超标量流水线,Pentium 4 的 NetBurst 微架构为了提高频率把流水线拉到 31 级,代价是分支预测失败的惩罚高达 20 多个周期——这也是 NetBurst 在实际应用中效率不佳的原因之一。[1]
流水线面临三类冒险。数据冒险:后一条指令依赖前一条还未写回的结果,解决方案是数据前递(forwarding),把执行阶段的输出直接旁路到下一条指令的输入,不必等写回。结构冒险:多条指令争用同一硬件资源,通过复制执行单元缓解。控制冒险最棘手:遇到条件分支时流水线不知道下一条该执行哪里,现代处理器用分支预测器(branch predictor)猜测跳转方向,Intel 的 TAGE 预测器预测准确率可达 97% 以上;猜错则清空流水线重新取指,代价即为「分支误预测惩罚」。
Spectre(2018)漏洞正是利用了分支预测和乱序执行的侧信道,攻击者通过训练预测器诱使 CPU 执行本不该执行的代码路径,再通过缓存时序侧信道读出秘密数据。这迫使各大 CPU 厂商在硬件和微码层面打补丁,部分场景性能下降 5~30%。

| 经典五级流水 | 取指 / 译码 / 执行 / 访存 / 写回 |
| Pentium 4 流水线深度 | 31 级(Prescott) |
| 现代主流深度 | 10~19 级 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧