コンピュータ エンジニアリングにおいて、命令パイプラインとは、単一のプロセッサ内で命令レベルの並列処理を実装する手法です。パイプラインは、入力される命令を一連の連続したステップ (同名の「パイプライン」) に分割し、異なるプロセッサ ユニットで実行される命令の異なる部分を並列処理することで、プロセッサのすべての部分を何らかの命令でビジー状態に維持しようとします。
コンセプトと動機
パイプライン コンピュータでは、命令は段階的に中央処理装置(CPU) を通過します。たとえば、フォン ノイマン サイクルの各ステップに 1 つのステージ(命令のフェッチ、オペランドのフェッチ、命令の実行、結果の書き込み) がある場合があります。パイプライン コンピュータには通常、各ステージの後に「パイプライン レジスタ」があります。これらは命令と計算からの情報を格納し、次のステージのロジック ゲートが次のステップを実行できるようにします。
この配置により、CPU は各クロック サイクルで命令を完了できます。偶数ステージは方形波クロックの一方のエッジで動作し、奇数ステージはもう一方のエッジで動作するのが一般的です。これにより、特定のクロック レートでマルチサイクル コンピュータよりもCPU スループットが向上しますが、パイプライン処理自体のオーバーヘッドが追加されるため、レイテンシが増加する可能性があります。また、電子ロジックの最大速度は固定されていますが、パイプライン コンピュータは、パイプラインのステージ数を変更することで高速化または低速化できます。ステージの数が増えると、各ステージの作業が少なくなるため、ステージのロジック ゲートによる遅延が少なくなり、より高いクロック レートで実行できます。
パイプライン モデルのコンピュータは、コストを 1 秒あたりの命令あたりのロジック ゲート数で測定すると、最も経済的であることが多いです。各瞬間に命令が存在するのは 1 つのパイプライン ステージのみで、平均するとパイプライン ステージはマルチサイクル コンピュータよりもコストが低くなります。また、適切に設計されていれば、パイプライン コンピュータのロジックのほとんどは、ほとんどの時間使用されています。対照的に、アウト オブ オーダー コンピュータでは、通常、任意の瞬間に大量のアイドル ロジックが存在します。同様の計算により、パイプライン コンピュータでは命令あたりのエネルギー消費量が少ないことが通常示されます。
ただし、パイプライン コンピュータは通常、同等のマルチサイクル コンピュータよりも複雑でコストがかかります。通常、パイプライン コンピュータには、より多くの論理ゲート、レジスタ、より複雑な制御ユニットがあります。同様に、命令あたりのエネルギー消費量は少なくなりますが、総エネルギー消費量は多くなります。アウト オブ オーダー CPU は、一度に複数の命令を実行できるため、通常、1 秒あたりにより多くの命令を実行できます。
パイプライン コンピュータでは、制御ユニットがプログラム コマンドに従ってフローを開始、継続、停止するように調整します。命令データは通常、パイプライン レジスタで 1 つのステージから次のステージに渡され、ステージごとに多少分離された制御ロジックがあります。制御ユニットは、各ステージの命令が他のステージの命令の動作に悪影響を与えないことも保証します。たとえば、2 つのステージで同じデータを使用する必要がある場合、制御ロジックによって、正しい順序で使用が行われます。
パイプライン化されたコンピュータが効率的に動作している場合、各ステージに命令が 1 つずつあります。そして、それらの命令すべてを同時に処理します。クロックの 1 サイクルごとに約 1 つの命令を完了できます。ただし、プログラムが別の命令シーケンスに切り替わると、パイプラインは処理中のデータを破棄して再起動しなければならない場合があります。これを「ストール」と呼びます。
パイプライン化されたコンピュータの設計の多くは、ステージ間の干渉を防ぎ、停止を減らします。
ステップ数
依存ステップの数はマシンのアーキテクチャによって異なります。例:
- 1956 ~ 1961 年のIBM Stretchプロジェクトでは、現在一般的になっている Fetch、Decode、Execute という用語が提案されました。
- 従来の RISC パイプラインは次のもので構成されます。
- 命令フェッチ
- 命令デコードとレジスタフェッチ
- 実行する
- メモリアクセス
- レジスタの書き戻し
- Atmel AVRとPIC マイクロコントローラにはそれぞれ 2 段パイプラインがあります。
- 多くの設計には、7 段、10 段、さらには 20 段 ( Intel Pentium 4など) にも及ぶパイプラインが含まれています。
- 最新の Pentium 4 モデルとそのPentium DおよびXeon派生製品で使用されている、Intel の後継の「Prescott」および「Cedar Mill」NetBurstコアには、31 ステージの長いパイプラインがあります。
- Xelerated X10q ネットワーク プロセッサには 1,000 ステージを超えるパイプラインがありますが、この場合、これらのステージのうち 200 は個別にプログラムされた命令を持つ独立した CPU を表します。残りのステージは、メモリとオンチップ機能ユニットへのアクセスを調整するために使用されます。[1] [2]
パイプラインが「深く」なると(従属ステップの数が増えると)、特定のステップをより単純な回路で実装できるようになり、プロセッサクロックを高速化できる可能性があります。[3]このようなパイプラインはスーパーパイプラインと呼ばれることがあります。 [4]
プロセッサがすべてのサイクルで命令をフェッチできる場合、そのプロセッサは完全にパイプライン化されていると言えます。したがって、一部の命令または条件で新しい命令のフェッチを妨げる遅延が必要な場合、そのプロセッサは完全にパイプライン化されていません。
歴史
パイプラインの画期的な使用例はILLIAC IIプロジェクトとIBM Stretchプロジェクトであったが、それ以前にも1939年のZ1と1941年のZ3でシンプルなバージョンが使用されていた。[5]
パイプラインは、1970 年代後半にベクトル プロセッサやアレイ プロセッサなどのスーパーコンピュータで本格的に始まりました。 [要出典]初期のスーパーコンピュータの 1 つは、Control Data Corporation によって構築された Cyber シリーズでした。その主な設計者であるSeymour Cray は、後に Cray Research を率いました。Cray は、乗算と加算/減算の両方の機能にパイプラインを使用した XMP シリーズのスーパーコンピュータを開発しました。その後、Star Technologies は、Roger Chen によって開発された並列処理 (複数のパイプライン化された機能が並列に動作する) を追加しました。1984 年、Star Technologies は James Bradley によって開発されたパイプライン化された除算回路を追加しました。1980 年代半ばまでに、パイプラインは世界中のさまざまな企業で使用されていました。[要出典]
パイプラインはスーパーコンピュータに限定されませんでした。1976 年、Amdahl Corporationの 470 シリーズ汎用メインフレームには、7 ステップのパイプラインと特許取得済みの分岐予測回路が搭載されていました。[引用が必要]
危険
順次実行モデルでは、各命令が次の命令の開始前に完了することを前提としていますが、この前提はパイプライン プロセッサでは当てはまりません。予想される結果に問題がある状況は、ハザードと呼ばれます。仮想プロセッサに対する次の 2 つのレジスタ命令を想像してください。
1: R5に1を加える 2: R5をR6にコピーする
プロセッサに最初の図 (記事の冒頭の「基本的な 5 段パイプライン」) に示されている 5 つのステップがある場合、命令 1 は時刻t 1にフェッチされ、その実行はt 5に完了します。命令 2 はt 2にフェッチされ、 t 6に完了します。最初の命令は、 t 5の 5 番目のステップ (レジスタ書き戻し) として、増分された数値を R5 に格納する可能性があります。しかし、2 番目の命令は、時刻t 3の 2 番目のステップ (命令のデコードとレジスタ フェッチ) で、R5 から数値を取得する (R6 にコピーする) 可能性があります。最初の命令は、その時までには値を増分していないようです。上記のコードはハザードを引き起こします。
コンパイルされた言語でコンピュータ プログラムを作成する場合、コンパイラは危険を回避するマシン コードを生成するように設計できるため、これらの懸念は発生しない可能性があります。
回避策
初期の DSP および RISC プロセッサの中には、隣接する命令やほぼ隣接する命令 (遅延スロットと呼ばれる) でこのような依存関係を避けるようにプログラマにアドバイスしたり、2 番目の命令が目的の値ではなく古い値を使用することを宣言したり (上記の例では、プロセッサが直感に反して増分されていない値をコピーする可能性があります)、使用する値が未定義であることを宣言したりするドキュメントがあります。プログラマは、その間にプロセッサが実行できる無関係な作業を持っている可能性があります。または、正しい結果を確実にするために、プログラマがコードにNOP を挿入して、パイプラインの利点を部分的に無効にする場合があります。
ソリューション
パイプライン プロセッサは、各命令が次の命令の開始前に完了するとプログラマが想定している場合に、期待どおりに動作するために通常 3 つの手法を使用します。
- パイプラインは、必要な値が利用可能になるまで、新しい命令のスケジュールを停止したり、停止したりする可能性があります。その結果、パイプラインに空のスロット、つまりバブルが発生し、作業が実行されなくなります。
- 計算された値を、その値を生成した命令が完全にリタイアする前に、パイプライン内の他の場所にある将来の命令にルーティングする追加のデータパスを追加することができます。このプロセスはオペランド転送と呼ばれます。[6] [7]
- プロセッサは、現在の命令に依存せず、危険なしにすぐに実行できる他の命令を見つけることができます。これは、アウトオブオーダー実行と呼ばれる最適化です。
支店
通常の命令シーケンスからの分岐は、多くの場合、危険を伴います。プロセッサが 1 回のタイム サイクルで分岐を実行できない限り、パイプラインは命令を順番にフェッチし続けます。プログラマがプログラムの別の部分に制御を転送しているため、このような命令は実行できません。
条件分岐はさらに問題が多い。プロセッサは、まだ実行されていない計算に応じて分岐する場合としない場合があります。さまざまなプロセッサが停止したり、分岐予測を試みたり、2 つの異なるプログラム シーケンス (積極的実行)の実行を開始したりできる場合があります。各シーケンスは、分岐が行われるか行われないかをそれぞれ想定し、誤った推測に関連するすべての作業を破棄します。[a]
分岐予測を実装したプロセッサは、通常、正しい予測を行うため、分岐によるパフォーマンスの低下を最小限に抑えることができます。ただし、分岐の予測が不十分な場合は、正しい位置で実行を再開する前に、実行を開始した誤ったコード パスをパイプラインからフラッシュするなど、プロセッサの作業が増える可能性があります。
パイプライン プロセッサ用に作成されたプログラムは、速度の低下を最小限に抑えるために意図的に分岐を避けます。たとえば、プログラマーは通常のケースを順次実行で処理し、異常なケースを検出した場合にのみ分岐することができます。gcov などのプログラムを使用してコードカバレッジを分析すると、プログラマーは特定の分岐が実際に実行される頻度を測定し、コードを最適化するための洞察を得ることができます。場合によっては、プログラマーは通常のケースと異常なケースの両方を分岐のないコードで処理できます。
特別な状況
- 自己修正プログラム
- 自己修正コードの手法は、パイプライン プロセッサでは問題になることがあります。この手法では、プログラムの効果の 1 つとして、そのプログラム自体の今後の命令を修正することがあります。プロセッサに命令キャッシュがある場合、元の命令がすでにプリフェッチ入力キューにコピーされている可能性があり、修正は有効になりません。Zilog Z280などの一部のプロセッサでは、オンチップ キャッシュ メモリをデータのみのフェッチ用、または通常のメモリ アドレス空間の一部として構成し、自己修正命令によるこのような問題を回避できます。
- 中断不可能な指示
- 命令は、2 つの項目を交換する場合など、そのアトミック性を保証するために割り込み不可になることがあります。シーケンシャル プロセッサは命令間の割り込みを許可しますが、パイプライン プロセッサは命令をオーバーラップするため、割り込み不可の命令を実行すると、通常の命令の一部も割り込み不可になります。Cyrixのコマ バグは、割り込み不可の命令が常にパイプラインにある無限ループを使用して、シングル コア システムをハングさせます。
設計上の考慮事項
- スピード
- パイプライン化により、プロセッサのすべての部分が占有され、プロセッサが一定時間内に実行できる有効な作業量が増加します。パイプライン化により、通常、プロセッサのサイクル タイムが短縮され、命令のスループットが向上します。実行中にハザードが発生し、実行速度が理想速度よりも遅くなると、速度の利点は減少します。パイプライン化されていないプロセッサは、一度に 1 つの命令のみを実行します。次の命令の開始は、ハザードに基づいてではなく、無条件に遅延されます。
- パイプライン化されたプロセッサでは、すべての作業をモジュール化されたステップに編成する必要があるため、レジスタの複製が必要になる場合があり、これにより一部の命令のレイテンシが増大します。
- 経済
- パイプライン化により、各依存ステップが単純化されるため、数値計算などの複雑な回路を追加するよりも経済的に複雑な操作が可能になります。ただし、パイプライン化による速度向上を追求しないプロセッサの方が、製造が単純で安価になる可能性があります。
- 予測可能性
- プログラマーが危険を回避したり回避したりする必要がある環境と比較すると、非パイプライン プロセッサを使用すると、プログラミングやプログラマーのトレーニングが容易になります。また、非パイプライン プロセッサを使用すると、特定の命令シーケンスの正確なタイミングを予測することも容易になります。
図解例
右側には、フェッチ、デコード、実行、ライトバックの 4 つのステージを持つ汎用パイプラインがあります。上部の灰色のボックスは実行を待機している命令のリスト、下部の灰色のボックスは実行が完了した命令のリスト、中央の白いボックスはパイプラインです。
実行方法は次のとおりです。

パイプラインバブル

パイプライン化されたプロセッサは、パイプラインを停止してバブルを作成することで危険に対処する可能性があり、その結果、何も役に立たないサイクルが 1 つ以上発生します。
右の図では、サイクル 3 でプロセッサは紫色の命令をデコードできません。これは、プロセッサがデコードは緑色の命令の実行によって生成された結果に依存すると判断したためと考えられます。緑色の命令は実行ステージに進み、その後、予定どおりにライトバック ステージに進むことができますが、紫色の命令はフェッチ ステージで 1 サイクル停止します。サイクル 3 でフェッチされる予定だった青色の命令は 1 サイクル停止し、その後の赤色の命令も同様に停止します。
バブル(図の青い楕円)があるため、プロセッサのデコード回路はサイクル 3 の間アイドル状態です。実行回路はサイクル 4 の間アイドル状態であり、ライトバック回路はサイクル 5 の間アイドル状態です。
バブルがパイプラインから抜けると(サイクル 6)、通常の実行が再開されます。ただし、この時点ではすべてが 1 サイクル遅れています。色で示された 4 つの命令を完全に実行するには、7 サイクルではなく 8 サイクル(サイクル 1 から 8)かかります。[b]
参照
注記
- ^ ヒューレット・パッカードのPA-RISCプロセッサなど、こうしたヒューリスティックをまったく備えていない初期のパイプライン型プロセッサでは、ハザードに対処するためにプログラマーに警告するだけで済んでいた。この場合、分岐が実行されるかどうかに関係なく、分岐後の 1 つ以上の命令が実行される。これは役に立つ。たとえば、レジスタ内の数値を計算した後、条件分岐の後に、分岐の場合と分岐しない場合の両方で後続の計算に役立つ値をレジスタにロードすることができる。
- ^ ただし、バブルがあっても、少なくともこの場合には、プロセッサはパイプライン化されていないプロセッサよりもはるかに高速に命令シーケンスを実行できることに注意してください。
参考文献
- ^ Glaskowsky, Peter (2003年8月18日). 「XeleratedのXtraordinary NPU — 世界初の40Gb/sパケットプロセッサには200個のCPUが搭載されている」.マイクロプロセッサレポート. 18 (8): 12–14 . 2017年3月20日閲覧。
- ^ 「Xelerated がプログラマブル 40 Gbits/S テクノロジーをメインストリーム イーサネットに導入」2003 年 5 月 31 日。
- ^ ジョン・ポール・シェン、ミッコ・H・リパスティ (2004).最新のプロセッサ設計。マグロウヒルプロフェッショナル。ISBN 9780070570641。
- ^ Sunggu Lee (2000). コンピュータとその他の複雑なデジタルデバイスの設計. Prentice Hall . ISBN 9780130402677。
- ^ Rojas, Raúl (1997年4月~6月). 「Konrad Zuseの遺産: Z1とZ3のアーキテクチャ」(PDF) . IEEE Annals of the History of Computing . 19 (2): 5–16. doi :10.1109/85.586067. 2022年7月3日時点のオリジナルよりアーカイブ(PDF) . 2022年7月3日閲覧。(12ページ)
- ^ 「CMSC 411 講義 19、データ転送のパイプライン化」。メリーランド大学ボルチモア郡校、コンピューターサイエンスおよび電気工学部。2020年 1 月 22 日閲覧。
- ^ 「高性能コンピューティング、クラス 11 のノート」。hpc.serc.iisc.ernet.in。2000 年 9 月。2013 年 12 月 27 日時点のオリジナルよりアーカイブ。2014年 2 月 8 日閲覧。
外部リンク
- Pentium ファミリーの分岐予測 (Archive.org コピー)
- パイプラインに関する ArsTechnica の記事
- カウンターフローパイプラインプロセッサアーキテクチャ
