C 采用矩形面积求和法计算曲线下面积时,遵循MPI程序的错误是什么

C 采用矩形面积求和法计算曲线下面积时,遵循MPI程序的错误是什么,c,mpi,C,Mpi,我通过在曲线4/1+x*x下从0到1的范围内求面积来计算pi3.14的值。下面是用C编写的MPI程序 但是,当有一个过程时,它会给出正确的值。如果我给出多个进程,那么只有秩为0的进程给出一些值,而其他进程给出0.0作为其局部计算值 以下代码中有什么错误 #include<mpi.h> #include<math.h> #include<stdio.h> #define MAX_NAME 80 int main(int argc,char *argv[])

我通过在曲线4/1+x*x下从0到1的范围内求面积来计算pi3.14的值。下面是用C编写的MPI程序

但是,当有一个过程时,它会给出正确的值。如果我给出多个进程,那么只有秩为0的进程给出一些值,而其他进程给出0.0作为其局部计算值

以下代码中有什么错误

#include<mpi.h>
#include<math.h>
#include<stdio.h>

#define MAX_NAME 80 
int main(int argc,char *argv[])
{


    MPI_INIT(&argc,&argv);
    int rank,nprocs,len;
    double i=0.0;
    double n=1000000000.0;
    double PI25DT =3.141592653589793238462643;
    double mypi,pi,step,sum,x;
    char name[MAX_NAME];
    double start_time,end_time,computation_time;
    MPI_Comm_size(MPI_COMM_WORLD,&nprocs);
   MPI_Comm_rank(MPI_COMM_WORLD,&rank);
   MPI_Get_processor_name(name,&len);   
   start_time=MPI_Wtime();

    sum=0.0;
    step=1.0/(double)n;

    x=0.0;
    x=(double)rank*(n/nprocs);
    x=x+step;
    double temp=x;
    for(i=temp;i<(temp+(n/nprocs));i=i+1.0)
    {

       sum+=step*(4.0/(1.0+(double)(x*x)));
       x=x+step;    
     }


    mypi=sum;
    printf("\nProcessor: %d Name: %s Sum: %.16f \n",rank,name,mypi);
    MPI_Barrier(MPI_COMM_WORLD);
    MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);

    if(rank==0)
    {
    printf("\nValue of Pi is %.16f approximately .Error is %.16f \n",pi,fabs(pi-PI25DT));
    end_time=MPI_Wtime();
    computation_time=end_time-start_time;
    printf("\nComputation time is: %f seconds.\n",computation_time);
    }
   MPI_Finalize();
  }
一个过程和多个过程的上述代码输出如下:


代码中的整个逻辑似乎有缺陷——在for循环中混淆了整数和double,这意味着循环限制都是错误的

调试简单程序最简单的方法就是将其打印到屏幕上——我总是惊讶于人们是多么沉默寡言,只是让他们的程序告诉他们它实际上在做什么

如果我设置n=5.0并将循环更改为:

x=x+step;
printf("rank %d has x = %lf\n", rank, x);
然后在两个过程中,我得到:

rank 0 has x = 0.400000
rank 0 has x = 0.600000
rank 0 has x = 0.800000

Processor: 0 Name: starless Sum: 2.0471212357622095 

Value of Pi is 2.3040395511642187 approximately .Error is 0.8375531024255745 

Computation time is: 0.000067 seconds.
rank 1 has x = 2.900000
rank 1 has x = 3.100000
rank 1 has x = 3.300000

Processor: 1 Name: starless Sum: 0.2569183154020093 
显示循环限制是错误的

我甚至不认为他们在一个过程中是正确的:

rank 0 has x = 0.400000
rank 0 has x = 0.600000
rank 0 has x = 0.800000
rank 0 has x = 1.000000
rank 0 has x = 1.200000
积分肯定在0.0到1.0之间

问候,


David

我没有得到正确的pi值作为答案。->代码产生什么答案?n/nprocs是整数除法。对于x=rank*n/nprocs;,这正确吗;?这段代码在一个进程中运行良好。如果我给出的nprocs>1,那么它给出的值是错误的。其他过程给出的值是0.0,因为n,所以是x。这里,sum+=step*4.0/1.0+doublex*x;与4相比,x*x是一个巨大的数字。对于master,x从零开始。这就是为什么你得到了uniprocess的正确答案。