监视现有未修改的科学应用程序的浮点行为

2020-09-30 18:42:58

众所周知,现代计算机中使用的IEEE标准浮点数表示法有其缺陷,例如不能准确表示1/3或0.1这样的数字。维基百科关于浮点数的页面描述了一些相关的准确性问题,包括测试等价性的困难。在日常使用中,除了明智地使用“WINDOWS”进行等价性测试之外,我怀疑我们中的大多数人都忽略了浮点运算的潜在困难,即使我们不应该这样做。你可能会认为严重依赖浮点运算的科学计算应用程序会做得更好,但今天的论文选择中的结果让我们有理由怀疑。

…。尽管表面上有相似之处,但浮点算术不是实数算术,人们可能从实数算术继承而来的直观框架很少应用。此外,随着硬件和编译器优化的快速发展,即使是知识渊博的开发人员也很难跟上。简而言之,浮点数及其实现为用户呈现了锐利的边缘,并且边缘正变得更加锐利(…。最近的研究已经确定,在编译器(包括优化选择)和硬件级别上浮点实现的可变性越来越大,这导致了不同的科学结果。

许多年前,我必须编写在IBM大型机十六进制浮点表示和IEEE754之间进行转换的例程,同时尽可能多地保存信息,这并不是很有趣!

作者开发了一个名为FPSpy的工具,用于监控现有科学应用程序的浮点操作。由于这些应用程序的性质,很难说它们的输出是否最终由于浮点问题而不正确,但FPSpy肯定是一个确凿的证据,表明存在许多潜在的问题。

这项研究使用了一套由7个真实世界流行的科学应用程序和两个久负盛名的基准程序组成的套件进行:

Moose是用于力学、相场、Navier-Stokes和热传导问题的并行有限元框架。

FPSpy设计为能够使用未经修改的应用程序二进制文件在生产中运行,并在Linux上实现为LD_PRELOAD共享库。它介入进程和线程管理功能以遵循线程和进程分叉,并介入信号挂钩和浮点环境控制功能,以了解在它应该干扰应用程序执行的情况下何时需要“让路”。

FPSpys构建于硬件功能之上,这些硬件功能可将异常浮点事件检测为正常处理…的副作用。IEEE浮点标准定义了五个条件代码,而x64增加了一个额外的条件代码。这些与FPSpy观察到的事件相对应。

条件代码是粘性的,这意味着一旦设置了条件代码,它就会一直保持不变,直到它被显式清除。这启用了一种极低开销的FP间谍模式(作者称之为聚合模式),该模式包括运行应用程序/基准测试并查看在执行过程中设置了哪些条件。它还具有单独的模式,可以捕获在执行过程中导致浮点事件的每条指令的上下文。用户可以过滤他们感兴趣的事件类型的子集(例如,排除由于舍入而非常常见的不精确事件),并且还可以配置子采样(例如,10个事件中仅记录1个事件,事件总数不超过10,000个)。泊松采样模式允许对整个程序执行过程中的所有事件类型进行采样,最高可达可配置的开销。

下表显示了MiniAero应用程序的FPSpy开销。聚合模式和过滤掉不精确事件的单独模式的开销非常低。三次“采样跟踪”运行确实包括不精确的事件。

第一个发现是在这些应用中很少使用浮点控制机制(例如,检查和清除条件)。事实上,只有WRF天气预报工具在运行时使用任何浮点控制机制。

除了论证FPSpy的通用性之外,静态和动态结果还暗示了该应用程序的一些重要问题:在执行期间使用浮点控件的情况很少。因为很少有应用程序使用任何浮点控件,所以有问题的事件,特别是舍入以外的事件,可能无法检测到。

应用程序的聚合模式测试显示,它们确实存在问题事件。例如,Enzo有NAN,而LAGHOS被零整除。

使用单个模式跟踪,不仅可以看到发生什么情况,还可以查看应用程序中的频率和位置。例如,EZO在整个执行过程中都几乎一致地生成NAN,而LAGHOS则显示出明显的被零除错误的突发。

舍入误差(不精确)应该得到特殊对待,因为它们是如此常见,也是意料之中的。然而,仅仅因为它们是被期望的,并不总是意味着忽略它们是安全的。

不精确(四舍五入)事件是浮点算术的正常部分。尽管如此,它们反映了计算中的精度损失,开发人员确实需要对此进行推理才能确保合理的结果。实际上,精度的损失会给计算带来误差。例如,在对涉及混沌动力学的系统建模时,即使这些误差很小,也可能导致发散或不正确的解。

MPFR库支持具有正确舍入的多精度浮点运算。FPSpy的分析表明,在所研究的应用程序中,绝大多数舍入误差是由相对较少的说明书表格造成的。在很大程度上,不到100条指令占舍入误差的99%以上。这暗示了捕获这些指令并调用MPFR或等效指令的可能性。

这将允许现有的未经修改的应用程序二进制文件在必要时以更高的精度无缝执行,从而减少甚至没有舍入…。通过集中在少于5,000个指令点和在这些点处理少于45个指令表,这样的系统可以从根本上改变对应用程序…进行舍入的效果。我们目前正在实施各种方法,包括陷阱模拟。

下一次我们将看到PLDI的一篇论文,它提出了一种新的API,用于涉及实数的计算,该API的设计使结果更符合我们的直觉。