单浮点精度与双浮点精度


13

单精度浮点数占用一半的内存,在现代机器上(甚至在GPU上),使用它们进行运算的速度几乎是双精度浮点数的两倍。我发现许多FDTD代码专门使用单精度算术和存储。有什么经验可以解决使用单精度求解大型稀疏方程组的问题?我认为它必须在很大程度上取决于矩阵条件数。

此外,是否有任何有效的技术在必要时使用双精度,而在不需要双精度的情况下使用单精度。例如,我认为对于矩阵矢量乘法或矢量点积,将结果累加到双精度变量中(以避免抵消误差)可能是一个好主意,但是各个条目要彼此相乘可以使用单精度乘以

现代FPU是否无缝地允许从单精度(浮动)转换为双精度(双精度),反之亦然?还是这些昂贵的运营?

Answers:


7

对于所有非平凡的问题(即,对于性能至关重要的问题),您拥有的几乎所有内存都将位于矩阵中,而向量中的内存则相对较少。例如,对于Stokes方程的3d Taylor-Hood元素,矩阵中每行有几百个元素,这大大超过了矢量所需的内存量。因此,我们一直在考虑将矩阵存储为浮点数,将矢量存储为双精度数的想法。我不记得我们的计时结果,但是我确定我们没有发现四舍五入等问题。因此,这种方法肯定有效。


谢谢,Bangerth教授。迭代矩阵求解器呢?您是将矩阵向量乘积的精度提高到双精度,还是将乘积的矢量元素减小到单精度,然后将其累加到两倍以进行累加?
Costis 2012年

我当然是在谈论迭代求解器。我们对所有向量进行双精度处理(因为这无关紧要),因此dst = matrix src操作以double = float double的形式发生。然后,以双精度进行累积,但是如果真的很重要,我实际上会感到非常惊讶。
Wolfgang Bangerth 2012年

某处(可能是从20年前开始)有一篇论文指出,点积的加工精度应高于双精度。我没有方便的参考资料,但是以后再找就可以了。
Bill Barth 2012年

是的,这不会令我惊讶。这也符合我们的工作。
Wolfgang Bangerth

您对点产品使用四精度吗?如果是这样,那就酷!我没有听说有人在图书馆里这样做。
比尔·巴特


3

我的建议是主要集中在内存消耗上,以决定何时使用单精度(浮点数)。因此,用于FDTD计算的批量数据应使用浮点数,但我会将问题描述本身(例如几何形状,材料参数,激发条件)和所有相关的元数据保留为两倍。

我会将所有性能保持为非关键状态,并且不对计算进行两次深入分析。特别是,我会将多边形数据和其他几何描述保持为双精度(如果可能的话甚至为整数),因为经验告诉您,即使从理论上讲,您也永远不会使代码的计算几何部分完全鲁棒。

我要保留的第三部分是解析计算,包括使用非对称特征值分解的快捷方式。例如,我有一个分段定义的旋转对称2D函数,我需要它的傅里叶变换。将有多种涉及FFT的数值方法和适当的“分析低通滤波器”来使其“有效”获得。因为它的性能并不重要,所以我使用了涉及Bessel函数的“精确”解析表达式。由于这是开始的捷径,而且我不会花时间分析复杂公式的误差传播,因此我最好在计算中使用双精度。(结果仍然是,该公式中只有部分解析等效表达式可用,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.