【问题标题】:Using MPI for simple calculation, different numbers of processes get different results?使用MPI进行简单计算,不同数量的进程得到不同的结果?
【发布时间】:2013-02-19 02:32:10
【问题描述】:

我在一个非常简单的 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 位后结果开始不同。

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

任何帮助将不胜感激!

【问题讨论】:

  • 我认为你的问题被切断了
  • 抱歉,我刚刚重新编辑了我的问题。
  • 你能展示你的代码吗?
  • 您的源代码被编译为使用 x87 FPU 指令的 32 位 x86 代码,不是吗?

标签: mpi


【解决方案1】:

浮点运算的数值结果通常取决于它们的执行顺序。要理解这一点,您首先需要了解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);

通过先将数字添加到临时结果,减少截断的发生。您的代码中很可能发生了这样的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 2012-09-26
    • 2019-09-04
    • 2016-10-12
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多