web-dev-qa-db-ja.com

スーパースケーリングとパイプラインの違いは何ですか?

まあ、質問するにはあまりにも単純な質問に見えますが、私は両方でいくつかのポイントを通過した後に尋ねました。

どちらの方法でも、命令のスループットが向上します。また、スーパースケーリングでは、ほぼ常にパイプライン処理も使用されます。スーパースケーリングには複数の実行ユニットがあるので、パイプライン処理を行うのですか、それとも間違っていますか?

37
Alex Xander

スーパースカラー設計では、プロセッサが単一のクロックで複数の命令を発行でき、命令を実行するための冗長機能が使用されます。私たちはシングルコア内で話しているのですが、マルチコア処理は異なることを覚えておいてください。

Pipeliningは、命令をステップに分割します。各ステップはプロセッサの異なる部分で実行されるため、複数の命令が各クロックで異なる「フェーズ」になる可能性があります。 。

それらはほとんど常に一緒に使用されます。ウィキペディアのこの画像は、これらの概念がグラフィカルに最もよく説明されているため、使用中の両方の概念を示しています。

Superscalar/pipelining in use

ここでは、5段階のパイプラインで2つの命令が一度に実行されています。


あなたの最近の編集を考えると、さらに細分化するには:

上記の例では、命令は5段階を経て「実行」されます。これらは、IF(命令フェッチ)、ID(命令デコード)、EX(実行)、MEM(メモリ更新)、WB(キャッシュへの書き戻し)です。

非常に単純なプロセッサ設計では、クロックごとに異なるステージが完了するため、次のようになります。

  1. IF
  2. ID
  3. EX
  4. MEM
  5. WB

5クロックで1つの命令を実行します。次に、冗長実行ユニットを追加してスーパースカラーデザインを導入すると、2つの命令AとBに対して、これができます。

  1. IF(A)IF(B)
  2. ID(A)ID(B)
  3. EX(A)EX(B)
  4. MEM(A)MEM(B)
  5. WB(A)WB(B)

5クロックで2つの命令-理論上の最大ゲイン100%。

パイプライン処理により、パーツを同時に実行できるため、次のような結果になります(AからJの10個の命令の場合)。

  1. IF(A)IF(B)
  2. ID(A)ID(B)IF(C)IF(D)
  3. EX(A)EX(B)ID(C)ID(D)IF(E)IF(F)
  4. MEM(A)MEM(B)EX(C)EX(D)ID(E)ID(F)IF(G)IF(H)
  5. WB(A)WB(B)MEM(C)MEM(D)EX(E)EX(F)ID(G)ID(H)IF(I)IF(J)
  6. WB(C)WB(D)MEM(E)MEM(F)EX(G)EX(H)ID(I)ID(J)
  7. WB(E)WB(F)MEM(G)MEM(H)EX(I)EX(J)
  8. WB(G)WB(H)MEM(I)MEM(J)
  9. WB(I)WB(J)

9クロックで、10個の命令を実行しました。パイプライン処理が実際に物事を進める場所を確認できます。そして、それはグラフィックの例の説明であり、実際にフィールドに実装される方法ではありません(black magic)。

Superscalar および Instruction Pipeline のWikipediaの記事はかなり優れています。

56
Jed Smith

長い時間前、CPUが実行されました一度に1つのマシン命令のみ。 CPUが完全に終了した場合にのみ、CPUはメモリ(または、後に命令キャッシュ)から次の命令をフェッチしました。

最終的に、いくつかの実行サブユニット(命令デコーダー、整数演算ユニット、およびFP演算ユニットなど)など)、命令を実行すると、一度に1つだけがビジーになります。

したがって、「simplepipeliningが生まれました。1つの命令がデコードを完了して、次の実行サブユニットに進むと、なぜまだ次の命令をフェッチしてデコードしていませんか? 10個の「stages」がある場合、-各ステージで異なる命令を処理する命令のスループットを理論的に増やすことができますCPUクロックをまったく増やすことなく10倍!もちろん、これは、コードに条件付きジャンプがない場合にのみ正常に機能します(これにより、条件付きジャンプを特別に処理するための多くの余分な努力が必要になりました)。

後に、ムーアの法則が予想よりも長く続いているため、CPUメーカーは、使用するトランジスタが増え続け、「各実行サブユニットが1つしかないのはなぜか」と考えました。このように、スーパースカラー複数の実行サブユニットがsameを並行して実行できるを持つCPUが生まれました、およびCPU設計が非常に複雑になり、これらの完全に並列なユニットに命令を分散しながら、結果が命令が順次実行された場合と同じになるようにしました。

32

アナロジー:洗濯物

次の設備を備えたドライクリーニング店を想像してください:汚れたまたはきれいな服を吊るすためのラック、洗濯機と乾燥機(それぞれ一度に1つの衣服を洗うことができます)、折りたたみ式テーブル、アイロン台。

実際の洗濯と乾燥のすべてを行うアテンダントはかなり曖昧であるため、ドライクリーニングの注文を受ける店主は、各指示を非常に注意深く明示的に書き出すように特別な注意を払っています。

通常、これらの指示は次のようなものです。

  1. ラックからシャツを取ります
  2. シャツを洗う
  3. シャツを乾かす
  4. シャツにアイロンをかけます
  5. シャツを折ります
  6. シャツをラックに戻す
  7. ラックからズボンを取り出します
  8. ズボンを洗う
  9. ズボンを乾かす
  10. パンツをたたむ
  11. ズボンをラックに戻す
  12. ラックからコートを取ります
  13. コートを洗う
  14. コートを乾かす
  15. コートにアイロンをかけます
  16. コートをラックに戻す

アテンダントは、ティーへのこれらの指示に従い、故障しないように注意してください。ご想像のとおり、各洗濯物を完全に洗浄、乾燥、折り畳むのに長い時間がかかるため、1日の洗濯を完了するには長い時間がかかります。

しかし、ある日、アテンダントが辞め、新しい、よりスマートなアテンダントが雇われ、ほとんどの機器が日中の任意の時間にアイドル状態になっていることに気付きます。ズボンが乾いている間、アイロン台も洗濯機も使用していませんでした。そこで、彼は自分の時間をより有効に活用することにしました。したがって、上記の一連の手順の代わりに、彼はこれを行います。

  1. ラックからシャツを取ります
  2. シャツを洗って、ラックからズボンを取ります
  3. シャツを乾かし、ズボンを洗います
  4. シャツにアイロンをかけ、パンツを乾かします
  5. シャツを折ります、(ラックからコートを取ります)
  6. シャツをラックに戻し、パンツを折る(コートを洗う)
  7. パンツをラックに戻す(コートを乾かす)
  8. (コートをアイロン)
  9. (ラックにコートを戻す)

これはパイプライン処理です。異なるコンポーネントを同時に使用するように無関係なアクティビティをシーケンスします。一度に多くの異なるコンポーネントをアクティブに保つことで、効率を最大化し、実行時間を短縮します。この場合、16の「サイクル」を9に削減し、40%以上の高速化を実現します。

今、小さなドライクリーニングショップは、非常に速く働くことができるため、より多くのお金を稼ぎ始めたので、所有者は追加の洗濯機、乾燥機、アイロン台、折り畳みステーションを購入し、さらに別のアテンダントを雇いました。物事はさらに速くなり、上記の代わりに、次のことができます。

  1. ラックからシャツを取り、ラックからパンツを取ります
  2. シャツを洗う、パンツを洗う(ラックからコートを取る)
  3. シャツを乾かし、パンツを乾かします(コートを洗います)
  4. シャツにアイロンをかけ、パンツを折る(コートを乾かす)
  5. シャツを折る、パンツをラックに戻す(コートをアイロンする)
  6. シャツをラックに戻す(コートをラックに戻す)

これはスーパースカラー設計です。複数のサブコンポーネントが同じタスクを同時に実行できますが、その方法をプロセッサが決定します。この場合、ほぼ50%の速度向上が得られました(18の「サイクル」で、新しいアーキテクチャはこの「プログラム」の3回の反復を実行できましたが、以前のアーキテクチャは2回しか実行できませんでした)。

386や486などの古いプロセッサは単純なスカラープロセッサであり、一度に1つの命令を受信した順序で実行します。 PowerPC/Pentium以降の最新の民生用プロセッサは、パイプライン化され、スーパースカラーです。 Core2 CPUは、486用にコンパイルされたのと同じコードを実行できますが、マシンコードを分析し、それを並べ替えて実行する方法を決定する独自の内部ロジックが含まれているため、命令レベルの並列性を活用しています(並列で実行できるもの) 、できないことなど)これがスーパースカラーデザインの本質であり、なぜそれが実際的であるかです。

対照的に、ベクトル並列プロセッサは、複数のデータに対して一度に操作を実行します(ベクトル)。したがって、ベクトルプロセッサは、xとyを単に追加する代わりに、たとえばx0、x1、x2をy0、y1、y2に追加します(結果としてz0、z1、z2)。この設計の問題は、プロセッサの特定の並列度と密接に関連していることです。ベクトルプロセッサでスカラーコードを実行する場合(可能な場合)、ベクトル並列化を明示的に使用する必要があるため、ベクトル並列化の利点はありません。同様に、より多くの並列処理ユニットを持つ新しいベクトルプロセッサを利用する場合3)の代わりに12の数字のベクトルを追加できる場合、コードを再コンパイルする必要があります。ベクトルプロセッサの設計は、設計が簡単で、自然な並列処理を伴う科学および工学の問題が多数存在するため、最も古い世代のスーパーコンピューターで人気がありました。

スーパースカラープロセッサには、投機的実行を実行する機能もあります。プロセッサを分岐させる前に、処理ユニットをアイドル状態にしてコードパスの実行が完了するのを待つのではなく、最良の推測を行い、前のコードの処理が完了する前に分岐を過ぎてコードの実行を開始できます。前のコードの実行が分岐点に追いつくと、プロセッサは実際の分岐を分岐推測と比較し、推測が正しかった場合(既に待機している場所よりもずっと先に)続行するか、投機的実行の結果を無効にし、正しいブランチのコードを実行します。

10
Wedge

パイプラインは、自動車会社が自動車の製造で行うことです。彼らは車を複数の段階にまとめるプロセスを分解し、さまざまな人が行う組立ラインに沿ってさまざまなポイントでさまざまな段階を実行します。最終的な結果として、自動車は最も遅いステージのみの速度で製造されます。

CPUでは、パイプライン処理はまったく同じです。 「命令」は、実行のさまざまな段階に分けられます。通常、1。フェッチ命令、2。フェッチオペランド(読み込まれるレジスタまたはメモリ値)、2。計算の実行、3。結果の書き込み(メモリまたはレジスタへ) 。これが最も遅いのは計算部分である可能性があります。この場合、このパイプラインを介した命令の全体的なスループット速度は、計算部分の速度にすぎません(他の部分が「フリー」であるかのように)

マイクロプロセッサのスーパースカラーとは、単一の実行ストリームから同時に複数の命令を同時に実行する機能のことです。したがって、自動車会社が2つの組立ラインを運営している場合、明らかに2倍の数の自動車を生産できます。しかし、車にシリアル番号を付けるプロセスが最終段階であり、1人で行わなければならない場合、2つのパイプラインを交互に切り替えて、それぞれの半分の時間でそれぞれを完了できるようにする必要があります。自身が最も遅い段階になることを避けるための最も遅い段階。

マイクロプロセッサのスーパースカラーも似ていますが、通常ははるかに多くの制限があります。そのため、命令フェッチステージは通常、ステージ中に複数の命令を生成します。これが、マイクロプロセッサでスーパースカラーを可能にします。その場合、2つのフェッチステージ、2つの実行ステージ、および2つの書き戻しステージがあります。これは明らかに2つ以上のパイプラインに一般化されます。

これはすべてうまくいきますが、音の実行の観点から、両方の手法は盲目的に行われると問題を引き起こす可能性があります。プログラムが正しく実行されるためには、命令が順番に完全に次々と実行されると想定されています。 2つの順次命令に相互依存の計算がある場合、または同じレジスタを使用する場合、問題が発生する可能性があります。後の命令は、オペランドフェッチステージを実行する前に前の命令の書き戻しが完了するのを待つ必要があります。したがって、2番目の命令を実行する前に2段階でストールする必要があります。これは、そもそもこれらの手法によって得られた目的を無効にします。

説明するのが少し複雑なストールの必要性の問題を軽減するために使用する多くのテクニックがありますが、それらをリストします:1.レジスタ転送、(ストア転送からロード転送)2.レジスタ名の変更、3。スコアボード、4 。順不同の実行。 5.ロールバック(およびリタイア)による投機的実行最新のすべてのCPUは、これらの手法のほとんどを使用して、スーパースカラーとパイプラインを実装します。ただし、これらの手法では、ストールが避けられなくなる前に、プロセッサ内のパイプラインの数に関してリターンが減少する傾向があります。実際には、単一のコアで4つを超えるパイプラインを作成するCPUメーカーはありません。

マルチコアは、これらのテクニックとは関係ありません。これは基本的に、2つのマイクロプロセッサを1つのチップに対称型マルチプロセッシングで実装し、共有する意味のあるコンポーネント(通常はL3キャッシュとI/O)のみを共有することです。ただし、Intelが「ハイパースレッディング」と呼ぶ手法は、シングルコアのスーパースカラーフレームワーク内でマルチコアのセマンティクスを仮想的に実装しようとする方法です。したがって、単一のマイクロアーキテクチャには2つ(またはそれ以上)の仮想コアのレジスタが含まれ、2つ(またはそれ以上)の異なる実行ストリームから命令をフェッチしますが、共通のスーパースカラーシステムから実行します。考え方は、レジスタが互いに干渉することができないため、より多くの並列処理が行われ、ストールが少なくなる傾向があるというものです。そのため、2つの仮想コア実行ストリームを半分の速度で単に実行するよりも、ストールが全体的に減少するため、より適切です。これは、Intelがパイプラインの数を増やすことができることを示唆しているように思われます。ただし、この手法は実際の実装ではやや欠けていることがわかっています。しかし、それはスーパースカラー技術に不可欠なので、とにかく言及しました。

6
Paul Hsieh

パイプライン処理は、同じサイクルで複数の命令の異なるステージを同時に実行することです。これは、命令処理をステージに分割し、各ステージと中間結果を保存するためのレジスターに特化したユニットを持つことに基づいています。

スーパースケーリングは、CPUに存在する複数の実行ユニットに複数の命令(またはマイクロ命令)をディスパッチします。したがって、CPUの冗長ユニットに基づいています。

もちろん、このアプローチは互いに補完できます。

2
elder_george