使用MPI进行简单计算,不同数量的流程会得到不同的结果?

时间:2013-02-19 02:32:11

标签: mpi

我正在使用MPI对数字积分进行非常简单的计算,使用一些数学规则,最终我将计算转换为求和,其中有这种格式:

PI =Σ(f(i)),其中i从1到100000开始,f(i)是基于i返回一些双重类型值的函数。

在进行编程时,我可以将总和转换为for循环,迭代100000次。使用p处理器的MPI,我将for循环分成p段,每个处理器得到100000 / p循环(假设100000%p = 0)。然后使用MPI_Reduce,MPI_SUM收集这些子结果并将它们相加以得到最终结果。

但是,当我使用不同数量的进程时,最终结果会略有不同,我的最终PI结果有12位精度,结果在第7位后开始有所不同。

我无法得到答案为什么结果会有所不同,正如在我看来,它完全完成相同的任务,无论任务是如何分配的。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

浮点运算的数值结果通常取决于它们的执行顺序。要理解这一点,首先需要了解计算机如何表示floating point numbers。一个例子是当添加不同大小的数字时:由于不同的指数,一个将被截断(例如舍入)。您可以通过此示例看到这一点:

    double small, result1, result2;
    small = 1. / 3000.;
    result1 = 0.;
    for (int i = 0; i < 10000; i++)
            result1 += small;

    result2 = 0.;
    for (int i = 0; i < 100; i++) {
            double tmp = 0.;
            for (int j = 0; j < 100; j++)
                    tmp += small;
            result2 += tmp;
    }
    printf("result1= %.17g, result2= %.17g\n", result1, result2);

首先将数字添加到临时结果中,发生较少的截断。很可能你的代码中发生了类似的事情。