Verwendung von MPI_Bcast für die MPI-Kommunikation

Lesezeit: 3 Minuten

Davids Benutzeravatar
David

Ich versuche, eine Nachricht vom Root-Knoten mit MPI_Bcast an alle anderen Knoten zu senden. Wenn ich dieses Programm jedoch ausführe, hängt es immer am Anfang. Weiß jemand, was daran falsch ist?

#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
        int rank;
        int buf;
        MPI_Status status;
        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);

        if(rank == 0) {
                buf = 777;
                MPI_Bcast(&buf, 1, MPI_INT, 0, MPI_COMM_WORLD);
        }
        else {
                MPI_Recv(&buf, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
                printf("rank %d receiving received %d\n", rank, buf);
        }

        MPI_Finalize();
        return 0;
}

Benutzeravatar von Jonathan Dursi
Jonathan Dursi

Dies ist eine häufige Quelle der Verwirrung für Menschen, die neu bei MPI sind. Sie verwenden nicht MPI_Recv() von einer Sendung gesendete Daten zu empfangen; Sie nutzen MPI_Bcast().

Was Sie z. B. wollen, ist dies:

#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
        int rank;
        int buf;
        const int root=0;

        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);

        if(rank == root) {
           buf = 777;
        }

        printf("[%d]: Before Bcast, buf is %d\n", rank, buf);

        /* everyone calls bcast, data is taken from root and ends up in everyone's buf */
        MPI_Bcast(&buf, 1, MPI_INT, root, MPI_COMM_WORLD);

        printf("[%d]: After Bcast, buf is %d\n", rank, buf);

        MPI_Finalize();
        return 0;
}

Für MPI-Sammelkommunikationen, alle muss teilnehmen; Jeder muss den Bcast oder den Allreduce oder was auch immer anrufen. (Deshalb hat die Bcast-Routine einen Parameter, der den “Root” angibt, oder wer sendet; wenn nur der Sender bcast anruft, brauchen Sie das nicht.) Jeder ruft den Broadcast auf, einschließlich der Empfänger; Die Empfänger senden nicht nur einen Empfang.

Der Grund dafür ist, dass die kollektiven Operationen jeden in die Kommunikation einbeziehen können, so dass Sie angeben, was passieren soll (jeder erhält die Daten eines Prozesses), anstatt zu sagen wie es passiert (z. B. überschleift der Root-Prozessor alle anderen Ränge und führt eine Sendung durch), so dass Spielraum zum Optimieren der Kommunikationsmuster besteht (z. B. eine baumbasierte hierarchische Kommunikation, die dauert log(P) Schritte statt P Schritte für P-Prozesse).

  • Danke, dass du es so erklärst. Ich bin jedoch immer noch verwirrt darüber, wie jeder Knoten die Nachricht mit MPI_Recv empfangen soll. Ich habe versucht, einen MPI_Recv-Aufruf in einen if(rank != 0)-Block und ohne einen zu verpacken, aber mein Programm druckt immer noch nichts. Wissen Sie, wie Sie die Nachricht auch auf jedem Knoten empfangen können?

    – David

    23. Oktober 2011 um 20:34 Uhr

  • Du nicht. MPI_Bcast ist nicht wie ein Send; es ist eine kollektive Operation, die alle nimmt teil, Sender und Empfänger, und am Ende des Anrufs hat der Empfänger den Wert, den der Sender hatte. Derselbe Funktionsaufruf macht (so etwas wie) ein Senden, wenn der Rang == root (hier 0), und (so etwas wie) ein Empfangen sonst. Ich habe den obigen Code aktualisiert, damit Sie sehen können, dass alle dasselbe Ergebnis erzielen.

    – Jonathan Dursi

    23. Oktober 2011 um 21:01 Uhr


  • @David: Wenn du denkst MPI_Bcast als Bedeutung von „an einem Sendeereignis teilnehmen“ macht es vielleicht mehr Sinn.

    – Hugh Perkins

    22. Juni 2013 um 2:41 Uhr

  • Dieser Kommentar war ein Glücksfall … Ich schwöre, so viel von MPI ist in seinen Designabsichten nicht intuitiv oder mehrdeutig …

    – Schn

    1. Mai 2021 um 2:15 Uhr

Benutzeravatar von GoingMyWay
Ich gehe meinen Weg

MPI_Bcast ist eine kollektive Operation und muss von allen Prozessen aufgerufen werden, um abgeschlossen zu werden.

Und es ist nicht nötig anzurufen MPI_Recv beim Benutzen MPI_Bcast. Es gibt einen Beitrag, der für Sie hilfreich sein könnte, klicken Sie hier

1418890cookie-checkVerwendung von MPI_Bcast für die MPI-Kommunikation

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy