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

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

对于rank为1的进程,他向进程0发送消息,并通过return存在函数。

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

于 2013-04-14T19:40:48.110 回答