1

我有一个用 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 优化对四倍精度计算的影响如此微弱?也许我应该使用其他编译器标志或包含其他库?

4

3 回答 3

2

编译器优化的工作方式如下:编译器识别代码中的某些模式,并用等效但更快的版本替换它们。在不确切知道您的代码是什么样子以及编译器执行了哪些优化的情况下,我们不能说编译器缺少什么。

编译器可能知道如何对本机浮点类型及其操作执行一些优化,但它不知道在 __float128 和操作的库实现上执行。它可能无法识别这些操作的本质。也许它无法查看库实现(您应该尝试将库与您的程序一起编译并启用链接时优化)。

于 2015-06-26T08:00:22.940 回答
0

相同的优化提供了基本相同的好处。百分比下降只是因为数学本身花费的时间更长。

要相信优化应该是相同的百分比,您必须相信使数学运算时间更长会以某种方式使优化器找到更多节省。你为什么那么想?

于 2015-06-26T07:47:06.213 回答
0

如果您的目标是 x86 架构,那么在 GCC__float128中是实际的四倍精度 FP 类型,而long doublex87 96 位 FP 类型(双扩展)。

具有较小精度类型的数学可以比具有较大精度类型的数学更快是合理的。使用本机硬件类型的数学可以比使用非本机类型的数学更快也是合理的。

于 2015-06-26T07:47:25.967 回答