tl; dr
パイプラインが短いほど、クロック速度は速くなりますが、スループットが低下する場合があります。また、下部の回答#2と3を参照してください(これらは短く、約束します)。
長いバージョン:
ここで考慮すべきことがいくつかあります。
- すべての指示に同じ時間がかかるわけではありません
- すべての命令がすぐに実行された(または10から20)命令に依存するわけではない
非常に単純化されたパイプライン(最新のIntelチップで発生することは複雑を超えています)には、いくつかの段階があります。
フェッチ->デコード->メモリアクセス->実行->ライトバック->プログラムカウンターの更新
それぞれに->発生する時間コストがあります。さらに、ティック(クロックサイクル)ごとに、すべてが1つのステージから次のステージに移動するため、最も遅いステージがすべてのステージの速度になります(実際には、それらの長さが可能な限り同じになります)。
5つの命令があり、それらを実行したいとします(ウィキペディアからの写真、ここではPCの更新は行われていません)。次のようになります。
各命令が完了するまでに5クロックサイクルかかりますが、完了した命令はサイクルごとにパイプラインから出てきます。各ステージにかかる時間が40 nsで、中間ビットに15 ns(上記の6ステージパイプラインを使用)の場合、最初の命令を取り出すには40 * 6 + 5 * 15 = 315 nsかかります。
対照的に、パイプラインを完全に削除する場合(ただし、他のすべてを同じに保つ場合)、最初の命令を出すのにたった240 nsしかかかりません。(この「最初の」命令を取り出す速度の差はレイテンシと呼ばれます。一般に、スループット(1秒あたりの命令数)よりも重要度は低くなります)。
しかし、実際の違いは、パイプライン化された例では、60 nsごとに(最初のインストルメントの後に)新しいインストルメントが実行されることです。パイプライン化されていないものでは、毎回240かかります。これは、パイプラインがスループットの向上に優れていることを示しています。
さらに一歩進んで、メモリアクセスの段階では、(アドレスの計算を行うために)追加ユニットが必要になるようです。つまり、そのサイクルのmemステージを使用しない命令があれば、別の追加を行うことができます。したがって、1つのティックで1つのプロセッサで2つの実行ステージ(1つはメモリアクセスステージにあります)を実行できます(スケジュールは悪夢ですが、そこには行きません。さらに、PC更新ステージにも追加ユニットが必要です。ジャンプの場合、1ティックで3つの追加実行状態を実行できます)。パイプラインを持つことにより、2つ(またはそれ以上)の命令が異なるステージ(またはleapfogステージなど)を使用できるように設計でき、貴重な時間を節約できます。
これを行うために、プロセッサは多くの「魔法」を実行することに注意してください(順不同の実行、分岐予測など)。しかし、これにより、パイプラインがない場合よりも複数の命令を高速に出すことができます。長い管理は非常に難しく、ステージ間で待機するだけでコストが高くなります)。逆に、パイプラインを長くしすぎると、異常なクロック速度を得ることができますが、元の利点の多くを失うことがあります(複数の場所に存在し、同時に使用できる同じタイプのロジックを持つこと) )。
回答#2:
SIMD(単一命令複数データ)プロセッサ(ほとんどのGPUと同様)は、多くの情報ビットに対して多くの作業を行いますが、処理に時間がかかります。すべての値の読み込みには時間がかかります(ある程度広いバスを使用することでこのオフセットは相殺されますが、クロックが遅くなります)が、一度により多くの命令を実行できます(サイクルあたりのより効果的な命令)。
回答#3:
サイクルカウントを人為的に「チート」して、サイクルごとに2つの命令を実行できるようにするためです(クロック速度を半分にするだけです)。1クロックではなく2ティックごとに何かを行うことも可能です(2倍のクロック速度を与えますが、命令を1秒ごとに変更することはできません)。