在我编写的一个C++ CPU密集型模拟中,通过valgrind在我的程序中追踪到一个瓶颈是
cmath::exp
。它目前占用了超过40%的模拟时间。我可以将输入限制在相对较小的值域内,但我想控制精度。我考虑使用LUT(查找表)来替换exp
,但我不太确定如何以“正确的方式”(商标)做到这一点。我关心以下问题:
- 大的查找表会不适合缓存,因此会减慢访问速度
- 将双精度输入转换为整数以便访问查找表的最佳方法
- 答案对(2)的斜率有依赖吗?
- 我是在重新发明轮子吗——这已经被别人做过了吗?
实现/(从库)包含exp
的LUT的最佳方法是什么?
exp(x)
其中x = [-k ... -1]
,k>1
,且k
仅在运行时已知(因此可能需要每次运行程序重新构建 LUT(这是可以接受的,因为模拟时间可能需要数天))。 - Hookedexp
的严重剪裁和量化版本。它不会尝试估计任何未预先计算的点。这对您来说很好。但不要将其与快速估计整个范围内函数的方法混淆。 - Ben Voigt