2012-10-29 50 views
1

与策略MPI号码我开发了这个简单的函数来与MPI并行环境中执行n个的总和,使用其中每个处理器计算在成对不同的处理器及其部分和然后之间通信的策略他们计算的金额,创建一个二叉树。当然,如果处理器的数量是2^n的倍数,则可以应用该策略。萨姆Ñ在树

参数:menum = ID处理器,NPROC =处理器的总数量,和=部分和

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的总和的结果。但是在用户选择将引入参数“选择”的总和的处理器的情况下。怎么做?我在创建进程间数据交换的二叉树时遇到了问题。

回答

2

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

我假设你正在做这个练习并行通信而不是总结数字的目的,因为获得一笔款项可以用MPI_Reduce()轻松完成。