MPI Pack

De Wiki de Calcul Québec
(Redirigé depuis Pack)
Aller à : Navigation, rechercher
Autres langues :anglais 100% • ‎français 100%

Cet exemple permet d'illustrer l'utilisation des fonctions MPI_Pack et MPI_Unpack pour le transfert de plusieurs variables lors d'une seule communication MPI.

Chaque processus identifie son rang. Par la suite le processus 0 regroupe en paquet les trois variables : a, b, n. Les deux premières sont de type réel alors que la dernière est de type entier. La variable buffer est un descripteur qui contiendra la liste des positions en mémoire des objets à communiquer. La variable position n'est utile que lors de la construction du paquet, afin de mémoriser où nous sommes. Par la suite, le processus 0 communique le tout aux autres processus. Lorsque ces derniers reçoivent le message, ils extraient l'information désirée. En sortie, on fait afficher les valeurs des variables pour s'assurer que la communication a réussi.

En Fortran

Fichier : pack.f
!--------------------------------------------------------
! Cet exemple est tiré de :
!         A User's Guide to MPI, Peter S. Pacheco (1998)
!
! Auteur : Steve Allen
!          Centre de calcul scientifique
!          Université de Sherbrooke
!
! Dernière révision : septembre 2005
!--------------------------------------------------------
      Program Exemple_Pack
      include "mpif.h"
 
      integer            :: myrank, ierr
      integer            :: position
      integer            :: n
      real               :: a, b
      character(len=100) :: buffer
 
      call MPI_INIT(ierr)
      call MPI_COMM_RANK(MPI_COMM_WORLD, myrank, ierr)
 
      if (myrank .eq. 0) then
         n = 4
         a = 1.
         b = 2.
         print*,'Rank=',myrank,' a=',a,' b=',b,' n=',n
         position = 0
 
    ! packing
         call MPI_PACK(a,1,MPI_REAL,buffer,100,position,MPI_COMM_WORLD,ierr)
         call MPI_PACK(b,1,MPI_REAL,buffer,100,position,MPI_COMM_WORLD,ierr)
         call MPI_PACK(n,1,MPI_INTEGER,buffer,100,position,MPI_COMM_WORLD,ierr)
 
    ! communication
         call MPI_BCAST(buffer,100,MPI_PACKED,0,MPI_COMM_WORLD,ierr)
 
      else
 
    ! communication
         call MPI_BCAST(buffer,100,MPI_PACKED,0,MPI_COMM_WORLD,ierr)
         position = 0
 
    ! unpacking
         call MPI_UNPACK(buffer,100,position,a,1,MPI_REAL,MPI_COMM_WORLD,ierr)
         call MPI_UNPACK(buffer,100,position,b,1,MPI_REAL,MPI_COMM_WORLD,ierr)
         call MPI_UNPACK(buffer,100,position,n,1,MPI_INTEGER,MPI_COMM_WORLD,ierr)
         print*,'Rank=',myrank,' a=',a,' b=',b,' n=',n
      endif
 
      call MPI_FINALIZE(ierr)
      end program Exemple_Pack


En C

Fichier : pack.c
/*--------------------------------------------------------  
 Cet exemple est tiré de :
         A User's Guide to MPI, Peter S. Pacheco (1998)
 
 Auteur : Steve Allen
          Centre de calcul scientifique
          Université de Sherbrooke
 
 Dernière révision : septembre 2005
--------------------------------------------------------*/
 
#include <stdio.h>
#include "mpi.h"
 
int main(int argc,char** argv)
{
   int     myrank;
   int     position;
   int     n;
   float   a, b;
   char    buffer[100];
 
   MPI_Init(&argc, &argv);
   MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
 
   if (myrank == 0){
      n = 4;
      a = 1.;
      b = 2.;
      printf("Rank=%d, a= %f, b= %f, and n=%d\n", myrank, a, b, n);
      position = 0;
 
    // packing
      MPI_Pack(&a, 1, MPI_FLOAT, buffer, 100, &position, MPI_COMM_WORLD);
      MPI_Pack(&b, 1, MPI_FLOAT, buffer, 100, &position, MPI_COMM_WORLD);
      MPI_Pack(&n, 1, MPI_INT, buffer, 100, &position, MPI_COMM_WORLD);
 
    // communication
      MPI_Bcast(buffer, 100, MPI_PACKED, 0, MPI_COMM_WORLD);
 
   } else {
 
    // communication
      MPI_Bcast(buffer, 100, MPI_PACKED, 0, MPI_COMM_WORLD);
      position = 0;
 
    // unpacking
      MPI_Unpack(buffer, 100, &position, &a, 1, MPI_FLOAT, MPI_COMM_WORLD);
      MPI_Unpack(buffer, 100, &position, &b, 1, MPI_FLOAT, MPI_COMM_WORLD);
      MPI_Unpack(buffer, 100, &position, &n, 1, MPI_INT, MPI_COMM_WORLD);
      printf("Rank=%d, a= %f, b=%f, and n=%d\n", myrank, a, b, n);
   }
 
   MPI_Finalize();
}


Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Ressources de Calcul Québec
Outils
Partager