コードのホット パスでいくつかの整数除算を実行する必要があります。プロファイリングとサイクル カウントによって、整数除算のコストがかかっていることを既に確認しています。部門をより安価なものに減らすためにできることがあるといいのですが。
このパスでは、2^n+1 (n は変数) で割ります。基本的に、この関数を最適化して除算演算子を削除したいと考えています。
unsigned long compute(unsigned long a, unsigned int n)
{
return a / ((1 << n) + 1);
}
2^n で除算する場合は、div を右シフト n に置き換えるだけです。定数で除算する場合、コンパイラの強度によってその特定の除算が削減され、おそらく乗算とシフトになります。
2^n+1 に適用される同様の最適化はありますか?
編集: a here は、任意の 64 ビット整数にすることができます。n は 10 から 25 までの数個の値しか取りません。確かに、各 n についていくつかの値を事前計算できますが、a についてはできません。