本質的に、私は以下のコードで計算された値を使用しようとしていますが、独自のレートを持つすべてのオブジェクトに値を格納すると、キャッシュミスを引き起こす。また、ルックアップテーブルを使用することは明らかに重要ではありません。浮動指数を持つ2の速い乗数[C]
標準出力関数よりもこれらの値を高速に取得する方法を探していますが、可能な入力が非常に制限されているために使用できるトリックはありますか?
static inline
double __attribute((pure)) get_decay_rate(uint8_t rate)
{
if(rate >= 128)
{
return 65535.0/65536.0;
}
double k = pow(2, rate/8.0);
return (k - 1.0)/k;
}
/* pseudocode:
double k = (int) pow(2, k/8.0);
k = (k - 1)/k;
return log(65535/65536)/log(k);
*/
static inline
uint16_t __attribute((pure)) get_decay_modulus(uint8_t rate)
{
if(rate <= 128)
{
return 1;
}
//turns out to be the same as the above pseudocode, for some reason.
return pow(2, (rate - 128)/8.0);
}
そして、あなたはまた、各関数に静的な256の長さの配列を入れてみましたか?または、静的な128の長さの配列? – Hurkyl
int k = pow(2、k/8.0);で 'rate/8.0'を意味しますか?同様に 'get_decay_modulus'では' k'を宣言せずに 'k'を参照します。 – oldrinb
@Hurkyl問題はキャッシュミスなので、キャッシュに収まるコードが少なくなるので、問題を解決するのではなく移動します。 –