1

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

参数:menum = id 处理器,nproc = 处理器总数,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);

        }      

 }

在这种情况下,过程 P0 将得到求和的结果。但是在用户要选择将具有引入参数“选择”的总和的处理器的情况下。怎么做?我在创建用于在进程之间交换数据的二叉树时遇到问题。

4

1 回答 1

2

最直接的解决方案是创建一个新的通信器,其中用户选择的进程接收等级 0。然后只需使用该通信器而不是MPI_COMM_WORLD在您的树构建算法中。

我当然假设您这样做是为了在并行通信中进行练习,而不是为了对数字求和,因为可以很容易地用MPI_Reduce().

于 2012-10-29T19:06:51.187 回答