gpt4 book ai didi

c++ - C++中cbrt()的优化

转载 作者:行者123 更新时间:2023-11-28 04:12:35 27 4
gpt4 key购买 nike

我正在尝试提高用 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() 上花费的时间是最接近的成本昂贵函数的三倍。因此我想知道如何改进这个功能,以及如何加快速度?输入值范围从 1e181e30

最佳答案

如果您一次求一个立方根,并且您想要准确的结果,那么您无能为力。

实际上,如果您可以将立方根计算提高 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],并且可以使用查找表对其进行预先计算和近似。

取决于您需要立方根的次数,您可以避免多少精度损失(这决定了表的大小),以及您是否可以对输入进行排序或分桶(以提高 CPU 缓存利用率对于您的 LUT 查找),您可能会从中获得不错的速度提升。

关于c++ - C++中cbrt()的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57344522/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com