我正在使用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位后开始有所不同。
我无法得到答案为什么结果会有所不同,正如在我看来,它完全完成相同的任务,无论任务是如何分配的。
非常感谢任何帮助!
答案 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);
首先将数字添加到临时结果中,发生较少的截断。很可能你的代码中发生了类似的事情。