この質問は、ソフトウェア側からの分岐予測の改善に関する Aater Suleman によるこの記事を読んだ後のフォローアップです。著者は、2 ビット飽和カウンタ方式の場合に分岐が発生することを予測する確率を高めるなど、条件文を「展開」する方法を提供しています。ここに抜粋があります:
例を挙げて説明しましょう。X が 0 から 99 までの確率変数であるとします。次のコードを実行します。
if (X > 5 && X < 95) //90% の確率で分岐する
do_something();ただし、コードを次のように記述した場合:
if(X > 5) //95% の確率
で分岐する if(X < 95) //95% の確率で分岐する
do_something();ブランチ プレディクタは、これらの両方のブランチをより正確に予測するのに適しています。これは、これらの両方のブランチに割り当てられたカウンタが、実行時に飽和状態のままになる可能性が高いためです (2 つの分岐が実行されない可能性が低いため)。
一般に、if ステートメントで条件を AND/OR するときはいつでも、組み合わせの偏りが大きいか偏りが少ないかを考え、より偏りのあるバージョンを選択する必要があります。
私の質問は次のとおりです。コンパイラは常にこのヒューリスティックに従いますか? コンパイラはISAとアーキテクチャの範囲に存在し、分岐予測スキームはプロセッサとより具体的なハードウェア実装の範囲に存在するため、コンパイラにはこのようなことを行う権限さえありますか?
私の直感では、そのような方法で制御ステートメントを拡張してもパフォーマンスが損なわれることはありませんが、同時に、コンパイラがそのような最適化を行うという証拠を見つけることができませんでした. もしそうなら、なぜ彼らはしないのですか?私の推論には何が欠けていますか?誰かがそのような最適化が特定のアーキテクチャまたは予測スキームに関して有害である例を提供できますか?
ありがとう。