首先,MPI非常新。我有一个程序,使用矩形/中点规则来计算一个等于pi的函数的面积。当我使用涉及发送和接收的方法时,计算总是为pi提供一个好的值。但是,当测试MPI_Reduce实现同样的事情时,我得到了一个处理器的pi,但使用不同数量的处理器,我得到的值小于pi。我有代码输出每个处理器的local_sum,然后输出来自MPI_Reduce的global_sum。本地总和加起来是全局总和,不是pi。我无法弄清楚出了什么问题。任何帮助,将不胜感激。以下是相关的代码部分:
/* Add up the areas calculated by each process */
if (my_rank == 0) {
total = my_area;
for (source = 1; source < p; source++) {
MPI_Recv(&my_area, 1, MPI_DOUBLE, source, tag,
MPI_COMM_WORLD, &status);
total = total + my_area;
}
} else {
MPI_Send(&my_area, 1, MPI_DOUBLE, dest,
tag, MPI_COMM_WORLD);
}
//*********TEST BEGIN FOR USING MPI_REDUCE*********
// Print the local sums on each process
printf("Local sum for process %d - %f\n",
my_rank, my_area);
double global_sum;
// Reduce all of the local sums into the global sum
MPI_Reduce(
&my_area, // send data
&global_sum, // receive data
1, // number of elements in send buffer
MPI_DOUBLE, // MPI Datatype
MPI_SUM, // MPI Reduce Operation
0, // root process
MPI_COMM_WORLD); // MPI Communicator
//**********TEST END FOR USING MPI_REDUCE**********
/* Print the result */
if (my_rank == 0) {
printf("With n = %d rectangles, our estimate\n",
n);
printf("of the area from %f to %f = %.15f\n",
a, b, total);
cout << "The area calculated using MPI_Reduce was " << global_sum << "." << endl;
}
单个处理器的代码输出为:
输入积分限制a,b和箱数n,用空格分隔
0.0 1.0 10000000
流程0的本地总和 - 3.141593
n = 10000000个矩形,我们的估计值
的面积从0.000000到1.000000 = 3.141592653473855
使用MPI_Reduce计算的面积为3.14159。
使用(例如)四个处理器的代码输出为:
流程1的本地金额 - 0.923739
流程2的本地金额 - 0.775058
流程0的本地总和 - 0.453312
流程3的本地金额 - 0.453312
n = 10000000个矩形,我们的估计值
的面积从0.000000到1.000000 = 3.141591655190580
使用MPI_Reduce计算的面积为2.60542。