【发布时间】:2020-11-03 07:34:43
【问题描述】:
如何精确取大型浮点数组(100.000+ 个值)的平均值? 理想情况下使用 SIMD/AVX 指令。 rdi 中的数组指针; rsi 中数组的大小。
【问题讨论】:
-
现有代码..?什么是基本的和+除“不精确”?这些值是否会丢失(可能)相关信息?
-
目前我正在尝试找出更精确的方法 - 迭代加法或 Kahan 总和。两者似乎都是可行的方法。预计我使用的值不会处于任何极端,但我对这些数字没有“感觉”。将采用的算法将估计一个用于计算的“幻数”。
-
请注意,使用多个 SIMD 向量累加器展开的普通求和是朝着成对求和方向迈出的一步。我认为即使以速度为代价,您也希望最大限度地提高准确性,但也许其他未来的读者会考虑这一点(因为它也是对数组求和的最快方法,并且通常比天真的标量更准确)。 Simd matmul program gives different numerical results。 Efficient stable sum of a sorted array in AVX2 也有一些指向 SIMD Kahan 和其他求和算法的链接。
-
@EricPostpischil 我没有写它是“几乎不可能”,而是我在阅读后的第一刻认为题。 “几乎不可能”意味着一开始我怀疑是否存在在所有情况下都能提供正确结果的算法:在示例中,当我们按原始顺序汇总元素时,我们有 100% 的错误。示例
{ +1E+100, 16, -1E+100, -12}甚至会导致 300% 的错误。而且 300% 的错误绝对不是“精确的”。 -
为了澄清我所说的精确的意思:如果可以以无限精度添加所有浮点数,然后除以然后再次将结果减少为 32 位浮点数,我们将得到我定义为“精确" 所有浮点数的平均值。
标签: assembly floating-point precision simd avx