Heim > Artikel > Backend-Entwicklung > Wie kann ich mithilfe von MPI effizient 2D-Arrays zwischen Knoten senden und empfangen?
Die Verwendung von MPI für die Parallelverarbeitung bietet enorme Leistungsvorteile, insbesondere bei Berechnungen mit großen Matrizen. In solchen Szenarien kann die Aufteilung einer Matrix auf mehrere Knoten den Prozess erheblich optimieren.
Implementieren der gemeinsamen Nutzung von Kantenwerten
Im bereitgestellten Szenario muss jeder Knoten Kantenwerte mit teilen seine Nachbarn. Das vorgeschlagene Schema, um dies mithilfe von MPI zu erreichen, lautet wie folgt:
if (myrank == 0) { for (i = 0 to x) { for (y = 0 to y) { C++ CODE IMPLEMENTATION MPI_SEND(A[x][0], A[x][1], A[x][2], Destination= 1...) MPI_RECEIVE(B[0][0], B[0][1]......Sender = 1...) } } if (myrank == 1) { for (i = x+1 to xx) { for (y = 0 to y) { C++ CODE IMPLEMENTATION MPI_SEND(B[x][0], B[x][1], B[x][2], Destination= 0...) MPI_RECEIVE(A[0][0], A[0][1]......Sender = 1...) } } }
Array-Zuweisung optimieren
Um die Speicherverwaltung und MPI-Kommunikation zu vereinfachen, sollten Sie die Zuweisung von Arrays mit zusammenhängenden Elementen in Betracht ziehen anstelle der „mehrdimensionalen Arrays“ von C. Dies kann mit Funktionen wie den folgenden erreicht werden:
int **alloc_2d_int(int rows, int cols) { int *data = (int *)malloc(rows*cols*sizeof(int)); int **array= (int **)malloc(rows*sizeof(int*)); for (int i=0; i<rows; i++) array[i] = &(data[cols*i]); return array; } int **A; A = alloc_2d_init(N,M);
MPI-Senden/Empfangen
Sobald die Arrays zusammenhängend zugeordnet sind, wird das Senden und Empfangen ganzer N x M-Arrays unkompliziert :
MPI_Send(&(A[0][0]), N*M, MPI_INT, destination, tag, MPI_COMM_WORLD);
Barrieren vs. blockierendes Senden/Empfangen
MPI bietet mehrere Funktionen für die Kommunikation, einschließlich blockierender (z. B. MPI_Send) und nicht blockierender (z. B. MPI_Isend). Für blockierende Vorgänge sind keine Barrieren erforderlich, da die Kommunikation von Natur aus synchronisiert ist.
Andere MPI-Funktionen
Zusätzlich zu MPI_Send und MPI_Receive sollten Sie die Verwendung von MPI_Sendrecv für eine flexiblere Kommunikation in Betracht ziehen nicht blockierende Operationen wie MPI_Isend und MPI_Irecv, um Kommunikation und Berechnung zu überlappen.
Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von MPI effizient 2D-Arrays zwischen Knoten senden und empfangen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!