2012-05-12 15 views
3

私は分岐予測について読んできましたが、私が見つけた唯一の実装はコンピュータのハードウェア側にあります。プロセッサーは予測の大部分を担当しているようです。私の質問は、コンパイラは分岐予測を行うことができますか? 私が見つけた唯一の事は2つのメソッド、関数インライン化とループアンローリングです。これらは正しいと考えられていますか?彼らはまだ使用されていますか?コンパイラレベルの分岐予測

答えて

7

それは知っている場合、コンパイラは、予測情報を取得することができます。

    計測器によって収集
  • 統計分岐確率は、計測の実行によって収集さ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