首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >cbrt()在C++中的优化

cbrt()在C++中的优化
EN

Stack Overflow用户
提问于 2019-08-04 14:58:37
回答 1查看 151关注 0票数 0

我正在努力提高我用C++编写的代码的速度。根据分析器,函数cbrt()/cbrtf32x是我花费时间最多(或者更具体地说)的函数:

代码语言:javascript
运行
复制
double test_func(const double &test_val){
    double cbrt_test_val = cbrt(test_val);
    return (1 - 1e-10*cbrt_test_val);
}

根据数据,我在cbrt()/cbrtf32x()上花费的时间是最近的成本昂贵函数的三倍多。因此,我想知道如何改进这个函数,以及如何提高它的速度?输入值范围从1e181e30

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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缓存利用率),您可能会从中获得很好的速度提升。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57344522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档