命令パイプラインは、最近のマイクロプロセッサやマイクロコントローラ、CPUの設計で、命令のスループット(単位時間あたりに処理できる命令数)を向上させるために用いられる主要な技術です。
基本的な考え方は、個々の命令の処理を複数の段階(ステージ)に分割し、各ステージ間に状態を保持するストレージを置くことです。具体的には、命令をマイクロコードで定義された複数の独立したマイクロオペレーション(「マイクロ命令」、「マイクロオプ」あるいは「μオプ」とも呼ばれます)に分割します。各ステージは別個の作業を担当し、ある命令の第1ステージが第2ステージに出力を渡す一方で、次のクロックで別の命令が第1ステージに入る、という形で多数の命令が同時並行的に処理されます。この並列化によって、理想的にはクロックごとに新しい命令を投入でき、スループットが大きく向上します。
クロックとフリップフロップ(段レジスタ)による分割
ほとんどの近代的なCPUはクロックで駆動され、内部は組合せロジックと状態を保持するメモリ要素(フリップフロップ)で構成されています。クロックが立ち上がるたびにフリップフロップが新しい値を取り込み、その後ロジックはその値をもとに出力を生成するために一定時間を要します。ロジックを細かく分割してステージ間にフリップフロップを挿入すると、各ステージで必要な遅延が短くなり、クロック周期を短く(=周波数を高く)設定できるようになります。ただし、ステージを増やすほど分岐のミス予測などのペナルティが大きくなるため、この点はトレードオフになります。
5段階RISCパイプラインの例
典型的なRISCプロセッサでは処理を5つのステージに分けることが多く、各ステージ間にフリップフロップを挿入すると次のようになります。
- 命令取得
- 命令デコードとレジスタフェッチ
- 実行
- メモリアクセス
- レジスタライトバック
この構成では、理想的には1サイクルに1命令分のスループット(CPI=1)を達成できます。ただし実際にはさまざまな理由でパイプラインの進行が妨げられることがあり、平均CPIは1より大きくなります。
パイプラインで発生する問題(ハザード)と対策
- 構造ハザード:同じハードウェア資源を複数のステージが同時に必要とする場合。ハードウェアの複製やステージの調整で回避します。
- データハザード:ある命令が書き込むべきデータを次の命令が読み取ろうとする場合。フォワーディング(バイパス)で直ちにデータを渡す、あるいはパイプラインを一時停止(ストール)して解決します。
- 制御ハザード(分岐ハザード):分岐命令によって次に実行する命令のアドレスが不確定な場合。分岐予測、遅延分岐(delay slot)、投機実行を用いることで有効命令の取りこぼしを減らします。
具体的な技術
- フォワーディング(バイパス):演算結果をレジスタに書き戻す前に次ステージへ直接渡し、データハザードを軽減します。
- パイプラインストールとバブル:危険な依存がある場合に一時的に命令の進行を止め、パイプライン内に「空のステージ(バブル)」を挿入します。
- 分岐予測:分岐の行方を事前に予測してパイプラインを継続し、予測が外れた際にパイプラインをフラッシュ(破棄)して正しい経路を再度取り込むことで性能を向上させます。
- アウト・オブ・オーダ実行と命令スケジューリング:命令の実行順序を動的に入れ替えてハザードを回避し、資源利用率を高めます(高級な実装での採用例)。
- スーパースカラ化:同一サイクルで複数命令を発行して複数の実行ユニットで並列に処理することでスループットをさらに高めます。
設計上のトレードオフ
パイプラインを深くすると各ステージの遅延は小さくなりクロックを速くできますが、分岐予測ミスや例外処理時のペナルティ(パイプラインのドレイン・フラッシュ)が大きくなります。また、ステージ間の負荷を均一にする(バランスさせる)ことが難しく、設計と検証のコストも増大します。したがって、パイプラインの深さ、複雑さ、追加するフォワーディングや予測機構は総合的に決定されます。
実用上の注意点
- パイプラインはスループットを大きく改善しますが、個々の命令のレイテンシ(実行遅延)は必ずしも短くなりません。
- 例外処理やデバッグ(精密な例外状態の再現)を正しく扱うために、設計に注意が必要です(精密例外を満たすための仕組みなど)。
- 組み込み用途などでは、ハードウェアコストや散逸エネルギー、設計の単純さとのバランスが重要になります。
まとめると、命令パイプラインは現代の多くのプロセッサでスループット向上の主要手段となっており、パイプライン化そのものと、それに伴うハザード対策や分岐処理、さらには深さや複雑度の設計最適化が性能を決定します。



