使用MPI实现树总和

时间:2013-04-14 19:09:17

标签: c mpi

我正在尝试使用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。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的代码没有达到预期效果。

对于排名为1的进程,他向进程0发送一条消息,并通过return返回该函数。

对于排名为0的进程,首先它接收来自进程1的消息,然后它对new_rank(`new_rank / 2 = 0/2 = 0)进行无用的更新,并在随后的迭代中,它将阻止接收,因为它期望来自进程的消息具有等级1,但该进程已经停止发送。