首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FMA (融合乘法加)指令总是产生与mul相同的结果然后添加指令吗?

FMA (融合乘法加)指令总是产生与mul相同的结果然后添加指令吗?
EN

Stack Overflow用户
提问于 2015-03-16 20:29:58
回答 1查看 936关注 0票数 10

我有这个程序集(AT&T语法):

代码语言:javascript
复制
mulsd   %xmm0, %xmm1
addsd   %xmm1, %xmm2

我想把它换成:

代码语言:javascript
复制
vfmadd231sd %xmm0, %xmm1, %xmm2

这种转换是否总是在所有涉及的寄存器和标志中保留等效状态?还是结果会在某种程度上略有不同?(如果他们意见不同,那是为什么?)

(关于FMA指令:set)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-16 20:36:03

不是的。事实上,融合相加的一个主要好处是它不(必然)产生与单独的乘法和相加相同的结果。

作为一个(有些人为的)例子,假设我们有:

代码语言:javascript
复制
double a = 1 + 0x1.0p-52 // 1 + 2**-52
double b = 1 - 0x1.0p-52 // 1 - 2**-52

我们要计算a*b - 1a*b - 1的“数学精确”值是:

代码语言:javascript
复制
(1 + 2**-52)(1 - 2**-52) - 1 = 1 + 2**-52 - 2**52 - 2**-104 - 1 = -2**-104

但是,如果我们首先使用乘法计算a*b,则会将其舍入到1.0,因此,随后对1.0的减法会产生零的结果。

如果我们使用fma(a,b,-1),我们消除了产品的中间舍入,这使我们能够得到“真正的”答案,-1.0p-104

请注意,我们不仅得到了不同的结果,而且设置了不同的标志;单独的乘法和减法设置了不精确的标志,而融合的乘法-加法没有设置任何标志。

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

https://stackoverflow.com/questions/29086377

复制
相关文章

相似问题

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