2013-04-14 52 views
1

我試圖實現使用MPI的樹總和。 我爲每個進程創建了一個新的等級號。在每次迭代中,每個具有奇數new_rank的進程都將其值發送到new_rank較低的進程並返回。使用MPI實現樹總和

這是代碼:

void tree_sum(int rank,int size,int *value){ 
int new_rank = rank; 
int remaining_processes = size/2 ; 
MPI_Status status; 
int local_value; 

while(remaining_processes > 0){ 

    if(is_odd_number(new_rank)){ 
     // Todos os processos de new_rank impar enviam 
     MPI_Send(&value,1,MPI_INT,new_rank-1,0,MPI_COMM_WORLD); 
     return; 
    }else{ 
     // Todos os processos de new_rank par recebem 
     MPI_Recv(&local_value,1,MPI_INT,new_rank+1,0,MPI_COMM_WORLD,&status); 
     *value += local_value; 

     new_rank = new_rank/2; 

     remaining_processes--; 
    } 
} 
return; 
} 

它在最近一次反覆失敗。 new_rank = 1的過程將它的值發送到new_rank = 0,但它沒有被接收。進程0卡在MPI_Recv中。

我做錯了什麼?

+1

is_odd_number(0)評估爲真或假? –

+0

@CristianoSousa是的。如果new_rank爲奇數則返回1,否則返回0。 is_odd_number(0)返回0. is_odd_number(13)返回1. –

回答

1

你的代碼沒有做你期望的。

對於等級爲1的進程,他向進程0發送一條消息,並通過返回存在該函數。

對於排名爲0的進程,首先收到來自進程1的消息,然後在new_rank(`new_rank/2 = 0/2 = 0)進行無用的更新,在接下來的迭代中,阻止接收,因爲它期望來自等級爲1的進程的消息,但該進程已經停止發送。

+0

它預計運行偶數個線程。因此進程0將接收來自new_rank = 1的進程的數據,進程1將退出,進程2將假設new_rank = 1(rank/2 = 1),並且進程3將退出。 –

+1

MPI不會那樣工作。你不能改變(我知道)等級號的外部視圖。這意味着,您正在將new_rank分配給differente值,但對於所有其他進程,rank號保持不變。 –

+0

你完全正確。我忘記了我必須使用原始的排名數字發送消息!愚蠢的錯誤。謝謝=) –