可能な限り高速に実行する必要がある統計サンプリング用の小さなライブラリを作成しています。プロファイリングでは、関数にかかる時間の約 40% が階乗の対数のスターリング近似の計算に費やされていることを発見しました。私はその部分に最適化の努力を集中しています。これが私のコードです(MPFRを使用しています):
const double AL[8] =
{ 0.0, 0.0, 0.6931471806, 1.791759469, 3.178053830, 4.787491743,
6.579251212, 8.525161361 };
void HGD::mpfr_afc(mpfr_t &ret, const mpfr_t &val){
if(mpfr_cmp_ui(val, 7) <= 0){
mpfr_set_d(ret, AL[mpfr_get_ui(val, MPFR_RNDN)], MPFR_RNDN);
}else{
mpfr_set(ret, val, MPFR_RNDN);
mpfr_add_d(ret, ret, 0.5, MPFR_RNDN);
mpfr_log(LV, val, MPFR_RNDN);
mpfr_mul(ret, LV, ret, MPFR_RNDN);
mpfr_sub(ret, ret, val, MPFR_RNDN);
mpfr_add_d(ret, ret, 0.399089934, MPFR_RNDN);
}
}
私にはいくつかの異なるアイデアがあります:
- 関数への最初の 8 個以上の入力を事前計算します。
- 計算を最適化します (精度を下げるには粗い近似を使用します)
- 複数のスレッドを使用して異なる入力を並列に計算する
- 数値がマシン データ型に収まる場合は、ネイティブ演算に切り替えます
私が取ることができる他のアプローチはありますか?