在FMA的BSD库函数手册(3)中,它说:“这些函数计算x*y+z。”
那么,FMA和做x*y+ z的简单代码有什么区别呢?为什么FMA在大多数情况下有更好的表现?
发布于 2019-08-22 02:28:48
a*b+c生成一个结果,就好像计算是:
a和b的无限精确乘积。c的无限精确和。fma(a, b, c)生成一个结果,就好像计算是:
a和b的无限精确乘积。c的无限精确和。因此,它跳过了将中间产品舍入浮动品脱格式的步骤。
在有FMA指令的处理器上,融合乘法加法可能更快,因为它是一个浮点指令,而不是两个,硬件工程师通常可以设计处理器来有效地完成它。在没有FMA指令的处理器上,融合的乘法加法可能会慢一些,因为软件必须使用额外的指令来维护获得所需结果所需的信息。
发布于 2019-08-22 20:25:04
我没有足够的业力来发表评论,增加另一个答案似乎是唯一的可能。
Eric的回答很好地涵盖了所有问题,但是有一个警告:使用fma(a, b, c)代替a*b+c有时会导致很难诊断问题。
考虑一下
x = sqrt(a*a - b*b);如果它被
x = sqrt(fma(a, a, -b*b));对于a和b的值,即使是|a|>=|b|,sqrt函数的参数也可能为负值。特别是,如果|a|=|b|和无限精确乘积a*a小于a*a的四舍五入值,就会发生这种情况。这是因为计算a*a时的舍入误差是由fma(a, a, -a*a)给出的。
https://stackoverflow.com/questions/57599272
复制相似问题