Dies ist eine häufige Quelle der Verwirrung für MPI-Neulinge. Sie verwenden MPI_Recv()
keine Daten, die von einer Sendung gesendet werden. Sie verwenden MPI_Bcast()
.
Was Sie beispielsweise wollen, ist Folgendes:
#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);
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 die kollektive MPI-Kommunikation muss sich jeder beteiligen . Jeder muss den Bcast oder den Allreduce anrufen oder was hast du? (Aus diesem Grund verfügt die Bcast-Routine über einen Parameter, der den "Stamm" angibt oder angibt, wer das Senden ausführt. Wenn nur der Absender bcast heißt, benötigen Sie diesen 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, sodass Sie angeben, was geschehen soll (jeder erhält die Daten eines Prozesses) und nicht, wie dies geschieht (z. B. Root-Prozessor-Schleifen über alle anderen Ränge und Aktionen) ein Senden), so dass Spielraum für die Optimierung der Kommunikationsmuster besteht (z. B. eine baumbasierte hierarchische Kommunikation, die log(P)
Schritte anstelle von P
Schritten für P-Prozesse ausführt).