スーパースケーリングとパイプラインの違いは何ですか?
-
11-09-2019 - |
質問
質問するには単純すぎるように見えますが、両方についていくつかのpptを読んだ後に質問しました。
どちらの方法でも命令のスループットが向上します。また、スーパースケーリングでは、ほとんどの場合、パイプラインも利用されます。スーパースケーリングには複数の実行ユニットがあるので、パイプラインも同様ですか、それともここで私が間違っているのでしょうか?
解決
スーパースカラー設計 これには、プロセッサが 1 つのクロックで複数の命令を発行でき、命令を実行するための冗長機能が含まれます。ここで話しているのは単一コア内での話です、念のため言っておきますが、マルチコア処理は異なります。
パイプライン化 命令をステップに分割し、各ステップがプロセッサの異なる部分で実行されるため、複数の命令がクロックごとに異なる「フェーズ」になる可能性があります。
これらはほとんど常に一緒に使用されます。Wikipedia からのこの画像は、使用中の両方の概念を示しています。これらの概念は図で説明するのが最も適切です。
ここでは、5 ステージのパイプラインで一度に 2 つの命令が実行されています。
最近の編集を踏まえてさらに詳しく説明すると、次のようになります。
上の例では、命令は 5 つの段階を経て「実行」されます。これらは、IF (命令フェッチ)、ID (命令デコード)、EX (実行)、MEM (更新メモリ)、WB (キャッシュへのライトバック) です。
非常に単純なプロセッサ設計では、クロックごとに異なるステージが完了するため、次のようになります。
- もし
- ID
- 元
- メム
- WB
これは 1 つの命令を 5 クロックで実行することになります。次に、冗長実行ユニットを追加してスーパースカラ設計を導入すると、2 つの命令 A と B に対して次のようになります。
- IF(A) IF(B)
- ID(A) ID(B)
- EX(A) EX(B)
- メム(A) メム(B)
- WB(A) WB(B)
5 クロックで 2 つの命令 -- 理論上の最大ゲインは 100%。
パイプラインでは各部分を同時に実行できるため、最終的には次のようになります (A から J までの 10 個の命令の場合)。
- IF(A) IF(B)
- ID(A) ID(B) IF(C) IF(D)
- EX(A) EX(B) ID(C) ID(D) IF(E) IF(F)
- MEM(A) MEM(B) EX(C) EX(D) ID(E) ID(F) IF(G) IF(H)
- WB(A) WB(B) MEM(C) MEM(D) EX(E) EX(F) ID(G) ID(H) IF(I) IF(J)
- WB(C) WB(D) MEM(E) MEM(F) EX(G) EX(H) ID(I) ID(J)
- WB(E) WB(F) MEM(G) MEM(H) EX(I) EX(J)
- WB(G) WB(H) MEM(I) MEM(J)
- WB(I) WB(J)
9 クロックで 10 個の命令を実行しました。パイプラインによって実際に処理が進むことがわかります。これはサンプル グラフィックの説明であり、実際に現場でどのように実装されるかではありません (つまり、 黒魔術).
他のヒント
長い間 以前、CPU が実行されました 一度に機械命令は 1 つだけ. 。それが完全に終了した場合にのみ、CPU はメモリ (または、その後は命令キャッシュ) から次の命令をフェッチします。
最終的に、誰かが、これは、いくつかの実行サブユニット (命令デコーダ、整数演算ユニット、FP 演算ユニットなど) があり、命令の実行が保持されているため、ほとんどの時間、CPU のほとんどが何も実行しないことを意味していることに気づきました。一度にそのうちの 1 人だけが忙しいのです。
したがって、 "単純" パイプライン化 うまれた:1 つの命令のデコードが完了し、次の実行サブユニットに進むと、なぜすでに次の命令をフェッチしてデコードしないのでしょうか?そんなのが10個あったら」段階"、それでは 各ステージで異なる命令を処理させる 理論的には、CPU クロックをまったく増加させずに命令スループットを 10 倍に高めることができます。もちろん、これはコード内に条件付きジャンプがない場合にのみ完璧に機能します (これにより、条件付きジャンプを特別に処理するために多くの余分な労力が必要になりました)。
その後、ムーアの法則が予想よりも長く正しい状態が続いたため、CPU メーカーは使用するトランジスタがますます増えていることに気づき、「なぜ各実行サブユニットが 1 つしかないのか?」と考えました。したがって、 スーパースカラー CPU搭載 複数の実行サブユニットにより、 同じ 並行してあるもの が誕生し、命令が順番に実行された場合と同じ結果が得られるようにしながら、これらの完全に並列したユニットに命令を分散させるために、CPU 設計は非常に複雑になりました。
類推:衣類の洗濯
次の設備を備えたクリーニング店を想像してください。汚れた服やきれいな服を掛けておくためのラック、洗濯機と乾燥機(それぞれ一度に 1 枚の服を洗うことができます)、折りたたみテーブル、アイロン台。
実際の洗濯と乾燥をすべて行う店員はかなり頭が悪いので、ドライクリーニングの注文を受ける店主は、それぞれの指示を非常に慎重かつ明確に書き出すことに特別な注意を払っています。
通常、これらの指示は次のようなものになるでしょう。
- ラックからシャツを取り出す
- シャツを洗う
- シャツを乾かす
- シャツにアイロンをかける
- シャツをたたむ
- シャツをラックに戻します
- 棚からパンツを取る
- ズボンを洗います
- ズボンを乾かす
- ズボンを折ります
- ズボンをラックに戻します
- ラックからコートを取る
- コートを洗う
- コートを乾かす
- コートにアイロンをかける
- コートをラックに戻します
係員はこれらの指示に従い、決して順序を外さないように細心の注意を払いながらティーグラウンドに向かいます。ご想像のとおり、洗濯物を1枚ずつ丸洗い、乾燥、たたむのに時間がかかり、すべてを一度に行う必要があるため、その日の洗濯を終えるのに時間がかかります。
しかし、ある日、その係員が辞めてしまい、より賢い新しい係員が雇われましたが、その係員は、日中のどの時間帯でもほとんどの機器がアイドル状態になっていることに気づきました。ズボンを乾燥している間、アイロン台も洗濯機も使用されていませんでした。そこで彼は時間を有効に活用しようと決心しました。したがって、上記の一連の手順の代わりに、次のことを実行します。
- ラックからシャツを取り出す
- シャツを洗い、 棚からパンツを取る
- シャツを乾かして、 ズボンを洗います
- シャツにアイロンをかけて、 ズボンを乾かす
- シャツをたたんで、 (ラックからコートを取る)
- シャツをラックに戻し、 ズボンを折ります, (コートを洗います)
- ズボンをラックに戻します, (コートを乾かします)
- (コートにアイロンをかける)
- (コートをラックに戻します)
これがパイプライン化です。 無関係なアクティビティを順序付けして、異なるコンポーネントを同時に使用する。さまざまなコンポーネントをできるだけ多く同時にアクティブにしておくことで、効率が最大化され、実行時間が短縮されます。この場合、16 の「サイクル」が 9 に削減され、40% 以上の速度が向上します。
さて、この小さなドライクリーニング店は、作業が非常に早くなったことで収入が増え始めたので、オーナーは追加の洗濯機、乾燥機、アイロン台、折りたたみステーションを購入し、さらに別の店員を雇いました。上記の代わりに、処理はさらに高速になり、次のようになります。
- ラックからシャツを取り出し、 棚からパンツを取る
- シャツを洗い、 ズボンを洗います, (ラックからコートを取る)
- シャツを乾かして、 ズボンを乾かす, (コートを洗います)
- シャツにアイロンをかけて、 ズボンを折ります, (コートを乾かします)
- シャツをたたんで、 ズボンをラックに戻します, (コートにアイロンをかける)
- シャツをラックに戻し、 (コートをラックに戻します)
これがスーパースカラ設計です。 複数のサブコンポーネントは同じタスクを同時に実行できますが、その実行方法はプロセッサが決定します。この場合、速度が 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 個の数値のベクトルを追加できる) コードを再コンパイルする必要があります。ベクトル プロセッサの設計は、設計が容易であり、科学と工学には多くの自然並列処理を伴う大きなクラスの問題があるため、最古の世代のスーパー コンピューターで人気がありました。
スーパースカラ プロセッサは、投機的実行を実行する機能も持つことができます。分岐する前に処理ユニットをアイドル状態にしてコード パスの実行が完了するのを待つのではなく、プロセッサは最善の推測を行って、前のコードの処理が終了する前に分岐を越えてコードの実行を開始できます。前のコードの実行が分岐点に追いつくと、プロセッサは実際の分岐と分岐推測を比較し、推測が正しければ続行することができます (待機しているだけで分岐点がすでにかなり進んでいる場合)。投機的実行の結果を無効にし、正しい分岐のコードを実行します。
パイプラインは、自動車会社が自分の車の製造に何をするかです。彼らはステージに車を一緒に入れてのプロセスを打破し、異なる人々によって行わ組立ラインに沿って異なる点で異なるステージを行います。最終結果は、車だけでは最も遅い段階の正確速度で製造されていることである。
のCPUでは、パイプラインプロセスはまったく同じです。 「命令」実行の様々な段階に分割され、通常は1のようなものが2.(読み取られるレジスタまたはメモリ値)オペランドをフェッチ、命令をフェッチし、2計算を実行、(メモリやレジスタへ)3.ライト結果。これの最も遅いが、このパイプラインを通る命令の全体的なスループット速度が演算部のちょうど速度である場合には、演算部、かもしれない(他の部分は「自由」であるかのように。)
マイクロプロセッサにおけるスーパースカラー並列に一度に単一の実行ストリームからの複数の命令を実行する能力を指します。自動車会社は、2本の組立ラインを実行した場合それでは、明らかに彼らは、2倍の数の車を生産することができます。車のシリアル番号を置くのプロセスが最終段階にあったと一人の人間によって行われなければならなかった場合でも、それらは2つのパイプラインの間で交互に、彼らはそれぞれがの半分の時間で行われ得ることができることを保証しなければならないでしょう最も遅い段階自らなることを避けるために、最も遅い段階ます。
マイクロプロセッサにおけるスーパースカラは似ていますが、通常ははるかに多くの制限があります。だから、命令はステージは、典型的には、その段階で複数の命令を生成しますフェッチ - これは、マイクロプロセッサでは、スーパースカラ可能にするものです。 2つのフェッチステージ、2つの実行段階、および2つのライトバックのステージがあるでしょう。これは明らかに超えるだけの2つのパイプラインに一般ます。
これは、すべての罰金とダンディですが、盲目的に行われた場合、音の実行の観点から、両方の技術は問題につながる可能性があります。プログラムを正しく実行するためには、命令は順序で完全に次々に実行されているものとします。 2つの順次命令は相互依存の計算を持っているか、同じレジスタを使用する場合は、問題がある可能性があり、後の命令は、オペランドフェッチステージ実行する前に完了するために、前の命令の書き戻しを待つ必要があります。したがって、あなたは最初の場所でこれらの技術によって得られたものの目的に反している、それが実行される前に2段、第2の命令をストールする必要があります。
多くの技術を記述するために少し複雑ですが、私はそれらを一覧表示されますこと失速する必要の問題を軽減するために使用するがあります:1。レジスタ転送、(また、転送ロードするために保管)2.レジスタリネーミングは、3 score-搭乗、4アウトオブオーダー実行。ロールバック(退職)5.投機的実行すべての現代のCPUは、スーパースカラとパイプラインを実装するためにほとんどすべてのこれらの技術を使用しています。しかし、これらの技術は屋台が避けられないになる前プロセッサにおけるパイプラインの数に関して収穫逓減している傾向にあります。実際には全くCPUメーカーは、単一コアで4つの以上のパイプラインを行いません。
マルチコアは、これらの技術のいずれかとは何の関係もありません。これは、基本的に単一のチップ上に対称型マルチプロセッシングを実現するために2つのマイクロプロセッサを突進し、共有するために意味をなすコンポーネントのみ共有(典型的にはL3キャッシュ、およびI / O)されます。しかし、Intelは「ハイパースレッディング」と呼ぶ技術は事実上シングルコアのスーパースカラ枠組みの中で、マルチコアのセマンティクスを実装しようとする方法です。そう単一のマイクロアーキテクチャは、2つ(またはそれ以上)の仮想コアのレジスタを含み、2つ(またはそれ以上)の異なる実行ストリームから命令をフェッチするが、一般的なスーパースカラシステムから実行します。アイデアは、レジスタが互いに干渉することはできませんので、そこにすることです少数の屋台につながる多くの並列処理になる傾向があります。そうではなく、単純に半分の速度で2つの仮想コアの実行ストリームを実行するよりも、それは屋台の全体的な減少による優れています。これは、Intelがパイプラインの数を増やすことができることを示唆ように思われます。しかし、この技術は、やや実用的な実装に欠けていることが見出されています。それはスーパースカラ技術に不可欠であるとして、しかし、私はとにかくそれを言及しています。
パイプラインは、同じサイクルで複数の命令の異なる段階の同時実行です。それは段階に分割命令処理に基づいて、中間結果を格納するための特殊な各段の単位レジスタとを備えている。
SuperscalingはCPUに存在する複数の実行ユニットに複数の命令(またはマイクロ命令)を派遣しています。これは、CPUにおける冗長ユニットにこのように基づいている。
もちろん、このアプローチは、お互いを補完することができます。