我正在努力提高我用C++编写的代码的速度。根据分析器,函数cbrt()/cbrtf32x
是我花费时间最多(或者更具体地说)的函数:
double test_func(const double &test_val){
double cbrt_test_val = cbrt(test_val);
return (1 - 1e-10*cbrt_test_val);
}
根据数据,我在cbrt()/cbrtf32x()
上花费的时间是最近的成本昂贵函数的三倍多。因此,我想知道如何改进这个函数,以及如何提高它的速度?输入值范围从1e18
到1e30
。
发布于 2019-08-04 16:06:44
如果你一次只做一个立方根,那么你几乎不能做什么,并且你想要确切的结果。
现在,如果你能改进立方根计算超过10-20% -如果是的话-同时获得相同的数值结果,我会感到惊讶。(注:我凭空得到了10%-20%的数字;这只是一个观点,根本不是一个科学数字。)
如果你可以批量计算,你也许能够SIMD操作,或者多线程,或者如果你更多地了解数据的分布(或者可以找到更多),你也许能够对它们进行排序-我不知道-也许可以计算一个增量立方根或其他什么。
如果你可以得到一个近似值,那么你还可以做更多的事情。例如,您正在计算函数f(x) = 1 - cbrt(x) / 1e10
,它与1 - cbrt(x / 1e30)
相同,后者是一个严格递减的函数,将域1e18..1e30映射到范围0..0.9999。有了y = x / 1e30
,它就变成了f(y) = 1 - cbrt(y)
,现在y
在1e-12..1的范围内,并且可以使用查找表来预先计算和近似。
根据您需要立方根的次数,您可以避免多少精度损失(这决定了表的大小),以及您是否可以对输入进行排序或存储桶(以提高LUT查找的CPU缓存利用率),您可能会从中获得很好的速度提升。
https://stackoverflow.com/questions/57344522
复制相似问题