cmpidistributed-computingmpichleader

MPI Ring Leader Election returns segmentation fault


This is what I am trying to achieve.

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

enter image description here

The code seems correct to me but it's always stuck inside the while loop no matter what I tried. For a small number of nodes during runtime it returns a segmentation fault after a 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();

Solution

  • In order to determine some minimum number among a number of ranks for all ranks, use MPI_Allreduce!