0

我在一个非常简单的 PI 计算中使用 MPI,使用数值积分,使用一些数学规则,最终我将计算转换为求和,它具有以下格式:

PI = ∑(f(i)),其中 i 从 1 到 100000 开始,f(i) 是一个基于 i 返回某个 double 类型值的函数。

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

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

我无法回答为什么结果会有所不同,因为在我看来,无论任务如何分配,它都只是执行完全相同的任务。

任何帮助将不胜感激!

4

1 回答 1

2

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

    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);

通过首先将数字添加到临时结果,减少截断的发生。您的代码中很可能会发生类似的情况。

于 2013-02-19T08:38:24.973 回答