Maison > Article > développement back-end > Comment puis-je envoyer et recevoir efficacement des tableaux 2D entre des nœuds à l’aide de MPI ?
L'utilisation de MPI pour le traitement parallèle offre d'immenses avantages en termes de performances, en particulier pour les calculs impliquant de grandes matrices. Dans de tels scénarios, diviser une matrice sur plusieurs nœuds peut optimiser considérablement le processus.
Mise en œuvre du partage des valeurs Edge
Dans le scénario fourni, chaque nœud doit partager des valeurs Edge avec ses voisins. Le schéma suggéré pour y parvenir en utilisant MPI est le suivant :
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...) } } }
Optimisation de l'allocation des tableaux
Pour simplifier la gestion de la mémoire et la communication MPI, envisagez d'allouer des tableaux avec des éléments contigus au lieu des "tableaux multidimensionnels" de C. Ceci peut être réalisé en utilisant des fonctions telles que :
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);
Envoi/réception MPI
Une fois les baies allouées de manière contiguë, l'envoi et la réception de baies N x M entières deviennent simples. :
MPI_Send(&(A[0][0]), N*M, MPI_INT, destination, tag, MPI_COMM_WORLD);
Barrières ou blocage des envois/réceptions
MPI offre plusieurs fonctions de communication, notamment le blocage (par exemple, MPI_Send) et le non-blocage (par exemple, MPI_Isend). Pour bloquer les opérations, les barrières sont inutiles, car la communication est intrinsèquement synchronisée.
Autres fonctions MPI
En plus de MPI_Send et MPI_Receive, pensez à utiliser MPI_Sendrecv pour une communication plus flexible ou opérations non bloquantes comme MPI_Isend et MPI_Irecv pour chevaucher la communication et le calcul.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!