A+B+C 的 add3 指令,单次舍入

add3 instruction for a+b+c with one single rounding

提问人:Nico Schlömer 提问时间:2/21/2018 最后编辑:AndrewNico Schlömer 更新时间:2/27/2022 访问量:175

问:

背景

众所周知,两个浮点数的确切乘积并不总是浮点数,但误差是。一些精确乘法代码通过返回两个数字来利用这一点exact(a*b) - float(a*b)

res = a * b
err = fma(a, b, -res)

这利用了 fused-multiply-add 指令,该指令以一次舍入返回表达式。(a*b)+c

问题

现在,我想对总和做同样的事情,即

res = a + b
err = add3(a, b, -res)

add3应该返回一个四舍五入的表达式。(a+b)+c

除了这篇文章之外,我无法找到现实世界中实际存在的提示。add3

是否有包含 的 CPU 指令集?有没有语言实现它?add3

浮点 精度 集指令

评论

0赞 Paul R 2/21/2018
您在这里谈论的是 SIMD 还是标量运算?您在 AMD/Intel CPU 中有一个标签和一个指向 SIMD FMA 扩展的维基百科链接,但您上面的示例是针对 C/C++ 中的标量函数?ssefma()
0赞 Nico Schlömer 2/21/2018
问题是关于“”,而不是.add3fma
0赞 Paul R 2/21/2018
很好 - 但是上下文是标量还是 SIMD,您是在寻找特定的架构(例如 x86)还是一个更普遍的问题?为什么是标签?sse
1赞 Paul R 2/21/2018
好的 - 感谢您的澄清 - 我不知道有任何此类说明,但现在您在寻找什么更清楚了。
2赞 njuffa 2/27/2022
目前还不能作为任何主要处理器架构的指令提供,但本出版物展示了如何非常容易地模拟它:Sylvie Boldo 和 Guillaume Melquiond,“FMA 和正确舍入总和的仿真:使用四舍五入到奇数的证明算法”,IEEE Transactions on Computers,第 57 卷,第 4 期,2008 年 4 月,第 462-470 页
1赞 Eric Postpischil 12/2/2023
@PaulR:呃,将近六年的ping响应。
1赞 Eric Postpischil 12/2/2023
您是否需要对任何三个可表示的数字进行完全通用,或者您只想计算 和 显示?add3errres

答:

2赞 Eric Postpischil 12/2/2023 #1

问题中请求的 和 由 Jean-Michel Muller 等人《浮点算术手册》中的 Fast2Sum 算法提供,Birkhäuser,2009 年,第 126 页,第 4.3.1 节“Fast2Sum 算法”。该书将其归功于 1971 年的 Dekker,而 Kahan 在 1965 年更早地介绍了它的运作:errres

给定一个底数小于或等于 3 的浮点格式,具有次正态数,以及 numbers 并可用该格式表示 ||≥ ||,然后使用四舍五入到最接近:abab

s = a+b;
z = s-a;
t = b-z;

计算,例如最接近 + 和 + = + 的浮点数。(因此,和是问题中请求的和。stsabstabstreserr

||≥ ||绰绰有余;该算法只要求 的浮点指数至少是 的指数,但仅仅比较这些值可能更容易。因此,一个完整的实现需要类似于上述代码之前的内容。ababif (fabs(b) > fabs(a)) swap(&a, &b);

书中有一个证据。(证明有一个勘误表;它假设,在不损失一般性的情况下,> 0。这可能会在第二版中得到纠正。a

这不提供建议的一般功能,仅提供特定情况。 由 Boldo 和 Melquiond 在第 201 页第 6.3.4 节中的函数提供。它操纵浮点数的编码,这引发了性能和可移植性问题。这种操作仅限于递增或递减,因此标准 C 函数可以代替它,尽管这对性能来说不一定更好。add3add3CorrectRoundedSum3nexttoward

评论

0赞 Nico Schlömer 12/3/2023
这是我链接的文章中的算法 1.1。指令的想法是将最后两个步骤合并为一个操作。add3add3(a, b, -s)