プロセッサのパイプラインは、命令を複数段階で同時進行させ、CPUのスループットを大幅に向上させる技術です。本記事では、パイプラインの基本構造から現代CPUで採用される高度な技術、効率化の仕組みや性能への影響までをわかりやすく解説します。CPU選びやアーキテクチャ理解の基礎にも役立つ内容です。
プロセッサのパイプラインは、CPUが複数の命令を同時に処理できる仕組みです。各命令を異なる実行段階に振り分けることで、一方の命令が計算を行っている間に、次の命令はデコードされ、さらに別の命令がメモリから読み込まれます。これにより、CPUは演算ユニットの無駄を減らし、単位時間あたりにより多くの処理を実行できるようになります。
この技術は命令パイプライニング(Instruction Pipelining)と呼ばれ、現代のほとんどのプロセッサで採用されています。各命令を順番に完了させてから次に進む必要がなくなり、CPUの処理効率を大幅に高めることができます。
パイプラインは1つの機械命令を複数の連続した段階に分割して処理します。これにより、1つの命令の完了を待たずに、異なる命令が同時進行で処理されます。
自動車工場のライン作業をイメージすると分かりやすいでしょう。最初の工程で車体を組み立てている間、次の工程ではエンジンを取り付け、さらに次の工程で最終チェックを行う、といった具合です。複数の車が同時に異なる段階を進んでいきます。
CPUのパイプラインも同様に、1つの命令が演算段階、別の命令がデコード段階、さらに別の命令がメモリ読み込み段階を同時に進めます。各命令は必要な処理段階を順番に通過していきます。
このアーキテクチャの最大のメリットは、CPUが単位時間あたりに完了できる命令数が増えることです。例えば5段階のパイプラインの場合、初期充填後は1クロックごとに1命令が完了する理想的な状況が実現できます。
ただし、パイプライニング自体が1命令あたりの実行時間を必ずしも短縮するわけではありません。全体のスループット(処理能力)を向上させることで、計算資源の遊休時間を減らしています。
CPUの性能はクロック周波数だけでなく、アーキテクチャが命令処理をどれだけ効率的に行えるかにも大きく左右されます。詳しくは、「なぜ今ギガヘルツよりIPCなのか:現代CPU性能の本質」の記事もご覧ください。
パイプラインは命令の実行を段階ごとに分割します。各段階が独自の処理を行い、次の段階に結果を引き渡すことで、複数の命令を同時に進行させることができます。
クラシックな5段階パイプラインは以下のような流れです:
全ての命令が全段階を利用するとは限りません。例えば、レジスタ内のデータ同士の加算命令は、メモリアクセス段階を利用しないこともあります。
簡易的な5段階パイプラインでは、各段階が1クロックで完了し、命令同士に依存関係がなければ、以下のように同時並行で進みます。
| クロック | 命令1 | 命令2 | 命令3 |
|---|---|---|---|
| 1 | IF | - | - |
| 2 | ID | IF | - |
| 3 | EX | ID | IF |
| 4 | MEM | EX | ID |
| 5 | WB | MEM | EX |
| 6 | - | WB | MEM |
| 7 | - | - | WB |
3つの命令を直列で実行すれば15クロックかかりますが、パイプラインを利用すると7クロックで完了します。命令数が多いほどこの差は顕著になります。理想的なパイプラインでは、充填後は毎クロックごとに1命令を完了できます。
実際のCPUでは命令間の依存や演算の複雑さにより、すべてがこの通りに進むわけではありません。
パイプラインの深さとは、命令実行が分割される段階数を指します。クラシックモデルでは5段階ですが、現代のCPUではさらに多くの段階を持つものもあります。
パイプラインを深くすると、複雑な処理をより細かい工程に分割でき、各段階の処理時間を短縮し、結果としてCPUのクロック周波数を高めることが可能になります。
しかし、パイプラインを深くすれば必ずしも性能が向上するとは限りません。段階が増えることで分岐予測の失敗や命令間依存による遅延も大きくなりがちです。
20段パイプラインのCPUが12段のモデルより必ず速いとは限りません。深いパイプラインでもアイドルやリトライが多ければ、高クロックのメリットが相殺されます。現代CPUはパイプライン深度・クロック・実効IPC(命令毎クロック数)のバランス設計が重要です。
パイプラインは、命令が遅滞なく各段階を進める時に最大効率を発揮します。しかし、命令同士が依存関係にある、または次の命令が確定できない場合にパイプラインハザード(衝突)が発生し、処理が停止・遅延します。
前の命令の結果を待つ必要がある場合、パイプラインは待機を強いられます。例えば、2つの数値を足した後、その和に3つ目の数値を掛ける場合、乗算命令は加算結果が出るまで待たなければなりません。
この遅延を減らすためにフォワーディング(データ転送)が活用されます。これは、レジスタへの書き戻しを待たずに演算結果を次段階に直接渡す技術です。
複数の命令が同時に1つの演算ユニットなどを使いたい場合、構造的ハザードが発生します。これを避けるため、現代CPUは複数の演算ユニットや資源分割、命令スケジューリングで対応しています。
条件分岐命令は処理順序そのものを変えるため、パイプライン設計上の大きな課題です。現代のCPUは分岐予測(Branch Prediction)を使い、プログラムがどちらの経路に進むかを予測して先に命令を処理します。
予測が正しければ高速に進みますが、失敗時にはパイプライン内の誤った命令を破棄し、正しい命令列を再投入しなければなりません。パイプラインが深いほど損失も大きくなりますので、分岐予測の精度は現代CPUの実効性能に大きく影響します。
現代のCPUは、クラシックな5段階モデルよりもさらに高度なパイプライン構造を持ち、複数命令の同時発行や命令順序変更などの技術で演算資源を効率的に活用しています。
スーパースカラ型CPUは、1クロックで複数の命令を同時に発行できます。例えば、整数演算と浮動小数点演算を並行して処理することが可能です。これにより、単純なパイプラインでは実現できないクロックあたり1命令以上(IPC>1)のスループットを達成します。
アウトオブオーダー実行(Out-of-Order Execution, OoO)は、データや資源の解放待ちで停止している命令を飛ばし、準備が整っている独立命令から先に実行する技術です。これにより演算ユニットのアイドル時間を減らし、全体のスループットを高めます。ただし、プログラムの表面的な命令順序は維持されるように設計されています。
これらの技術は併用可能です。例えば、SMT対応のマルチコアCPUは各コア内でパイプライン化を活用し、異なるスレッドの命令を効率的に振り分けています。
物理コア・論理プロセッサ・ソフトウェアスレッドの違いについては、「マルチスレッドCPU:コアとスレッドの違いと性能への影響」もご参照ください。
プロセッサのパイプラインは、命令を複数の段階に分けて同時進行で処理し、CPUのスループットを向上させます。しかし、性能は単なる段階数だけでなく、分岐予測・命令依存・スーパースカラ性・アウトオブオーダー実行など様々な要素に左右されます。
したがって、CPUを比較する際はクロック周波数やパイプラインの深さだけでなく、実際のIPCや用途に合ったベンチマーク結果を重視することが重要です。