私は分岐予測について読んできましたが、私が見つけた唯一の実装はコンピュータのハードウェア側にあります。プロセッサーは予測の大部分を担当しているようです。私の質問は、コンパイラは分岐予測を行うことができますか? 私が見つけた唯一の事は2つのメソッド、関数インライン化とループアンローリングです。これらは正しいと考えられていますか?彼らはまだ使用されていますか?コンパイラレベルの分岐予測
答えて
それは知っている場合、コンパイラは、予測情報を取得することができます。
-
計測器によって収集
- 統計分岐確率は、計測の実行によって収集さvarible値の
- 統計分布を実行します。それは次に、未知の場合:) 「10」の条件
- 範囲に基づいて、ループ境界の推定値(またはデフォルトの周波数又はバイアスするように、条件付きの平均結果ひいては分岐
- プログラマアサーションを予測することができます分岐がループの先頭に後ろ向きである
- 知識は(そのような情報を使用して
「とら」を予測、それは条件文の推定結果を予測し、その後で、正しく「予測」する傾向にある分岐命令を生成することができますハードウェア。
いくつかのコンパイラによって行われる特に興味深い最適化のセットはtrace schedulingです。これは、順次発生する分岐の確率に基づいてコードを通るパスのセットを決定します。最も高い確率のパスを決定することにより、コンパイラは、基本ブロック内のパス全体ではなく、パス全体にわたって最適化を行うことができます。
コンパイラによっては、ハードウェアの分岐予測機能を間接的に使用する分岐コードが生成されることがあります。コンパイルされたOO言語(静的またはJITted)はメソッド呼び出しをコンパイルする必要があり、ジャンプ間接は高価です。安価なやり方は、各コールサイトで最も最近呼び出されたメソッドの小さな動的キャッシュを保持し、ディスパッチされるオブジェクトタイプをチェックすることです。同じタイプのオブジェクトがコールサイトでのディスパッチに頻繁に使用される場合、キャッシュ内の最初の(そして、いくらかは2番目の)エントリーに対する比較/分岐シーケンスは非常に可能性が高く、実行されたコードは誤予測を回避する。これはジャンプ間接よりもはるかに優れています。
最後の標準的なトリック:分岐を避けることができれば、正しく予測する必要はありません。多くのコード・シーケンスは次のようになり:
if (exp1 relop exp2)
X = Y
endif
現代のCPUはそうではなく、すべてのリレーショナル条件等しい、等しくない、少ない、など ため 「をBにMOV_if_relop A」効果である「断定」の指示を持っています上記の構文の分岐を生成するよりも、コンパイラは以下を生成します。
<compute exp1 and exp2>
CMP exp1,exp2 ; sets condition code
MOVif_relop X,Y
- 1. 分岐予測と
- 2. GPUの分岐予測
- 3. 分岐予測とパフォーマンス
- 4. 分岐予測と変数宣言
- 5. 分岐予測 - グローバル共有実装の説明
- 6. 分岐予測を助けることは可能ですか?
- 7. カバレッジデータの予期しない分岐数
- 8. C#で分岐予測ヒントを使用することはできますか?
- 9. SAP hana予測分析ツール
- 10. 予測分散関数R
- 11. `lm`の線形モデル:予測値の和の予測分散を得る方法
- 12. 線形回帰予測のsklearn分散
- 13. イベント生存分析の予測時間
- 14. スパークバイナリ分類の予測精度
- 15. 未知数予測のscikit分類子
- 16. マルチターゲット予測とマルチクラス予測
- 17. SARIMAXモデル予測外予測
- 18. 現在のCPUで分岐予測がどの程度普及していますか?
- 19. __builtin_expectを使用したARMの静的分岐予測は機能しません。
- 20. パイプライン処理と分岐予測リソース。何台の屋台が必要かを特定する方法。コード変更
- 21. R h20ニューラルネットワークの予測予測
- 22. 遅い予測:Scikitガウスプロセス分類
- 23. ケラスで分類:予測とマルチクラス
- 24. 分類および予測決定木
- 25. Subversion - 分岐/マージ
- 26. AI分岐ファクタ
- 27. 分岐オプションメニュー
- 28. Git:分岐?
- 29. 分岐ソリューション
- 30. Git分岐django