Maison  >  Article  >  développement back-end  >  Comment puis-je envoyer et recevoir efficacement des tableaux 2D entre des nœuds à l’aide de MPI ?

Comment puis-je envoyer et recevoir efficacement des tableaux 2D entre des nœuds à l’aide de MPI ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-09 21:12:02420parcourir

How Can I Efficiently Send and Receive 2D Arrays Between Nodes Using MPI?

Envoi et réception de tableaux 2D via 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] = &amp;(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(&amp;(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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn