MPI_Reduce的问题

时间:2016-11-05 19:33:53

标签: c++ mpi

首先,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。

0 个答案:

没有答案