我有这个程序集(AT&T语法):
mulsd %xmm0, %xmm1
addsd %xmm1, %xmm2我想把它换成:
vfmadd231sd %xmm0, %xmm1, %xmm2这种转换是否总是在所有涉及的寄存器和标志中保留等效状态?还是结果会在某种程度上略有不同?(如果他们意见不同,那是为什么?)
(关于FMA指令:set)
发布于 2015-03-16 20:36:03
不是的。事实上,融合相加的一个主要好处是它不(必然)产生与单独的乘法和相加相同的结果。
作为一个(有些人为的)例子,假设我们有:
double a = 1 + 0x1.0p-52 // 1 + 2**-52
double b = 1 - 0x1.0p-52 // 1 - 2**-52我们要计算a*b - 1。a*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。
请注意,我们不仅得到了不同的结果,而且设置了不同的标志;单独的乘法和减法设置了不精确的标志,而融合的乘法-加法没有设置任何标志。
https://stackoverflow.com/questions/29086377
复制相似问题