命令パイプライン(めいれいパイプライン、英: Instruction pipeline)は、コンピュータなどのデジタル電子機器で命令スループット(単位時間当たりに実行できる命令数)を向上させる設計技法の1つで、命令レベルの並列性を高める1技法。
命令パイプラインのあるプロセッサは、命令の処理を独立して実行できる工程(ステージ)に分割する。各工程は、前の工程の出力を自身の入力とし、自身の出力を次の工程の入力とするように相互接続されている。このような構成で各工程を並列化し、全体としての処理時間を大幅に削減する。 基本的な考え方は、コンピュータの命令の処理を一連の独立した工程に分割し、各工程の処理結果を記憶するように構成することである。そうすることで、コンピュータの制御装置は最も時間のかかる工程を基準として命令を演算装置に送り込めるようになり、全工程を一体として処理するよりも高速化できる。パイプラインとは、各工程が同時にデータを運んでいて、各工程が次の工程をパイプのように接続されていることを意味する。 命令パイプラインの起源は、ILLIAC II プロジェクトか IBM Stretch プロジェクトと言われている。IBM Stretch プロジェクトでは、「フェッチ (fetch)」、「デコード (decode)」、「実行 (execute)」という用語が生まれ、それが一般化した。 最近のCPUは、クロック信号で駆動される。CPU内部には論理回路とメモリ(フリップフロップ)がある。クロック信号が入っていくると、フリップフロップが新たな値を受け付け、論理回路でその新たな値のデコードにある程度の時間がかかる。次のクロックパルスが入ってくると、フリップフロップはまた新たな値を受け付け、同様に処理される。論理回路を小さな部分に分割し、それぞれの間にフリップフロップを挟むようにすると、各論理回路が結果を出すのにかかる時間を削減できる。そうすることで、クロック周期も縮小することができる。例えば、RISCのパイプラインは次の5段階に分割されていて、それぞれの間にフリップフロップがある。 プログラマやコンパイラがアセンブリ言語コードを書くとき、前提として命令は書かれた順序通りに逐次的に実行されるものとしている。つまり、ある命令が完了してから次の命令が実行されると仮定している。この仮定は命令パイプラインがある場合は正しくない。このことでプログラムの動作が不正になる場合、そのような状況をパイプラインハザードと呼ぶ。ハザードに対処する方法は様々なものがある。 パイプラインを使わないアーキテクチャでは、CPUの一部が命令を処理している間、他の部分が何もしていないことになり、効率が悪い。命令パイプラインはそのような何もしていない時間やCPUの部分を完全に無くすことはできないが、各部分が同時並列で動作できるようにすることで、プログラムの実行を大幅に高速化する。 だが、全ての命令が前後の命令と独立しているわけではない。単純な命令パイプラインでも、命令の完了までには5段階を要する。最高性能を発揮するには、ある命令が完了しようとしているときに、後続の4つの命令を処理している必要がある。後続の4命令が先頭の命令の結果に依存している場合、パイプライン制御回路は依存関係が解決されるまでパイプラインにストールを挿入したり、クロックサイクルを無駄にさせる必要がある。幸い、フォワーディングなどの技法でストールさせる必要性を大幅に削減できる。1命令の処理にかかる時間が同じ場合、命令パイプラインのあるプロセッサとないプロセッサでは(クロック周波数を段数に応じて向上させられるとして)、理論上はパイプラインの段数倍の性能の違いがある。実際には、ほとんどのコードは理想的な実行ができない。 命令パイプラインは1つの命令の完了までの時間を短縮するのではなく、同時に処理する命令数を増やすことで、命令の完了と命令の完了の間の遅延を短縮しスループットを改善する。パイプラインのステージ数(段数)を増やせば、同時に処理する命令数が増え、命令の完了と完了の間の遅延時間も短くできる。現在生産されているマイクロプロセッサは最低でも2ステージのパイプラインになっている(Atmel AVR や PIC は2段のパイプラインである)。Intel Pentium 4 プロセッサは20ステージのパイプラインになっている。 パイプラインはあらゆる状況で有利というわけではなく、短所もある。 パイプラインの長所は次の通りである。 パイプラインの短所は次の通りである。 右図は、一般化した次のような4段のパイプラインを示している。 図の上にある灰色の矩形には実行を待っている命令が並んでいる。下の灰色の矩形には実行が完了した命令が並んでいる。真ん中の矩形がパイプラインを表している。 実行は次のようになる。 時間(クロック)実行内容
概要
命令フェッチ
命令デコードとレジスタフェッチ
実行
メモリアクセス
レジスタへのライトバック
長所と短所
プロセッサのサイクル時間を短縮でき、多くの場合で命令処理レートを向上させる。
加算器や乗算器などの組み合わせ論理回路は回路規模が大きいほど高速化できる。代わりにパイプラインを使うと、回路規模は小さいままで高速化できる。
ハザードが発生するためコストがかかる。パイプラインのないプロセッサは一度に1つの命令しか実行できないため、ハザードが発生せず、制御を単純化でき、安価に製造できる。
命令レイテンシ(1命令の実行にかかる時間)がパイプラインがない場合に比べて若干長くなる。これは、パイプラインが各段の間にフリップフロップを挟んでいるためである。
パイプラインのないプロセッサに比べて性能が予測しにくい。命令パイプラインのあるプロセッサはプログラム(命令の並び方)によって性能がばらつくためである。
例
汎用パイプライン一般的な4段のパイプライン。色つきの四角は命令を表しており、同じ色は同じ命令であることを示す。
フェッチ (Fetch):読み込み
デコード (Decode):解析、解読
実行 (Execute)
ライトバック (Write-back)
04つの命令が実行されるのを待っている。
1
緑の命令をメモリからフェッチする。
2
緑の命令をデコードする。
紫の命令をメモリからフェッチする。
3
緑の命令を実行する(実際の命令処理を行う)
紫の命令をデコードする。
青の命令をフェッチする。
4
緑の命令の結果をレジスタファイルかメモリに書き込む。
紫の命令を実行する。
青の命令をデコードする。
赤の命令をフェッチする。
5
緑の命令は完了した。
紫の命令の結果を書き込む。
青の命令を実行する。
赤の命令をデコードする。
6
紫の命令は完了した。
青の命令の結果を書き込む。
赤の命令を実行する。
7
青の命令は完了した。
赤の命令の結果を書き込む。