x86_64では、64ビットのアドレスで直接ジャンプはありません。たった32ビットです。 間接ジャンプでは、分岐予測が始まる前にパイプラインが解決されなければならないことを理解しています。 私の質問です:最初の実行時に、1-3サイクルのジャンプを行うための64ビットの方法はありませんか?64ビットジャンプのコストは、最初は常に10-22サイクルですか?
答えて
ダイレクトジャンプは、Iキャッシュミスがなくても常に「初めて」安いとは限りません。彼らはまだ分岐予測が必要です。ロングモード、jcc rel32
とjmp 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-instruction。 Realworldtech 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 frontend。 Slow 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をフロントエンド帯域幅よりもはるかに制限するボトルネックでコードを実行している)場合、フロントエンドのバブルはあまりにもそれに影響を与えます。
間接分岐は悪化します。正確な目標は、数サイクル後には最高でも検出されない。あなたの基本的な前提は正しいです:彼らは安くはないので、可能な限り避けるべきです。
- 1. ユニティ・オフセット・サイクルは常に最初から始まりますか?
- 2. jqueryのサイクル:最初のスライドに戻る
- 3. スレッドのCPUサイクルとメモリの大まかな「コスト」はいくらですか?
- 4. このポモドーロは、最初のサイクルのために動作しますが、2番目のサイクルでは正常に動作しない
- 5. getifaddrs ordering - loは常に最初ですか?
- 6. jQueryサイクル - 開始から(最初から)ホバーオーバーで停止
- 7. エンティティフレームワークコード - 最初は非常に遅い
- 8. preloaderでのOpenFLアニメーションは、常に最初にステルスする
- 9. Firebase初期ロードでは、オンライン/オフラインのスニペットの最初の応答は常に「オフライン」
- 10. タブ付きアクティビティの最初のフラグメントは常に空白です
- 11. VBAの最初の配列項目は常に空です
- 12. VSCodeのデバッグモードは常に最初の行で停止します
- 13. ドロップダウンの選択値は常に最初の値です - Jquery
- 14. JavaFXアニメーションが最初のサイクルの後に終了します
- 15. Hibernate Validatorは@NotNullが常に最初にトリガされますか?
- 16. return句は常に最初に実行されますか?
- 17. エアフロースケジューラは、前日のサイクルを最初に終了してから次のサイクルを開始することはできますか?
- 18. Scala Playアプリは最初のリクエストで常にタイムアウトします
- 19. クエリのコストは、MySQLのクエリ最適化に最適なメトリックですか?
- 20. juliaが最初の評価で非常に遅いのはなぜですか?
- 21. 32ビットと64ビットマシンの両方で常に64ビットです
- 22. cloudinitサービスは、インスタンスを起動するときに最初の起動サイクルでのみ実行されますか?
- 23. 奥行き最初の検索で1サイクル印刷
- 24. OpenGLは、常にここで最初のテクスチャ
- 25. コレクションビューには常に最初のセルがあります
- 26. 私のフォームは常に最初のオプションを送信します
- 27. GridViewのページングは常に最初のページを表示します
- 28. Spring Dataリポジトリファインダへの最初の(そして最初の!)アクセスは、常にEJBトランザクションをロールバックしますか?
- 29. C++:なぜ、常に最後のパラメータを最初に行うのですか?
- 30. tensorflow-用-onehot分類は、コストは常に0
なぜ誰かがこれがダウンボートに値する理由を説明することができれば、私は訂正をしてうれしいです。私はそれが正確であると思うし、質問の前提について述べています。 –
ちょうど1ヶ月前に非常によく似た質問が出されたのは面白いです...徹底的な回答ありがとう – Simon
ええ、よく。私から+1してください...私は本当に* downvoteの推論を見たいです。 –