2016-09-25 8 views
0

x86_64では、64ビットのアドレスで直接ジャンプはありません。たった32ビットです。 間接ジャンプでは、分岐予測が始まる前にパイプラインが解決されなければならないことを理解しています。 私の質問です:最初の実行時に、1-3サイクルのジャンプを行うための64ビットの方法はありませんか?64ビットジャンプのコストは、最初は常に10-22サイクルですか?

答えて

2

ダイレクトジャンプは、Iキャッシュミスがなくても常に「初めて」安いとは限りません。彼らはまだ分岐予測が必要です。ロングモード、jcc rel32jmp rel32(及びrel8コンパクトバージョン)において


RIPから符号拡張相対変位を使用します。 2GB以内のアドレスから来ている限り、任意の64ビットアドレスにジャンプできます。したがって、rel32の置換を使用できるように、コードを他のコードの2GB以内に保ちます。

ロングモードで絶対直接ジャンプはありません。 32ビットモードのfarはJMP ptr16:32 (opcode 0xEA)とfar CALL ptr16:32は64ビットバージョンをまったく持っていません。 SYSCALLやINTのような命令は間接的なジャンプ(暗黙的なデスティネーション)であり、とにかく便利ではありません。


L1 IキャッシュまたはUOPキャッシュ、または指定したアドレスからの命令がすぐに必要とされる復号されたパイプラインを暗示することを決して熱いターゲットを得るために何の命令プリフェッチ/プリデコード命令もありません。 (エミュレータの間接ジャンプについては、PREDECODE wishlist section in Darek Mihocka's articleを参照してください。あるゲスト命令のハンドラを、ほとんどの場合間違った予測をする命令の代わりに、次のゲスト命令のハンドラに直接ジャンプさせると便利です)


次のフェッチブロックが他のどこかから来るべきであると予測するには、直接ジャンプでも分岐ターゲットバッファが必要です。この情報はデコード段階よりもはるかに早く必要とされるため、重要なフロントエンドのバブルを避けるように予測する必要があります。興味深い質問が最近この問題を引き起こしました:Slow jmp-instructionRealworldtech forum threadの回答は、分岐予測が命令だけでなくフェッチブロックでも動作する必要があることを明確にしています。また、x86とは違って固定幅のISAをデコードする場合でも、デコード結果よりも早い予測が必要です。


1-3サイクルが新たに見直接(rel32)ジャンプのコードフェッチの気泡の大きさは非現実的です。ただし、そのバブルの一部は、デコードされたuopキューによって隠されることがあります。

デコードするコードフェッチは、おそらく少なくとも5または6サイクル、おそらくそれ以上です。例えば、L1-Iヒット時間が、HaswellのL1Dロード使用待ち時間と同じ4サイクルであるとします。その後、インテルのCPUは命令境界をマークするためにプリデコードを行い、デコードステージは最大4μopをデコードします。 David Kanter's Haswell writeup has a diagram of the frontendSlow jmp-instruction質問から

OPのデータは、JMP命令が、何の巨大なブロックが(分岐ターゲット=次のinsnで)インテルBroadwellマイクロアーキテクチャに12のクロックあたり約1 JMPで動作していることを示し、それはあなたの最悪のシナリオですので、あなたが追いつくためにフロントエンドの時間を与える何もしていないので、フェッチ/デコードバブルは全く隠されません。

私は、従来のデコーダからの実行について話していると仮定しています。 from the uop cacheを実行している間のBTBミスは、デコードされたuopがより速く利用できるので、わずかに短くなる可能性があります。のターゲットターゲットもuopキャッシュにヒットすると、デコードされたuopがデコードされたuopキュー(ループバッファとして使用されているものと同じバッファ)への入力を開始するまでのサイクル数が少なくなります。

コードフェッチバブル中にデコードされたuopキューが空でない場合は、発行ステージにバブルが発生していない可能性があります(CPUのアウトオブオーダー部分にuopsを送ります)。

また、実行するun-execute uopsがたくさんある(CPUがIPCをフロントエンド帯域幅よりもはるかに制限するボトルネックでコードを実行している)場合、フロントエンドのバブルはあまりにもそれに影響を与えます。


間接分岐は悪化します。正確な目標は、数サイクル後には最高でも検出されない。あなたの基本的な前提は正しいです:彼らは安くはないので、可能な限り避けるべきです。

+2

なぜ誰かがこれがダウンボートに値する理由を説明することができれば、私は訂正をしてうれしいです。私はそれが正確であると思うし、質問の前提について述べています。 –

+0

ちょうど1ヶ月前に非常によく似た質問が出されたのは面白いです...徹底的な回答ありがとう – Simon

+0

ええ、よく。私から+1してください...私は本当に* downvoteの推論を見たいです。 –

関連する問題