1

这就是我想要达到的目标。

Blue is the message.
Yellow is when the specific node changes the leader known to it.
Green is the final election of each node.

在此处输入图像描述

该代码对我来说似乎是正确的,但无论我尝试什么,它总是卡在 while 循环中。对于运行时的少数节点,它会在一段时间后返回分段错误。

election_status=0;
firstmsg[0]=world_rank;     // self rank
firstmsg[1]=0;              // counter for hops
chief=world_rank;           // each node declares himself as leader
counter=0;                  // message counter for each node

// each node sends the first message to the next one
MPI_Send(&firstmsg, 2, MPI_INT, (world_rank+1)%world_size, 1, MPI_COMM_WORLD);
printf("Sent ID with counter to the right node [%d -> %d]\n",world_rank, (world_rank+1)%world_size);

while (election_status==0){
    // EDIT: Split MPI_Recv for rank 0 and rest
    if (world_rank==0){
        MPI_Recv(&incoming, 2, MPI_INT, world_size-1, 1, MPI_COMM_WORLD, &status);
    }
    else {
        MPI_Recv(&incoming, 2, MPI_INT, (world_rank-1)%world_size, 1, MPI_COMM_WORLD, &status);
    }
    counter=counter+1;
    if (incoming[0]<chief){
        chief=incoming[0];
    }
    incoming[1]=incoming[1]+1;

    // if message is my own and hopped same times as counter
    if (incoming[0]==world_rank && incoming[1]==counter) {
        printf("Node %d declares node %d a leader.\n", world_rank, chief);  
        election_status=1;
    }
    //sends the incremented message to the next node
    MPI_Send(&incoming, 2, MPI_INT, (world_rank+1)%world_size, 1, MPI_COMM_WORLD);  
}

MPI_Finalize();
4

1 回答 1

1

为了确定所有等级的多个等级中的某个最小数量,请使用MPI_Allreduce!

  • MPI_Send正在阻塞。它可以永远阻塞,直到发布匹配的接收。您的程序在第一次调用 MPI_Send 时出现死锁 - 任何后续的一次调用都应该巧合完成。为了避免这种情况,专门使用MPI_Sendrecv.
  • (world_rank-1)%world_size将产生-1. world_rank == 0用作-1排名编号无效。可能是巧合MPI_ANY_SOURCE
于 2017-06-07T14:15:33.980 回答