gpt4 book ai didi

assembly - FMA(融合乘法加法)指令是否总是产生与mul然后add指令相同的结果?

转载 作者:行者123 更新时间:2023-12-04 00:06:16 33 4
gpt4 key购买 nike

我有以下程序集(AT&T语法):

mulsd   %xmm0, %xmm1
addsd %xmm1, %xmm2

我想将其替换为:
vfmadd231sd %xmm0, %xmm1, %xmm2

这种转换是否会在所有涉及的寄存器和标志中始终保持等效状态?还是结果 float 会有所不同? (如果它们不同,那为什么呢?)

(关于FMA指令: http://en.wikipedia.org/wiki/FMA_instruction_set)

最佳答案

否。事实上,融合乘法加法的主要优点在于,它不会(有必要)产生与单独的乘法加法相同的结果。

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

double a = 1 + 0x1.0p-52 // 1 + 2**-52
double b = 1 - 0x1.0p-52 // 1 - 2**-52

并且我们要计算 a*b - 1a*b - 1的“数学精确”值为:
(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

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

关于assembly - FMA(融合乘法加法)指令是否总是产生与mul然后add指令相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29086377/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com