簡単すぎる質問に見えますが、両方についていくつかのpptを調べた後、質問しました。
どちらの方法でも、命令のスループットが向上します。また、スーパースケーリングではほとんどの場合、パイプラインも利用されます。スーパースケーリングには複数の実行ユニットがあり、パイプラインもそうですか、それともここで間違っていますか?
簡単すぎる質問に見えますが、両方についていくつかのpptを調べた後、質問しました。
どちらの方法でも、命令のスループットが向上します。また、スーパースケーリングではほとんどの場合、パイプラインも利用されます。スーパースケーリングには複数の実行ユニットがあり、パイプラインもそうですか、それともここで間違っていますか?
スーパースカラー設計では、プロセッサが1つのクロックで複数の命令を発行でき、命令を実行するための冗長機能が備わっています。シングルコア内で話しているのですが、マルチコア処理は異なります。
パイプライン処理は命令をステップに分割し、各ステップはプロセッサの異なる部分で実行されるため、複数の命令が各クロックの異なる「フェーズ」にある可能性があります。
ほとんどの場合、一緒に使用されます。ウィキペディアからのこの画像は、使用中の両方の概念を示しています。これらの概念は、グラフィカルに最もよく説明されているためです。
ここでは、5段階のパイプラインで一度に2つの命令が実行されています。
最近の編集を考慮して、さらに詳しく説明します。
上記の例では、命令は5つの段階を経て「実行」されます。これらは、IF(命令フェッチ)、ID(命令デコード)、EX(実行)、MEM(メモリの更新)、WB(キャッシュへのライトバック)です。
非常に単純なプロセッサ設計では、すべてのクロックで異なるステージが完了するため、次のようになります。
これは5クロックで1つの命令を実行します。次に、冗長実行ユニットを追加してスーパースカラーデザインを導入すると、2つの命令AとBに対して次のようになります。
5クロックで2つの命令-100%の理論上の最大ゲイン。
パイプライン処理を使用すると、パーツを同時に実行できるため、最終的には次のようになります(10個の命令AからJの場合)。
9つのクロックで、10個の命令を実行しました。パイプライン処理によって実際に物事がどこに移動するかがわかります。これはサンプルグラフィックの説明であり、フィールドで実際にどのように実装されているかではありません(これは黒魔術です)。
昔は、CPUは一度に 1 つのマシン命令しか実行していませんでした。完全に終了して初めて、CPU は次の命令をメモリ (または後で命令キャッシュ) からフェッチしました。
最終的に、誰かが、これはほとんどの場合、ほとんどの CPU が何もしないことを意味することに気付きました。これは、複数の実行サブユニット (命令デコーダー、整数演算ユニット、FP 演算ユニットなど) があり、命令の実行が保持されているためです。一度に忙しいのはそのうちの 1 つだけです。
このようにして、「単純な」パイプラインが誕生しました。1 つの命令のデコードが完了し、次の実行サブユニットに進むと、次の命令をフェッチしてデコードしないのはなぜでしょうか? このような「ステージ」が 10 ある場合、各ステージで異なる命令を処理することにより、理論的には、CPU クロックをまったく上げずに命令スループットを 10 倍に上げることができます。もちろん、これはコードに条件付きジャンプがない場合にのみ問題なく機能します (これにより、条件付きジャンプを特別に処理するために多くの余分な作業が必要になりました)。
その後、ムーアの法則が予想よりも長く正しいままであったため、CPU メーカーは、使用するトランジスタがますます増えていることに気づき、「なぜ各実行サブユニットが 1 つしかないのか?」と考えました。このように、同じことを並行して実行できる複数の実行サブユニットを備えたスーパースカラーCPUが誕生し、CPU 設計は、命令が実行されたかのように結果が同じであることを保証しながら、これらの完全に並列なユニットに命令を分散するために、はるかに複雑になりました。順次。
アナロジー:衣服を洗う
次の設備を備えたドライクリーニング店を想像してみてください。汚れた衣類や清潔な衣類を掛けるためのラック、洗濯機と乾燥機(それぞれ、一度に1つの衣類を洗うことができます)、折りたたみ式テーブル、アイロン台。
実際の洗濯と乾燥のすべてを行うアテンダントはかなり薄暗いので、ドライクリーニングの注文を受け取る店のオーナーは、各指示を非常に注意深く明示的に書き出すように特別な注意を払っています。
通常、これらの指示は次のようなものになる可能性があります。
アテンダントはティーへのこれらの指示に従い、順不同で何もしないように細心の注意を払っています。ご想像のとおり、洗濯物を完全に洗い、乾かし、折りたたむのに時間がかかり、一度に1つずつ行う必要があるため、1日の洗濯物を完成させるのに長い時間がかかります。
しかし、ある日、アテンダントが辞め、新しい、より賢いアテンダントが雇われ、その日中いつでもほとんどの機器がアイドル状態になっていることに気づきます。ズボンが乾いている間、アイロン台も洗濯機も使用されていませんでした。それで彼は自分の時間をもっと有効に使うことに決めました。したがって、上記の一連の手順の代わりに、彼はこれを行います。
これはパイプラインです。異なるコンポーネントを同時に使用するように、無関係なアクティビティを順序付けます。さまざまなコンポーネントを一度にアクティブに保つことで、効率を最大化し、実行時間を短縮します。この場合、16の「サイクル」を9に減らし、40%以上のスピードアップを実現します。
今、小さなドライクリーニング店は、はるかに速く作業できるため、より多くのお金を稼ぎ始めました。そのため、所有者は追加の洗濯機、乾燥機、アイロン台、折りたたみステーションを購入し、さらに別の係員を雇いました。今では、上記の代わりに、物事はさらに速くなります:
これはスーパースカラーデザインです。同じタスクを同時に実行できる複数のサブコンポーネント。ただし、プロセッサがその実行方法を決定します。この場合、速度がほぼ50%向上しました(18の「サイクル」で、新しいアーキテクチャはこの「プログラム」の3回の反復を実行できましたが、以前のアーキテクチャは2回しか実行できませんでした)。
386や486などの古いプロセッサは、単純なスカラープロセッサであり、受信した順序とまったく同じ順序で一度に1つの命令を実行します。PowerPC / Pentium以降の最新のコンシューマープロセッサは、パイプライン化され、スーパースカラーです。Core2 CPUは、マシンコードを分析し、それを並べ替えて実行する方法(並列で実行できるもの)を決定する独自の内部ロジックを備えているため、命令レベルの並列性を利用しながら、486用にコンパイルされたものと同じコードを実行できます。 、できないことなど)これがスーパースカラー設計の本質であり、それが非常に実用的である理由です。
対照的に、ベクトル並列プロセッサは、一度に複数のデータ(ベクトル)に対して操作を実行します。したがって、xとyaのベクトルプロセッサを追加するだけでなく、たとえばx0、x1、x2をy0、y1、y2に追加します(結果としてz0、z1、z2になります)。この設計の問題は、プロセッサの特定の並列度と緊密に結合されていることです。ベクトルプロセッサでスカラーコードを実行する場合(可能な場合)、明示的に使用する必要があるため、ベクトル並列化の利点はありません。同様に、より多くの並列処理ユニットを備えた新しいベクトルプロセッサを利用する場合(例: 3)の代わりに12の数値のベクトルを追加できるため、コードを再コンパイルする必要があります。
スーパースカラープロセッサには、投機的実行を実行する機能もあります。プロセッサを分岐する前に処理ユニットをアイドル状態にしてコードパスの実行が終了するのを待つのではなく、前のコードが処理を終了する前に、最良の推測を行い、分岐を超えてコードの実行を開始できます。前のコードの実行が分岐点に追いつくと、プロセッサは実際の分岐を分岐の推測と比較し、推測が正しかったかどうか(待機するだけですでにかなり進んでいた場合)に続行するか、投機的実行の結果を無効にし、正しい分岐のコードを実行します。
パイプライン処理は、自動車会社が自動車の製造で行うことです。彼らは、車をステージに組み立てるプロセスを分解し、さまざまな人々によって行われる組立ラインに沿ったさまざまなポイントでさまざまなステージを実行します。最終的な結果として、車は最も遅いステージの速度だけで製造されます。
CPUでは、パイプライン処理プロセスはまったく同じです。「命令」は、実行のさまざまな段階に分けられます。通常は、1。命令のフェッチ、2。オペランドのフェッチ(読み取られるレジスタまたはメモリ値)、2。計算の実行、3。結果の書き込み(メモリまたはレジスタへの書き込み)などです。 。この中で最も遅いのは計算部分である可能性があります。この場合、このパイプラインを介した命令の全体的なスループット速度は、計算部分の速度にすぎません(他の部分が「無料」であるかのように)。
マイクロプロセッサのスーパースカラーとは、単一の実行ストリームから複数の命令を同時に並列に実行する機能を指します。したがって、自動車会社が2つの組立ラインを運営している場合、明らかに2倍の数の自動車を生産する可能性があります。しかし、車にシリアル番号を付けるプロセスが最終段階であり、1人で行う必要がある場合は、2つのパイプラインを交互に切り替えて、それぞれの半分の時間で完了することを保証する必要があります。自分自身が最も遅いステージになるのを避けるために、最も遅いステージ。
マイクロプロセッサのスーパースカラーも同様ですが、通常ははるかに多くの制限があります。したがって、命令フェッチステージは通常、そのステージ中に複数の命令を生成します。これにより、マイクロプロセッサのスーパースカラーが可能になります。その場合、2つのフェッチステージ、2つの実行ステージ、および2つのライトバックステージがあります。これは明らかに2つ以上のパイプラインに一般化されます。
これはすべて問題なくダンディですが、サウンドの実行の観点からは、どちらの手法も盲目的に実行すると問題が発生する可能性があります。プログラムを正しく実行するために、命令は順番に完全に次々に実行されると想定されています。2つのシーケンシャル命令が相互に依存する計算を行うか、同じレジスタを使用する場合、問題が発生する可能性があります。後の命令は、オペランドフェッチステージを実行する前に、前の命令のライトバックが完了するのを待つ必要があります。したがって、実行する前に2番目の命令を2段階停止する必要があります。これにより、最初にこれらの手法で得られた目的が無効になります。
説明するのが少し複雑なストールの必要性の問題を減らすために使用する多くのテクニックがありますが、それらをリストします:1。レジスタ転送、(ストアからロードへの転送も)2.レジスタの名前変更、3。スコアボード、4 。アウトオブオーダー実行。5.ロールバック(およびリタイア)を使用した投機的実行すべての最新のCPUは、これらの手法のほとんどすべてを使用して、スーパースカラーとパイプラインを実装します。ただし、これらの手法では、ストールが避けられなくなる前に、プロセッサ内のパイプラインの数に関して収穫逓減が発生する傾向があります。実際には、CPUメーカーは1つのコアで4つを超えるパイプラインを作成していません。
マルチコアは、これらの手法とは何の関係もありません。これは基本的に、2つのマイクロプロセッサを組み合わせて単一のチップに対称型マルチプロセッシングを実装し、共有する意味のあるコンポーネント(通常はL3キャッシュとI / O)のみを共有します。ただし、Intelが「ハイパースレッディング」と呼ぶ手法は、シングルコアのスーパースカラーフレームワーク内にマルチコアのセマンティクスを仮想的に実装しようとする方法です。したがって、単一のマイクロアーキテクチャには2つ(またはそれ以上)の仮想コアのレジスタが含まれ、2つ(またはそれ以上)の異なる実行ストリームから命令をフェッチしますが、共通のスーパースカラーシステムから実行します。レジスターは相互に干渉できないため、並列処理が多くなり、ストールが少なくなる傾向があるという考え方です。したがって、2つの仮想コア実行ストリームを半分の速度で実行するよりも、ストールが全体的に減少するため、より優れています。これは、Intelがパイプラインの数を増やす可能性があることを示唆しているように思われます。ただし、この手法は実際の実装にはやや欠けていることがわかっています。ただし、スーパースカラー手法には不可欠なので、とにかく言及しました。
パイプライン処理とは、同じサイクルで複数の命令のさまざまなステージを同時に実行することです。これは、命令処理をステージに分割し、ステージごとに専用のユニットと中間結果を格納するためのレジスタを備えていることに基づいています。
スーパースケーリングとは、CPUに存在する複数の実行ユニットに複数の命令(またはマイクロ命令)をディスパッチすることです。したがって、CPUの冗長ユニットに基づいています。
もちろん、このアプローチは互いに補完し合うことができます。