命令パイプライン
プロセッサの命令パイプラインは以下のような長さがある。
インテル P6マイクロアーキテクチャ(Pentium III) - 11段
インテル NetBurstマイクロアーキテクチャ(Pentium 4) - 20段、Prescottは31段
インテル P6マイクロアーキテクチャ Yonah (Intel Core) - 13段
インテル Coreマイクロアーキテクチャ Merom (Intel Core 2) - 14段
インテル Nehalemマイクロアーキテクチャ(第1世代Core i) - 16段
インテル Sandy Bridgeマイクロアーキテクチャ(第2世代Core i) - 16段、μOp Cacheアクセス時は18段
ARM Cortex-A5 - 9段
ARM Cortex-A8 - 13段
ARM Cortex-A9 - 9〜12段
ARM Cortex-A15 - 15段(整数)、24段(浮動小数点数やNEON)
Xelerator X10q - 1000段以上。
パイプラインステージが少ない実装では、一つのステージに一つの実行ユニットが対応しているが、一つの実行ユニットを細分化して次々に命令を送り込むスーパーパイプラインがある。たとえば、前節で示した3段のパイプラインそれぞれを2つに分割して6段として、Loadステージに注目すると、命令が供給されたらそれを途中までロードして次のLoadステージに供給する。同時に次の命令をロードする。その間、ふたつ目のLoadでは最初のLoadの続きを実行している。結果的に、2つの命令が同時にロードされていることになる。
実行中に何らかの中断が発生すると、パイプラインに「バブル (bubble)」と呼ばれる何もしない部分が生じる。右の図では、サイクル2で紫の命令のフェッチに遅延が生じ、サイクル3のデコードステージにバブルが生じている。紫より後の命令は全て1クロックサイクルだけ遅延するが、紫の命令より前の命令は普通に処理が続行される。
上の図と比べると、バブルが生じたことによって実行にかかるクロックサイクル数が7から8に増えている。
バブルはストールと似ており、各ステージでは何もしない。ただし、NOP命令をバブルの部分に挟むとバブルを消すことができる。
命令パイプライン(めいれいパイプライン、英: Instruction pipeline)は、コンピュータなどのデジタル電子機器で命令スループット(単位時間当たりに実行できる命令数)を向上させる設計技法の1つで、命令レベルの並列性を高める1技法。
命令パイプラインのあるプロセッサは、命令の処理を独立して実行できる工程(ステージ)に分割する。各工程は、前の工程の出力を自身の入力とし、自身の出力を次の工程の入力とするように相互接続されている。このような構成で各工程を並列化し、全体としての処理時間を大幅に削減する。
最高性能を発揮するには、ある命令が完了しようとしているときに、後続の4つの命令を処理している必要がある。後続の4命令が先頭の命令の結果に依存している場合、パイプライン制御回路は依存関係が解決されるまでパイプラインにストールを挿入したり、クロックサイクルを無駄にさせる必要がある。幸い、フォワーディングなどの技法でストールさせる必要性を大幅に削減できる。1命令の処理にかかる時間が同じ場合、命令パイプラインのあるプロセッサとないプロセッサでは(クロック周波数を段数に応じて向上させられるとして)、理論上はパイプラインの段数倍の性能の違いがある。実際には、ほとんどのコードは理想的な実行ができない。
命令パイプラインは1つの命令の完了までの時間を短縮するのではなく、同時に処理する命令数を増やすことで、命令の完了と命令の完了の間の遅延を短縮しスループットを改善する。パイプラインのステージ数(段数)を増やせば、同時に処理する命令数が増え、命令の完了と完了の間の遅延時間も短くできる。現在生産されているマイクロプロセッサは最低でも2ステージのパイプラインになっている(Atmel AVR や PIC は2段のパイプラインである)。Intel Pentium 4 プロセッサは20ステージのパイプラインになっている。