Выбор MPI Ring Leader возвращает ошибку сегментации

Это то, чего я пытаюсь достичь.

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

1 ответ

Решение

Чтобы определить некоторое минимальное число среди числа рангов для всех рангов, используйте MPI_Allreduce!

  • MPI_Send блокирует Он может блокироваться навсегда, пока не будет опубликован соответствующий прием. Ваша программа блокируется при первом вызове MPI_Send - и любой последующий один раз, если она завершится по совпадению. Во избежание этого специально используйте MPI_Sendrecv,
  • (world_rank-1)%world_size будет производить -1 за world_rank == 0, С помощью -1 так как ранг номер не действителен. Это может совпадать MPI_ANY_SOURCE,
Другие вопросы по тегам