首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FMA和朴素a*b+c的区别?

FMA和朴素a*b+c的区别?
EN

Stack Overflow用户
提问于 2019-08-21 21:15:58
回答 2查看 250关注 0票数 1

在FMA的BSD库函数手册(3)中,它说:“这些函数计算x*y+z。”

那么,FMA和做x*y+ z的简单代码有什么区别呢?为什么FMA在大多数情况下有更好的表现?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-22 02:28:48

a*b+c生成一个结果,就好像计算是:

  • 计算ab的无限精确乘积。
  • 用浮点格式将该产品围起来。
  • 计算出这个结果和c的无限精确和。
  • 将该总和舍入到所使用的浮点格式。

fma(a, b, c)生成一个结果,就好像计算是:

  • 计算ab的无限精确乘积。
  • 计算出该乘积和c的无限精确和。
  • 将该总和舍入到所使用的浮点格式。

因此,它跳过了将中间产品舍入浮动品脱格式的步骤。

在有FMA指令的处理器上,融合乘法加法可能更快,因为它是一个浮点指令,而不是两个,硬件工程师通常可以设计处理器来有效地完成它。在没有FMA指令的处理器上,融合的乘法加法可能会慢一些,因为软件必须使用额外的指令来维护获得所需结果所需的信息。

票数 2
EN

Stack Overflow用户

发布于 2019-08-22 20:25:04

我没有足够的业力来发表评论,增加另一个答案似乎是唯一的可能。

Eric的回答很好地涵盖了所有问题,但是有一个警告:使用fma(a, b, c)代替a*b+c有时会导致很难诊断问题。

考虑一下

代码语言:javascript
复制
x = sqrt(a*a - b*b);

如果它被

代码语言:javascript
复制
x = sqrt(fma(a, a, -b*b));

对于ab的值,即使是|a|>=|b|sqrt函数的参数也可能为负值。特别是,如果|a|=|b|和无限精确乘积a*a小于a*a的四舍五入值,就会发生这种情况。这是因为计算a*a时的舍入误差是由fma(a, a, -a*a)给出的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57599272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档