如何使用可并行化方法聚合浮点数组并获得精确结果?

时间:2015-05-13 19:58:55

标签: c++ parallel-processing floating-point aggregate floating-point-precision

要获得浮点数组的精确总和,我只需要对它们进行排序并添加每一对,然后再添加对(这些对的总和),直到我只有一个元素。 (正确的吗?)

当我想找到多个总和时,我该怎么做。 (正确的话?)

我假设乘以两个浮点数的确如此:(它也是正确的吗?)

// sign -> -1 or 1
// mantissa -> 0.5 ... <1.0 (Never actual 1.0)

new_sign = x_sign * y_sign
new_exponent = x_exponent + y_exponent
new_mantissa = x_mantissa * y_mantissa

if (new_mantissa < 0.5) {
    new_mantissa *= 2.0
    new_exponent--
}

new_signnew_exponent没有精确问题,我不应该注意它们。我应该看到new_mantissa精确失败。那么我应该用它们的尾数对浮点进行排序,然后呢?说的是对的?

如果我的方向不正确,那么实现这种效果的正确方向是什么?

1 个答案:

答案 0 :(得分:1)

数十亿双精度倍增的主要问题是指数溢出和下溢。假设double是IEEE 754 64位二进制浮点数,则最大有限双精度的十亿分之一根约为1.0000007097829648。最小正双的十亿根约为0.9999992555602052。将十亿个数字相乘,每个数字大于1.0000007097829648将产生无限的结果。每个小于0.9999992555602052的十亿个数字的乘数将下降到零。

最简单的解决方案是添加输入的对数以获得其产品的对数。对数计算非常平行。

为了准确,应使用Kahan summation计算对数之和,以获得O(1)误差增长。为了提高性能,应该并行完成,建议pairwise summation

可能值得尝试妥协。让每个处理器对一部分输入进行Kahan求和,然后让一个处理器对这些和的Kahan求和。

或者,让一个线程执行完整的Kahan求和,但是当它们由所有其他线程生成时,将对数块提供给它。