2012-10-29 77 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()輕鬆完成。