まず、キーランのコメントとターボ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を使用することを提案しましたが、小さなイミディエイトのロードと小さな数での単純な操作をサポートするためにアイデアを拡張できます。)
トレースキャッシュ(制御フローの特定の仮定の下で命令のシーケンスを格納する)の場合、分岐で区切られた操作をマージし、トレースで未使用の結果を生成する操作を削除する機会があります。最適化のトレースキャッシュへのキャッシュは、命令ストリームがフェッチされるたびに実行する必要がある場合、価値がないかもしれない命令マージなどの最適化の実行を促進することもできます。
値予測を使用して、依存関係を削除することにより、並行して実行できる操作の数を増やすことができます。ストライドベースの値予測子は、前述の専用スタックエンジンのポップ/プッシュ最適化に似ています。複数の加算をほとんど並行して計算し、シリアル化を削除できます。値予測の一般的な考え方は、予測値を使用すると、依存する操作を遅延なく進めることができるということです。(分岐方向とターゲット予測は、事実上、非常に限られた形式の値予測であり、分岐の「値」(成立するか否か)および次の命令アドレス、別の値に依存する後続の命令をフェッチできます。)