哪种算法从融合乘法中获益最多?

时间:2010-08-28 04:04:51

标签: floating-point fma

fma(a,b,c)等同于a*b+c,但它不会舍入中间结果。

你能不能给我一些算法的例子,这些算法可以从避免这种舍入中获益?

这并不明显,因为我们避免的乘法后的舍入往往比加法后的舍入更少有问题,而我们不这样做。

6 个答案:

答案 0 :(得分:6)

taw 点击了一个重要的例子;更一般地说,FMA允许库编写者通过正确的舍入有效地实现许多其他浮点运算。

例如,具有FMA的平台可以使用它来实现正确的舍入分割和平方根(PPC和Itanium采用这种方法),这使得FPU基本上是一个单用途的FMA机器。 Peter Tang和John Harrison(英特尔)和Peter Markstein(HP)有一些文章可以解释这种用法,如果你很好奇。

taw 示例比跟踪误差范围更有用。它允许您将两个浮点数的乘积表示为两个浮点数的总和,没有任何舍入误差;这在实现正确舍入的浮点库函数时非常有用。 Jean-Michel Muller的书或crlibm上的论文将是了解这些用途的更好的起点。

FMA在某些类型的参数的数学库样式例程中减少参数也非常有用;当一个人正在进行参数减少时,计算的目标通常是(x - a*b)形式的术语,其中(a*b)几乎等于x本身;特别是,如果没有FMA计算,结果通常是(a*b)项中舍入误差的顺序。我相信穆勒也在他的书中写过一些关于这一点的内容。

答案 1 :(得分:5)

到目前为止我唯一发现的是“无错误的转换”。对于来自a+b的任何浮点数错误,a-ba*b也是浮点数(在舍入到最近模式,假设没有溢出/下溢等等)。

加法(明显减法)错误很容易计算;如果abs(a) >= abs(b),则错误恰好为b-((a+b)-a)(如果我们不知道哪个更大,则为2个翻转,或4-5)。使用fma计算乘法误差非常简单 - 它只是fma(a,b,-a*b)。如果没有fma,那就是16个相当讨厌的代码。正确舍入fma的完全通用仿真甚至比这更慢。

每次翻牌实际计算额外的16次错误跟踪是一个巨大的过度杀伤,但只有1-5个管道友好的触发器,这是非常合理的,并且对于许多基于50%-200%的错误跟踪开销的算法而言补偿导致的误差小到所有计算都以两倍的位数进行,在许多情况下避免了病态调节。

有趣的是,fma在这些算法中从未用于计算结果,只是为了发现错误,因为找到fma的错误是缓慢的,因为发现乘法错误没有{{1} }。

搜索的相关关键词将是“补偿的Horner计划”和“补偿点积”,而Horner计划将受益更多。

答案 2 :(得分:2)

FMA的主要好处是它可以快两倍。 FPU可以在同一周期内发出两个操作,而不是将1个周期用于乘法,然后是1个周期用于加法。显然,大多数算法都会受益于更快的操作。

答案 3 :(得分:2)

一些例子:矢量点积。傅里叶变换。数字信号处理。多项式。各种各样的事情。

这是一个优化和硬件利用的问题。产品总和是数值方法中非常常见的要求,这种方式可以让您向编译器提供有关如何快速完成某项操作的明确指令,并且可能需要更高的精度。除非我弄错了,编译器可以自由地用FMA指令替换a = b * c + d,但它也是免费的。 (除非标准要求舍入,但现实世界的编译器通常会以小的方式违反标准。)

答案 4 :(得分:1)

脱离我的头脑 - 矩阵乘法,牛顿规则,多项式评估,数值方法

答案 5 :(得分:1)

Wikipedia entry for FMA上已经很好地解释了与积累产品有关的算法从使用FMA中受益最多:

A fast FMA can speed up and improve the accuracy of 
many computations that involve the accumulation of products:

 * Dot product
 * Matrix multiplication
 * Polynomial evaluation (e.g., with Horner's rule)
 * Newton's method for evaluating functions.
相关问题