CPUはどのようにしてサイクルごとに複数の命令を配信できますか?


41

ウィキペディアの1秒あたり手順では、i7 3630QMが3.2 GHzの周波数で最大110,000 MIPSを提供すると述べています。(110 / 3.2命令)/ 4コア=コアあたりサイクルあたり〜8.6命令ですか?!単一のコアがサイクルごとに複数の命令を提供するにはどうすればよいですか?

私の理解では、パイプラインはクロックごとに1つの結果のみを配信できるはずです。

これらは私の考えです:

  • 内部周波数は実際には3.2 GHzよりも高い
  • CPUの一部は非同期で、私のような謙虚な人間には理解できない
  • コアごとに複数の同時パイプラインがあります
  • パイプラインは1クロックあたりの結果以上を提供でき、命令はパイプラインステージをスキップでき、複数のプリフェッチャーが対応できます
  • 私は何かが欠けています

1
これは110,000 Dhrystone MIPSを提供するので、MIPSではなくDMIPSを直接見ることができます。en.wikipedia.org/wiki/Dhrystone

回答:


44

まず、キーランのコメントターボJの回答が指摘しているように、測定値はネイティブ MIPS ではなく113,093 Dhrystone MIPSでした。

i7 3630QMのIvy Bridgeマイクロアーキテクチャーは、サイクルごとに4つの融合µopしかコミットできませんが、サイクルごとに6 µopの実行を開始できます。(コードのトレース内の融合されたµop の数は、命令の数にほぼ等しくなります。一部の複雑な命令は、融合されていない複数のµopにデコードされます。条件付きジャンプが続きます。)

1つのサイクルで複数の命令を実行する方法に関する2つの推測は非常に有効であり、実際のプロセッサで使用されています。最初のPentium 4の「ファイアボール」ALUでは、より速い内部クロックが使用されるという最初の推測が使用されました。これらのALUは、コアの残りの2倍の周波数でクロックされましたが、これはすでに比較的高かったです。

(これは、1サイクルで加算の下半分が行われるスタッガードALUを使用することで達成され、従属演算は次のサイクルで結果の下半分を使用できます。加算、xor、左シフトなどの演算の場合結果の下半分を生成するためにオペランドの下半分のみが必要な場合、このようなスタガリング(幅パイプライン処理とも呼ばれます)により、単一サイクルの結果待ち時間と単一サイクルのスループットが可能になります。

HyperSPARCは、やや関連する技術であるカスケードALUを使用しました。HyperSPARCは、2つのALUからの結果を3番目のALUに送りました。これにより、1つのサイクルで2つの独立した操作と3つ目の依存する操作を実行できました。

「コアごとに複数の同時パイプラインがある」という推測は、使用されている他の手法です。このタイプの設計はスーパースカラーと呼ばれ、1サイクルで実行される操作の数を増やす最も一般的な方法です。

注目に値するかもしれない命令実行のその他のオッズと終了もいくつかあります。一部の操作は、通常の実行ユニットの外部でより効率的に実行できます。移動除去の手法では、アウトオブオーダープロセッサでレジスタ名の変更を使用して、レジスタ名の変更中に移動操作を実行します。移動は、名前変更テーブル(レジスタエイリアステーブルと呼ばれる)のある位置から別の位置に物理レジスタ番号をコピーするだけです。これにより、実行幅が効果的に増加するだけでなく、依存関係も削除されます。この手法は、スタックベースのx87で初期に使用されていましたが、現在ではIntelの高性能x86プロセッサで広く使用されています。(x86で破壊的で2オペランドの命令を使用すると、移動の除去が通常のRISCよりも便利になります。)

移動除去に似た手法は、名前変更中のレジスタのゼロ化命令の処理です。ゼロ値を提供するレジスタ名を提供することにより、レジスタクリア命令(xorまたは両方のオペランドが同じレジスタである減算など)は、単に名前を名前変更テーブル(RAT)に挿入できます。

一部のx86プロセッサで使用される別の手法は、プッシュおよびポップ操作のコストを削減します。通常、スタックポインターを使用する命令は、スタックポインターの値を更新するために、前のプッシュまたはポップを完全なサイクル待機する必要があります。プッシュとポップがスタックポインターに小さい値を加算または減算するだけであることを認識することで、複数の加算/サブトラクションの結果を並行して計算できます。加算の主な遅延はキャリーの伝播ですが、値が小さい場合、ベース値の上位ビット(この場合はスタックポインター)には最大で1つのキャリーインしかありません。これにより、キャリーセレクト加算器と同様の最適化を、小さな値の複数の加算に適用できます。さらに、スタックポインターは通常、定数によってのみ更新されるため、

命令を単一のより複雑な操作にマージすることもできます。命令を複数の単純な操作に分割する逆のプロセスは古い手法ですが、命令をマージすると(Intelはこれをマクロと操作の融合と呼びます)、実装で命令セットで公開されている操作よりも複雑な操作をサポートできます。

理論的には、他の手法が提案されています。RATではゼロ以外の小さな定数をサポートでき、そのような小さな値を使用するか、確実に生成するいくつかの簡単な操作を早期に処理できます。( "Physical Register Inlining"、Mikko H. Lipasti et al。、2004は、レジスタ数を減らす手段としてRATを使用することを提案しましたが、小さなイミディエイトのロードと小さな数での単純な操作をサポートするためにアイデアを拡張できます。)

トレースキャッシュ(制御フローの特定の仮定の下で命令のシーケンスを格納する)の場合、分岐で区切られた操作をマージし、トレースで未使用の結果を生成する操作を削除する機会があります。最適化のトレースキャッシュへのキャッシュは、命令ストリームがフェッチされるたびに実行する必要がある場合、価値がないかもしれない命令マージなどの最適化の実行を促進することもできます。

値予測を使用して、依存関係を削除することにより、並行して実行できる操作の数を増やすことができます。ストライドベースの値予測子は、前述の専用スタックエンジンのポップ/プッシュ最適化にています。複数の加算をほとんど並行して計算し、シリアル化を削除できます。値予測の一般的な考え方は、予測値を使用すると、依存する操作を遅延なく進めることができるということです。(分岐方向とターゲット予測は、事実上、非常に限られた形式の値予測であり、分岐の「値」(成立するか否か)および次の命令アドレス、別の値に依存する後続の命令をフェッチできます。)


驚くばかり!貴重な情報をありがとう。これらの建築技術をすべて読むことができる本を提案してもらえますか?
失業14

@worklessパイプライン処理とアウトオブオーダースーパースカラー実行の基本(ほとんどのコンピューターアーキテクチャの教科書で説明されています)を超えると、情報の最適なソースはおそらく特定のプロセッサーマイクロアーキテクチャーの説明(リンクされたHaswellに関する記事など)でgnasher729の答え)と学術論文(ISCAとMICRO [会議]は、一般的に良い論文を持って、HPCA、PACT、ASPLOS、そしておそらくいくつかの他にも良い評判を持っています)。アンディ・グルー(おそらくPentium Proでの彼の作品で最も有名な)...
ポールA.クレイトン14

1
...より高度な概念を提示するCompArch wikiで作業していましたが、進行は遅く、明らかにハッキングされたようで、エラーメッセージ(semipublic.comp-arch.net/wiki)のみが表示されます。彼は異なるwikiソフトウェアを使用してwikiを元に戻すつもりです(元のテキストは保存されています)(使用しているソフトウェアに問題があり、これを改善の機会と考えています)。
ポールA.クレイトン14

スーパースカラーアーキテクチャの成功の好例は、Intelのハイパースレッディングです。これらすべての最適化により、Intelのエンジニアは、ALUの約30%がほとんどの時間使用されないことを発見しました。パイプラインを十分に効率的に満たすことができません。ハイパースレッディングを使用すると、理想的なシナリオで多くの作業を無料で取得できます。別の新しいコアを持つよりもはるかに少ないですが、はるかに安価です(また、マルチコアと組み合わせることができます)。
ルアーン14

@ PaulA.Clayton-そのページの2つのキャプチャがWaybackにあります。2013年12月20日2014年2月14日。それらのキャプチャがページの問題より前のものかどうかはわかりません。残念ながら、Waybackでこれらのページにアクセスしようとすると、「バマー。このファイルを処理しているマシンがダウンしています。現在作業中です。」というメッセージが表示されます
ケビンフェガン14

10

現代のプロセッサーの内部ではいくつかのダークマジックが発生しますが、あなたの考えは間違いなく正しい方向に沿っています。

最新のプロセッサの効率を理解する鍵は、それらがスーパースカラーであることを認識することです。ウィキペディア(エンファシス鉱山)から:

スーパースカラーCPUアーキテクチャは、単一プロセッサ内で命令レベルの並列化と呼ばれる形式の並列化を実装します。したがって、特定のクロックレートで可能な場合よりも高速なCPUスループットが可能になります

ご想像のとおり、これらの最新のプロセッサには、コアごとに複数の実行ユニットがあります。 ハイパースレッディングを検討するのは興味深いです。パイプラインの一部は複製されますが、一部は複製されません。

順不同の実行も興味深いものですが、質問には直接回答しません。ただし、「無駄な」CPUサイクルの数は減ります。

効率は、プロセッサ内でストールを引き起こす可能性のある他の多くの要因にも影響されます。

  • 以前の指示の結果は利用できません。
  • キャッシュミス。
  • すでにフェッチされた命令を無効にするコード分岐(分岐予測についてはこちらこちらをご覧ください)。

最近のコンパイラは上記の項目の多くを支援しようとし、プロセッサが引き継ぎます。良い例については、Stackexchangeの他の場所にあるこの質問を参照してください。これは、同じことを行うことができる2つの命令の間の重要な違いを強調しています(状況によって)。ただし、一部のプロセッサでは、使用中の実行ユニットにより、一方が他方よりも「高速」になる場合があります。

最新のCPUパイプラインの人間が読める説明については、「CPUパイプラインの旅」を参照してください。やや技術的な説明については、Agner FogのMicroarchitectureペーパーを参照してください。


説明と非常に興味深いリンクをありがとう。セルが非常に興味深いように見えるので、CPUアーキテクチャについてさらに詳しく調べることを楽しみにしています^ _ ^。"" x86は、上記の「スーパーパイプライン」を使用します。Cellファミリーは、9つのミニCPUを含む「相乗的」アプローチを使用します。各ミニCPUは主にインオーダーパイプラインを、次のことは事実である、ミニCPUは、複数の並列スーパースカラパイプラインではなく、単一のパイプラインを持っている「」」。
workless

3

何が起こったと思いますか:Intel、AMD、IBMのすべてのエンジニアは、パイプラインがサイクルごとに1つの結果しか提供できないことを読んで、「ああ、そうだとすれば、これらのプロセッサを高速化できません」と言いました。または、彼らはこれを読んで、「サイクルごとに複数の結果を提供することはできませんか?それについて見ていきます!」と言いました。

たとえば、Haswellアーキテクチャの概要については、http://www.realworldtech.com/haswell-cpu/のリンクをたどることができますまたは、IntelのWebサイトにアクセスすると、ドキュメントが少し見つかります。

Haswellプロセッサの各コアには膨大な数の実行ユニットがあり、互いに独立した操作を実行できるため、複数の操作を並行して実行できます。次に、Haswellプロセッサには、最大256ビットサイズのベクトル演算を処理するいくつかの実行ユニットがあります。たとえば、ベクトル演算では、1つのベクトル演算で4つの倍精度浮動小数点演算または8つの単精度浮動小数点演算を実行できます。そして最後に、Haswellプロセッサは「融合乗算加算」をサポートします。つまり、aにbを加えてcを計算するのは1つの操作にすぎません。

Haswellには融合積和演算が可能な2つのユニットがあるため、理論上の最大値はサイクルごとに2つの融合積和演算で、各演算は8つの単精度乗算と加算、または32の単精度浮動小数点演算を実行します。

3630プロセッサはIntelの最新の価格表には含まれていませんが、4つのコアを備えた3740QMなどのモデルがあります。したがって、32の代わりに、クロックサイクルごとに128の浮動小数点演算を取得できます。これは理論上の最大値です。実生活でその半分を達成することは困難ですが、適切なタスクでは不可能ではありません。最大15コアのプロセッサが他にもあります(最も熱狂的なゲームファンでも支払えない価格の場合)。

したがって、複数の乗数の組み合わせがあります。

  1. プロセッサごとに複数のコア。
  2. (以前に言及しなかったハイパースレッディングにより、理論上の限界に近づくことができます)
  3. 融合積和演算は、1つだけとしてカウントする2つの算術演算を実行します。
  4. 1つだけとしてカウントする8つの操作を行う256ビットのベクトル。
  5. 融合乗算加算を処理できる2つのベクトル実行ユニット。

サイクルあたり8.6の操作を達成するのはそれほど難しくありません。コアあたりサイクルあたり8.6の操作でさえ、それほど難しくありません。


x86を実行するコアとスーパースカラー動作に最適化された命令セットを実行するコアを備えたCPUを設計することは、実用的または有利なのだろうかと思います。IntelとAMDはx86命令セットの制限を回避するためにかなり驚くべきことをしていることを知っていますが、場合によっては、現在の命令セットでは表現できないことを知ることが役立つと思います。たとえば、ADDオーバーフローは影響を受けないままにするか、オーバーフローが発生したときに設定する(そうでない場合は設定したままにする)かどうかに基づいた、異なるバージョンの命令です。
supercat 14

1
今日、多くの言語がデフォルトでオーバーフローをチェックしないことを残念に思っています。Javaはセマンティクスの要件にほとんど固執していることを知っていますが、C#のようなトラップと非トラップの算術演算子の両方を含む言語では、オーバーフローをトラップしない唯一の正当な理由は、ラップ動作が必要だからです。現時点では、オーバーフローのチェックは重要なスピードペナルティを課すことができますが、機械語は、オーバーフローが必要性を捕捉するという考えに基づいて設計された場合は...限りのコードは何もオーバーフローが操作の前に発生していないことを確認することができますとして正確ではない
supercat

...特定の重要なポイントに達すると、オーバーフロートラップのオーバーヘッドをほぼゼロに減らすことができるはずです。コードが計算を実行し、最初の計算がオーバーフローした場合に破棄される場所に値を保存する場合、プロセッサが最初の計算が成功したかどうかを知るまで、ストアを遅らせる必要はありませんが、プロセッサには現在方法がありませんそれを知っている。...コードは、単に安全かどうかを実行することができるすべての操作を行うことができた場合は、オーバーフローが発生し、任意の不適切なオーバーフローは、それらのいずれかに発生したかどうかをチェック
supercat

...それは、実行依存関係を減らすのに役立つと思われるでしょう。
supercat 14

2

Drystoneベンチマークは1984年のものであり、対応する公称1 MIPS VAXマシンは、現代の観点ではあまり効率的ではありません。Cortex M3でさえ、1,25 DMPIS / MHzを実現します。

Intel Coreアーキテクチャプロセッサは、複数のコンピューティングユニットが存在するため、実際には単一のコアで複数の命令を並行して実行できます。


1

Ars TechnicaのJon "Hannibal" Stokesのマイクロプロセッサアーキテクチャのテーマに関する優れた広範な記事から多くを学びました。記事は少し古くなっていますが(2004年頃のものと思われます)、それでも非常に関連性があります。

記事の次の部分へのリンクの一部は壊れていますが、最初の部分のURLと次のページの壊れたURLを慎重に比較することで自分で修正できるようです(たとえば、m-somwehereをURLに追加します)。

(はい、これはリンクのみの栄光の回答です。申し訳ありません。記事はあまりにも優れているので、言うまでもありません)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.