パイプライン
命令の処理を段階に分け、複数の命令を重ねて流す。
時刻 →
命令1: IF ID EX MEM WB
命令2: IF ID EX MEM WB
命令3: IF ID EX MEM WB1 命令の処理時間(レイテンシ)は変わらないが、 スループットが段数倍になる。
工場の流れ作業と同じ発想。
ハザード#
理想どおりには流れない。
| ハザード | 原因 | 対処 |
|---|---|---|
| 構造 | 資源の取り合い | 資源を増やす |
| データ | 前の命令の結果が要る | フォワーディング、ストール |
| 制御 | 分岐先が決まらない | 分岐予測 |
分岐予測#
条件分岐の結果は、実行してみないと分からない。 待つと数サイクル無駄になる。
そこで予測して先に進む。 外れたらパイプラインを捨ててやり直す(数十サイクルの損失)。
現代の予測器は 95〜99% 当てる。 過去の分岐履歴のパターンを学習する仕組みで、 実質的に小さな機械学習器といえる。
段数のトレードオフ#
段数を増やすと 1 段あたりが短くなり、クロックを上げられる。 しかし
- 分岐予測ミスのペナルティが増える
- ハザードの影響が大きくなる
Pentium 4 は 31 段まで深くしたが、 予測ミスのコストと消費電力で行き詰まり、 以降は 15 段前後に戻った。 深ければ速いわけではないという教訓。
参考文献#
- David A. Patterson, John L. Hennessy. Computer Organization and Design: RISC-V Edition, 2nd ed. Morgan Kaufmann, 2020.
- John L. Hennessy, David A. Patterson. Computer Architecture: A Quantitative Approach, 6th ed. Morgan Kaufmann, 2017.
- Randal E. Bryant, David R. O’Hallaron. Computer Systems: A Programmer’s Perspective, 3rd ed. Pearson, 2016. https://csapp.cs.cmu.edu/