我有一个用 C++ 编写的高精度 ODE(常微分方程)求解器。我使用用户定义的类型进行所有计算real_type
。在标头中有一个 typedef 声明了这种类型:
typedef long double real_type;
我决定将 long double 类型更改__float128
为更准确。除此之外,我还包含quadmath.h
并用 libquadmath 中的函数替换了所有标准数学函数。
如果在没有任何优化标志的情况下构建“long double”版本,则在 77 秒内解决了一些参考 ODE。如果这个版本是用 -O3 标志构建的,同样的 ODE 会在 25 秒内解决。因此 -O3 标志将计算速度提高了三倍。
但是在没有标志的“__float 128”版本中,类似的 ODE 在 190 秒内解决,而 -O3 在 160 秒内解决(大约 15% 的差异)。为什么 -O3 优化对四倍精度计算的影响如此微弱?也许我应该使用其他编译器标志或包含其他库?