MPI 环领导者选举 returns 分段错误

MPI Ring Leader Election returns segmentation fault

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

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 循环中。对于运行时的少量节点,一段时间后 returns 出现分段错误。

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();

为了确定所有等级的等级中的最小数量,使用MPI_Allreduce

  • MPI_Send 正在阻塞。它可以永远阻塞,直到发布匹配的接收为止。您的程序在第一次调用 MPI_Send 时陷入僵局 - 并且任何连续的一次都应该是巧合完成的。为避免这种情况,专门使用 MPI_Sendrecv.
  • (world_rank-1)%world_size 将为 world_rank == 0 生成 -1。使用 -1 作为排名编号无效。可能巧合的是 MPI_ANY_SOURCE.