通过使用 16 位数字提高计算性能

计算科学 线性代数 表现
2021-11-25 07:24:28

我最近发现了以下文章,其中指出使用 16 位数字可用于提高 AI 应用程序的计算性能。根据上面的文章编号 16 位必须缩放以适应 16 位。
这种技术是否也可以应用于使用迭代方法的线性系统的解决方案?如果事先不知道该方法中可能出现的最大数字,从 64 位数字到 16 位数字的缩放会是什么样子?

1个回答

最近,人们对使用混合精度和 16、32、64 和 128 位浮点运算的某种组合的数值线性代数产生了相当大的兴趣。

例如,矩阵的低精度因式分解可用于预处理更高精度的迭代解。由于分解需要O(N3)操作和迭代方法采用O(N2)每次迭代的操作,以更快的较低精度计算矩阵的分解可能是有效的。事实证明,使用三个精度级别(例如单精度、双精度和四精度),您可以使用大量操作和最低精度级别和极少数操作获得中等精度级别(例如双精度)的完全精度最高精度的操作。

这在实践中是否很快取决于您使用的硬件。在 Intel 和 AMD 的大多数当代处理器上,矢量处理单元每个周期可以执行的单精度(32 位)浮点运算是双精度(64 位)运算的两倍。

浮点运算的速度并不是使用不太精确的格式所带来的唯一优势。对于内存受限的操作(大多数级别 1 和级别 2 BLAS 操作,但不是级别 3 操作,例如矩阵-矩阵乘法和矩阵分解),使用较低精度(例如,单精度而不是双精度)会减少将内存中的数据减半。此外,如果数据存储在高速缓存中,则使用较低精度类型有效地使可存储在高速缓存中的浮点数数量增加一倍。

但是,对 128 位浮点运算的硬件支持并不普遍。实际上,在软件中使用 128 位浮点运算(例如,使用两个双精度数来存储四精度数)通常比硬件中的 64 位双精度运算慢 100 倍以上。这会使混合精度方案的性能无法接受。

只有少数最新的处理器型号支持 16 位浮点数。这对于神经网络计算非常有用,并且对于使用混合 16 位、32 位和 64 位算术来获得单精度解的数值线性代数可能有一些用处。要获得线性系统的双精度解决方案,您将混合使用单精度、双精度和四精度算术以及 16 位浮点数将没有帮助。

GPU 的情况类似(单精度和双精度很常见,最近添加了 16 位浮点数,硬件不支持四倍精度。)由于许多 NVIDIA GPU 上双精度浮点的限制,情况变得复杂。

Nick Higham 和他的学生最近发表了许多与此相关的论文:

http://www.ma.man.ac.uk/~higham/papers/bibbase.php