繁体   English   中英

为什么优化标志(-O3)不能加快四倍精度计算?

[英]Why optimization flag (-O3) doesn't speed up quadruple precision calculations?

我有一个用C ++编写的高精度ODE(常微分方程)求解器。 我使用用户定义的类型real_type进行所有计算。 在标头中有一个typedef声明此类型:

typedef long double real_type;

我决定将long double类型更改为__float128以提高准确性。 除此之外,我还包含了quadmath.h并用quadmath.h函数替换了所有标准数学函数。

如果构建的“ long double”版本没有任何优化标志,则一些参考ODE将在77秒内解决。 如果使用-O3标志构建此版本,则相同的ODE将在25秒内解决。 因此,-O3标志可将计算速度提高三倍。

但是在不带标志的“ __float 128”版本中,类似的ODE可以在190秒内解决,而使用-O3可以在160秒内解决(差异约为15%)。 为什么-O3优化对四倍精度计算的影响如此之弱? 也许我应该使用其他编译器标志或包括其他库?

编译器优化的工作方式如下:编译器识别代码中的某些模式,并用等效但速度更快的版本替换它们。 在不完全了解您的代码是什么样的情况以及编译器执行了哪些优化的情况下,我们无法说出缺少的编译器。

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

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

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

如果您的目标是x86体系结构,则在GCC中__float128是实际的四精度FP类型,而long double是x87 96位FP类型(double扩展)。

具有较小精度类型的数学可以比具有较大精度类型的数学更快,这是合理的。 用本地硬件类型进行数学运算要比使用非本地类型进行数学运算更快也是合理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM