2013-02-19 49 views
0

我正在使用MPI对一个使用数值积分的PI进行非常简单的计算,并使用一些数学规则,最终将计算结果转换为总和,其格式为:使用MPI进行简单计算,不同数量的进程会得到不同的结果?

PI =Σ(f(i)) ,我从1到100000开始,而f(i)是一个函数,返回一些基于i的double型值。

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

然而,在使用过程不同数量的我,最后的结果会略有不同,我的最终结果PI有12位精度,结果开始大约为第7位后的不同。

我不能得到答案,为什么结果会不同,因为在我心中,它只是不正是相同的任务没有母校的任务如何分配。

非常感谢您的帮助!

+0

我认为你的问题得到了切断 – pyCthon 2013-02-19 02:35:18

+0

我们对此深感抱歉,我只是重新编辑我的问题。 – Bpache 2013-02-19 02:53:31

+0

你能显示你的代码吗? – tune2fs 2013-02-19 08:36:08

回答

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

通过首先将数字添加到临时结果,更少的截断发生。这很可能是这样的事情发生在你的代码中。

+0

非常感谢。非常清楚 – Bpache 2013-02-19 11:43:22

相关问题