命令パイプライン

RISCマシンの基本的な5段のパイプライン(IF = 命令フェッチ、ID = 命令デコード、EX = 実行、MEM = メモリアクセス、WB = レジスタ・ライトバック)。縦軸は逐次的な命令列、横軸は時間。緑の列は、最初の命令がWB段にあり、最後の命令がフェッチされている時点を表している。

命令パイプライン: Instruction pipeline)は、 コンピュータなどのデジタル電子機器で命令スループット(単位時間当たりに実行できる命令数)を向上させる設計技法の1つで、 命令レベルの並列性を高める1技法。

命令パイプラインのある プロセッサは、命令の処理を独立して実行できる工程(ステージ)に分割する。各工程は、前の工程の出力を自身の入力とし、自身の出力を次の工程の入力とするように相互接続されている。このような構成で各工程を並列化し、全体としての処理時間を大幅に削減する。

概要

基本的な考え方は、コンピュータの 命令の処理を一連の独立した工程に分割し、各工程の処理結果を記憶するように構成することである。そうすることで、コンピュータの 制御装置は最も時間のかかる工程を基準として命令を演算装置に送り込めるようになり、全工程を一体として処理するよりも高速化できる。 パイプラインとは、各工程が同時にデータを運んでいて、各工程が次の工程をパイプのように接続されていることを意味する。

命令パイプラインの起源は、 ILLIAC II プロジェクトか IBM Stretch プロジェクトと言われている。IBM Stretch プロジェクトでは、「フェッチ (fetch)」、「デコード (decode)」、「実行 (execute)」という用語が生まれ、それが一般化した。

最近の CPUは、クロック信号で駆動される。CPU内部には 論理回路とメモリ( フリップフロップ)がある。クロック信号が入っていくると、フリップフロップが新たな値を受け付け、論理回路でその新たな値のデコードにある程度の時間がかかる。次のクロックパルスが入ってくると、フリップフロップはまた新たな値を受け付け、同様に処理される。論理回路を小さな部分に分割し、それぞれの間にフリップフロップを挟むようにすると、各論理回路が結果を出すのにかかる時間を削減できる。そうすることで、クロック周期も縮小することができる。例えば、 RISCのパイプラインは次の5段階に分割されていて、それぞれの間にフリップフロップがある。

  1. 命令フェッチ
  2. 命令デコードと レジスタフェッチ
  3. 実行
  4. メモリアクセス
  5. レジスタへのライトバック

プログラマや コンパイラアセンブリ言語コードを書くとき、前提として命令は書かれた順序通りに逐次的に実行されるものとしている。つまり、ある命令が完了してから次の命令が実行されると仮定している。この仮定は命令パイプラインがある場合は正しくない。このことでプログラムの動作が不正になる場合、そのような状況を パイプラインハザードと呼ぶ。ハザードに対処する方法は様々なものがある。

パイプラインを使わないアーキテクチャでは、CPUの一部が命令を処理している間、他の部分が何もしていないことになり、効率が悪い。命令パイプラインはそのような何もしていない時間やCPUの部分を完全に無くすことはできないが、各部分が同時並列で動作できるようにすることで、プログラムの実行を大幅に高速化する。

だが、全ての命令が前後の命令と独立しているわけではない。単純な命令パイプラインでも、命令の完了までには5段階を要する。最高性能を発揮するには、ある命令が完了しようとしているときに、後続の4つの命令を処理している必要がある。後続の4命令が先頭の命令の結果に依存している場合、パイプライン制御回路は依存関係が解決されるまでパイプラインにストールを挿入したり、クロックサイクルを無駄にさせる必要がある。幸い、フォワーディングなどの技法でストールさせる必要性を大幅に削減できる。1命令の処理にかかる時間が同じ場合、命令パイプラインのあるプロセッサとないプロセッサでは(クロック周波数を段数に応じて向上させられるとして)、理論上はパイプラインの段数倍の性能の違いがある。実際には、ほとんどのコードは理想的な実行ができない。

命令パイプラインは1つの命令の完了までの時間を短縮するのではなく、同時に処理する命令数を増やすことで、命令の完了と命令の完了の間の遅延を短縮し スループットを改善する。パイプラインのステージ数(段数)を増やせば、同時に処理する命令数が増え、命令の完了と完了の間の遅延時間も短くできる。現在生産されている マイクロプロセッサは最低でも2ステージのパイプラインになっている( Atmel AVRPIC は2段のパイプラインである)。Intel Pentium 4 プロセッサは20ステージのパイプラインになっている。

他の言語で