Parallel processing 在树上使用策略对mpi中的n个数字求和

Parallel processing 在树上使用策略对mpi中的n个数字求和,parallel-processing,mpi,Parallel Processing,Mpi,我开发了这个简单的函数,用mpi在并行环境中执行n个数的和,使用每个处理器计算其部分和的策略,然后在两两不同的位置,处理器在它们之间通信计算的量,创建一个二叉树。当然,如果处理器数量是2^n的倍数,则可以应用此策略 参数:menum=id processor,nproc=processor总数,sum=partial sum void Second_Strategy( int menum ,int nproc,int sum, MPI_Status status) { int a

我开发了这个简单的函数,用mpi在并行环境中执行n个数的和,使用每个处理器计算其部分和的策略,然后在两两不同的位置,处理器在它们之间通信计算的量,创建一个二叉树。当然,如果处理器数量是2^n的倍数,则可以应用此策略

参数:menum=id processor,nproc=processor总数,sum=partial sum

  void Second_Strategy( int menum ,int nproc,int sum, MPI_Status status)
  {
    int a,b,p,i,sumtmp;
    double t_tot, t1, t2, diff;

    p=log(nproc)/log(2);
    t1 = MPI_Wtime();

    for(i=1;i<=p;i++)
    {
       b=pow(2,i-1);
       a=pow(2,i);
       if ( (menum % a) ==0) 
       {
          MPI_Recv(&sumtmp,1,MPI_INT,(menum+b),i,MPI_COMM_WORLD,&status);
          sum=sum+sumtmp;

        }else{
               if ( ( menum % b) ==0){MPI_Send(&sum,1,MPI_INT,(menum-b),i,MPI_COMM_WORLD); }

            }
      }
        t2 = MPI_Wtime();
        diff = t2-t1;
        MPI_Reduce(&diff, &t_tot, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);

        if(menum==0) 
        {

          printf("The sum is : %d \n ",sum);
          printf("Time  : %f seconds\n", t_tot);

        }      

 }
void Second_策略(int menum、int nproc、int sum、MPI_状态)
{
INTA、b、p、i、sumtmp;
双t_-tot,t1,t2,diff;
p=对数(nproc)/对数(2);
t1=MPI_Wtime();

对于(i=1;i而言,最简单的解决方案是创建一个新的通信器,用户选择的进程在其中接收秩0。然后只需在树构建算法中使用该通信器,而不是使用
MPI\u COMM\u WORLD

当然,我假设您这样做是为了并行通信的练习,而不是为了求和,因为使用
MPI\u Reduce()
可以很容易地获得和