1

MPI を使用してツリー サムを実装しようとしています。プロセスごとに新しいランク番号を作成しました。各反復で、奇数の new_rank を持つ各プロセスは、その値をより低い new_rank を持つプロセスに送信し、戻ります。

これはコードです:

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 で停止します。

私が間違っているのは何ですか?

4

1 に答える 1

1

あなたのコードはあなたが期待していることをしていません。

ランク 1 のプロセスについては、プロセス 0 にメッセージを送信し、return によって関数を終了します。

ランク 0 のプロセスでは、最初にプロセス 1 からメッセージを受信し、次にnew_rank(`new_rank / 2 = 0 / 2 = 0) に対して無駄な更新を行い、次の反復で受信時にブロックします。ランク 1 のプロセスからのメッセージを期待しているが、そのプロセスはすでに送信を停止しているためです。

于 2013-04-14T19:40:48.110 に答える