【发布时间】:2015-06-26 07:34:40
【问题描述】:
我有一个用 C++ 编写的高精度 ODE(常微分方程)求解器。我使用用户定义类型real_type 进行所有计算。在 header 中有一个 typedef 声明了这个类型:
typedef long double real_type;
我决定将 long double 类型更改为 __float128 以提高准确性。除此之外,我还包含了quadmath.h,并将所有标准数学函数替换为来自 libquadmath 的函数。
如果“long double”版本是在没有任何优化标志的情况下构建的,一些参考 ODE 会在 77 秒内解决。如果这个版本是用 -O3 标志构建的,同样的 ODE 会在 25 秒内解决。因此 -O3 标志将计算速度提高了三倍。
但是在没有标志的“__float 128”版本中,类似的 ODE 可以在 190 秒内解决,而使用 -O3 则需要 160 秒(大约 15% 的差异)。为什么 -O3 优化对四倍精度计算的影响如此微弱?也许我应该使用其他编译器标志或包含其他库?
【问题讨论】:
-
我将此作为评论而不是作为答案发布,因为它只是一个“知情猜测”:编译器优化标志启用/禁用某些优化。根据您的程序、数据和控制流、使用的数据类型……不同的优化会产生不同的效果。因此,仅仅因为使用一种数据类型可以通过 -O3 获得良好的加速,并不意味着在替换数据类型或执行任何其他更改时可以获得相同的加速。所以在我看来,没有理由期待同样的加速。
-
__float128 操作已经在库中编译(优化),它们不会为每个应用程序重新编译。可能发生这种情况的唯一方法是使用 -flto 编译 libquadmath,这并不容易,而且您可能不会获得太多收益。
-
感谢您的回复。您认为达到了限速还是我可以加快速度?
-
如果您想要更高的精度但仍然需要高性能,double-double arithmetic(甚至是三倍、四倍......)可能是一个不错的选择,因为它可以在硬件而不是软件中完成像四重算术。 stackoverflow.com/q/9857418/995714stackoverflow.com/q/6769881/995714
标签: c++ compiler-optimization floating-point-precision quadruple-precision