Introduction à MPI Types dérivés MPI Décembre 2005

Slides:



Advertisements
Présentations similaires
Module Systèmes d’exploitation
Advertisements

GEF 243B Programmation informatique appliquée Listes chaînées I – Tableaux de structures §15.1 – 15.2.
GEF 243B Programmation informatique appliquée
Communications point à point Communications collectives Optimisations
Algorithmes et structures de données 9ème cours Patrick Reuter maître de conférences
Portée des variables VBA & Excel
Calculs de complexité d'algorithmes
GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §
GEF 243B Programmation informatique appliquée
Cours n° 8 Conception et Programmation à Objets
1 UMLV 1. Introduction 2. Hachage ouvert 3. Hachage fermé 4. Implémentation des fonctions Méthodes de hachage.
1 Réunion biblio 13/12/00 Support Vectors Présentation générale SSS Maintaining Algorithm.
Le jeu d ’instructions Introduction Un jeu d ’instruction classique
13 – 16 Décembre 2005 Laurence Viry Introduction à MPI MPI_2.
Introduction à MPI 13 – 16 Décembre 2005 Laurence Viry.
Communicateurs - Topologie
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage Java.
FLSI602 Génie Informatique et Réseaux
8. Les tableaux P. Costamagna – ISEN N1.
Introduction à la programmation (420-PK2-SL) cours 15 Gestion des applications Technologie de linformation (LEA.BW)
بسم الله الرحمن الرحيم. Institut Supérieure des Etudes Technologiques de Kébili.
Les sous-programmes Chapitre n° 5: Objectifs : Activité:
Parallel Programming in C with MPI and OpenMP
MPI et programmation par passage de messages
Améliorer les performances du chiffrage à flot SYND
Principes de programmation (suite)
Points importants de la semaine Les fonctions. La portée. La passage par copie. Les tableaux.
Structures de données linéaires
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
MPI (Message Passing Interface)
8PRO100 Éléments de programmation Comment faire prendre une décision à un ordinateur?
CSI3525: Concepts des Langages de Programmation Notes # 12: Implementation des Sous-Programmes ( Lire Chapitre 9 )
Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès.
Chapitre 21 Collections Partie I Introduction Une collection : est un objet qui regroupe multiple éléments dans une unité. Une collection est.
Équations Différentielles
Structures de données IFT Abder Alikacem La classe vector Édition Septembre 2009 Département dinformatique et de génie logiciel.
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Modèles d’implantation
Introduction à l’algorithmique
IGL301 - Spécification et vérification des exgiences 1 Chapitre 1 Introduction (ref : Bray chapitre 1)
Présentation Structures de Données et TDA
1 PROTOTYPE PGC++ Vecteur_3D DÉFINITION. 2 class Vecteur_3D { private : float vx, vy, vz, vw; // Représentation en coordonnées homogènes. public : Vecteur_3D();
IFT 6800 Atelier en Technologies d’information
8PRO107 Éléments de programmation
Chapitre 9 Les sous-programmes.
COURS DE PROGRAMMATION ORIENTEE OBJET :
Calcul des groupes d'homologie d’objets discrets
Tableaux Introduction aux tableaux à une dimension. Déclaration, stockage, initialisation et accès en lecture ou en écriture aux composantes d’un tableau.
Procédures et fonctions
Plan cours La notion de pointeur et d’adresse mémoire.
Les Types de données complexes
Stocker plusieurs valeurs de même type dans une variable
Gérer la sécurité des mots de passe et les ressources
LES PILES ET FILES.
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Programmation en Java Tableaux NGUYEN Thi Minh Tuyen
CSI2520  Cette fonction permet d’attribuer une valeur à une variable (set! nombre (+ 3 4)) (set! nombre (+ 1 nombre)) En SCHEME, les fonctions dont le.
Créer des packages.
Un survol du language C.
Programmation parallèle
Structures simples et tableaux Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Interprétation/Génération de code pour le langage Z minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
CSI 3525, Implémentation des sous-programmes, page 1 Implémentation des sous-programmes L’environnement dans les langages structurés en bloc La structure.
Cours LCS N°4 Présenté par Mr: LALLALI
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
Patricia Renault UPMC 2005/2006
8PRO107 Éléments de programmation Les adresses et les pointeurs.
Architecture et technologie des ordinateurs II
Transcription de la présentation:

Introduction à MPI Types dérivés MPI 13 -16 Décembre 2005 Laurence Viry

Types dérivés: sommaire Motivations Envoi de données non contiguës Envoi de messages successifs Utilisation de buffer: MPI_PACK, MPI_UNPACK Utilisation de types dérivés Types dérivés MPI Définition et validation (MPI_TYPE_STRUCT,…) Méthode de définition de type prédéfinie MPI_TYPE_CONTIGUOUS MPI_TYPE_VECTOR MPI_TYPE_HVECTOR MPI_TYPE_INDEXED MPI_TYPE_HINDEXED Utilisation de type dérivé MPI pour les types dérivés utilisateur 13 – 16 Décembre 2005 Laurence Viry

Types dérivés : Introduction Motivations: Transmettre des données de type mixte et/ou non contiguës en mémoire Utiliser des structures de données plus complexes Utiliser des types dérivés MPI pour les types dérivés utilisateurs (mapping) Jusqu’ici nous avons vu comment transmettre des données d’un même type intrinsèque MPI, contigues en mémoire. On verra qu’avec les types dérivés on va pouvoir transmettre simplement des données de type différents par un seul appel, des données qui ne sont pas de type MPI ainsi que des données non contigues en mémoire. 13 – 16 Décembre 2005 Laurence Viry

Données de type mixte ou non contigues en mémoire Plusieurs stratégies pour transmettre des données de type mixte ou non contigues en mémoire. Envoyer chaque paquet de données homogènes contiguës en mémoire à l’aide de messages séparés Copier les données dans un buffer (MPI_PACK) Utiliser les type dérivés MPI pour décrire Un bloc de données homogènes contiguës en mémoire Un bloc de données homogènes non contiguës en mémoire séparées par un pas fixe Un bloc de données homogènes non contiguës en mémoire séparées par un pas variable Un bloc de données non homogènes et non contiguës La première méthode qui consiste à envoyer par des messages séparés les données homogènes contigues en mémoire présentent: l’avantage d’être appliquée sans apprendre de nouveaux concepts MPI. l’inconvénient d’introduire un overhead dû aux appels successifs aux routines d’envoi et de réception de messages. Quelque soit la taille du message, l’appel à une routine d’envoi et de réception de messages introduit un overhead. Si la portion de programme concernée est très peu appelée et le nombre d’appels faible, on pourra ignorer cet overhead. Dans la plupart des cas, il n’y a aucune raison de se limiter à ce type de méthode. On préférera l’utilisation des types dérives MPI ou éventuellement la bufferisation des données. 13 – 16 Décembre 2005 Laurence Viry

Utilisation d’un buffer (MPI_PACK) Stocker des données de types mixtes: Appels successifs à MPI_PACK(…,count) Envoi du buffer avec le type « MPI_PACK» Réception des données bufferisées Données homogènes: en indiquant leur type dans l’appel de la réception Données non homogènes: Réception avec le type MPI_PACK Appel à MPI_UNPACK() la variable « count » est initialisée à 0 puis est mise à jour à chaque appel successif de MPI_PACK Les données sont envoyées avec le type MPI_PACK à la réception Il ne sera pas nécessaire de débufferiser les données si elles sont de type homogène, il suffira de les réceptionner (MPI_RECV…) en indiquant leur type. Rien dans le message indique qu’il a été bufferisé. Si elles sont de type non homogène, la réception se fait avec le type MPI_PACK et la débufferisation va se faire par des appels successifs à la routine MPI_UNPACK dans le même ordre que les appels à MPI_PACK Inversement, un message envoyé avec un type intrinsèque MPI, pourra être réceptionné avec le type MPI_PACK et débufferisé pour stocker les données reçues dans des espaces mémoire non contigues. 13 – 16 Décembre 2005 Laurence Viry

Utilisation d’un buffer (MPI_PACK) Évaluation de la taille utile du buffer après l’appel de la routine MPI_PACK_SIZE Conclusion Flexibilité dans l’utilisation de données de type mixte non contiguës de façon incrémentale Le coût réside dans l’utilisation de l’espace mémoire Le temps CPU pour copier et récupérer les données dans le buffer Les données communiquées peuvent ne pas occuper l même espace mémoire dans les deux processus. Il sera alors nécessaire de calculer la taille du buffer réceptionné avant l’appel à MPI_UNPACK Conclusion: Cette méthode apporte une grande flexibilité dans l’envoi de messages de type mixte Si cet envoi est fréquemment appelé et qu’il demande un nombre important d’appels à MPI_PACK et MPI_UNPACK, l’overhead dû à cette méthode peut être significatif. 13 – 16 Décembre 2005 Laurence Viry

Définition d’une sous-matrice de la matrice réelle A(n,n) k K+m-1 l l+m-1

Utilisation d’un buffer (MPI_PACK) Envoi: Appel de MPI_PACK pour la bufferisation Envoi du buffer avec le type MPI_PACK count=0 call MPI_PACK(m,1,MPI_INTEGER, & buffer,bufsize,count,MPI_COMM_WORLD,ierror do j=1,m call MPI_PACK(a(k,l+j-1),n,MPI_DOUBLE, & buffer,bufsize,count,MPI_COMM_WORLD,ierror) enddo call MPI_SEND(buffer,count,MPI_PACKED,dest,tag & ,MPI_COMM_WORLD,ierror) L’appel de MPI_PACK permet de bufferiser des données homogènes ou non. Les arguments fournis à la routine sont la description du beffer et la plupart des arguments qui seront fournis à MPI_SEND. Lorsque toutes les données sont placées dans le buffer, on envoie le buffer avec le type MPI_PACKED. La variable count est mise à jour à chaque appel de MPI_PACK et indique le nombre de données ajoutées au buffer. A la réception on peut : Soit recevoir le buffer avec le type MPI_PACKED et débufferiser avec l’appel de la routine MPI_UNPACK Soit, dans le cas de données homogènes, recevoir avec le type données. Rien dans le message n’indique que le corps du message a été bufferisé. Pour connaître la taille du buffer util, on peut faire appel à la routine MPI_PACK_SIZE. 13 – 16 Décembre 2005 Laurence Viry

Utilisation d’un buffer (MPI_PACK) Réception : Données homogènes: réception avec le type (ex:MPI_DOUBLE) Données hétérogènes: avec le type MPI_PACKED et appel de la routine MPI_UNPACKED 13 – 16 Décembre 2005 Laurence Viry

Utilisation des types dérivés Les phases de bufferisation sont intégrées dans les appels de communication(send et receive) Elle évite: Les étapes de bufferisation avant l’envoi et de débufferisation après la réception La copie entre le buffer intermédiaire(MPI_PACK) et le buffer de communication (MPI_SEND) En général plus efficace que la méthode de bufferisation (MPI_PACK,MPI_UNPACK) 13 – 16 Décembre 2005 Laurence Viry

Définition d’un type Dérivé Un type dérivé est constitué de plusieurs composants Constructions de 3 tableaux contenant: La longueur de chaque composant Sa localisation: appel de MPI_ADDRESS Son type Définir le nouveau type: appel MPI_TYPE_STRUCT() Valider ce type pour les procédures de communication: appel de MPI_TYPE_COMMIT() Libérer un type MPI: appel à MPI_TYPE_FREE() 13 – 16 Décembre 2005 Laurence Viry

Envoi d’une sous-matrice A(k+i-1,i=1,m;l+j-1,j=1,n) … ! Construction des 3 tableaux : loca,lena,typa do i=1,m lena(i)=n call MPI_ADDRESS(A(k,l+i-1),loca(i),ierror) typa(i)=MPI_DOUBLE enddo ! Définition du type MPI call MPI_TYPE_STRUCT(m,lena,loca,typa,mon_type_mpi,ierror) ! Validation du type MPI call MPI_TYPE_COMMIT(mon_type_mpi,ierror) ! Envoi de la sous-matrice call MPI_SEND(MPI_BOTTOM,1,mon_type_mpi, & dest,tag,MPI_COMM_WORLD,ierror) ! Libération du type MPI call MPI_TYPE_FREE(mon_type_mpi,ierror)

Autres définitions de type dérivé MPI Données homogènes contiguës en mémoire: MPI_TYPE_CONTIGUOUS Données homogènes non contiguës en mémoire espacées à pas constant: MPI_TYPE_VECTOR (MPI_TYPE_HVECTOR) Blocs de données de longueur variable et espacés à pas variable : MPI_TYPE_INDEXED(MPI_TYPE_HINDEXED) 13 – 16 Décembre 2005 Laurence Viry

Hiérarchie de types dérivés MPI MPI_TYPE_STRUCT MPI_TYPE_[H]INDEXED MPI_TYPE_[H]VECTOR MPI_TYPE_CONTIGUOUS MPI_REAL,MPI_INTEGER,…

Types dérivés données homogènes contiguës 1 6 11 16 21 26 2 7 12 17 22 27 3 8 13 18 23 28 4 9 14 19 24 29 5 10 15 20 25 30 call MPI_TYPE_CONTIGUOUS(5,MPI_REAL,nouveau_type,ierror) 13 – 16 Décembre 2005 Laurence Viry

Types dérivés Données homogènes à pas constant Blocs de données homogènes distants d’un pas constant. Le pas est donné en nombre d’éléments. … integer,intent(in) :: nombre_blocs,longueur_bloc integer,intent(in) :: pas ! En nombre d’elements integer,intent(in) :: ancien_type integer,intent(out) :: nouveau_type,ierror call MPI_TYPE_VECTOR(nombre_blocs,longueur_bloc, & pas,ancien_type,nouveau_type,ierror) 13 – 16 Décembre 2005 Laurence Viry

Type dérivé: type_ligne 1 6 21 26 31 36 2 7 22 27 32 37 3 8 23 28 33 38 4 9 24 29 34 39 5 10 25 30 35 40 L’instruction MPI_TYPE_HVECTOR va être utile quand le type générique qui permet de cnstruire le type dérivé n’est plus un type de base. call MPI_TYPE_VECTOR(6,1,5,MPI_REAL,nouveau_type,code) MPI_TYPE_HVECTOR identique à MPI_TYPE_VECTOR, la distance entre deux blocs est comptée en nombre de bytes

Types dérivés Données homogènes à pas variable MPI_TYPE_INDEXED() : permet de créer une structure de données composée de blocs de longueur variable, espacés d’un pas variable MPI_TYPE_HINDEXED() : même fonctionnalité que MPI_TYPE_INDEXED sauf que le pas séparant deux blocs est donné en octets Utile lorsque le type des éléments de base n’est pas un type intrinsèque MPI Attention à la portabilité de cette routine 13 – 16 Décembre 2005 Laurence Viry

Types dérivés Données homogènes à pas variable nb=3 ; longueur_blocs=(/2,1,2/ ;deplacements=(/0,3,7/) Ancien type Nouveau type integer,parameter,intent(in) :: nb=3 integer,intent(in),dimension(nb) :: longueurs_blocs,deplacements integer,intent(in) :: ancien_type integer,intent(out) :: nouveau_type,ierror call MPI_TYPE_INDEXED(nb,longueurs_blocs,deplacements, ancien_type,nouveau_type,ierror) 13 – 16 Décembre 2005 Laurence Viry

nb=4 ; longueur_blocs=(/2,1,2,1/ ;deplacements=(/2,10,14,24/) ancien_type nouveau_type integer,parameter,intent(in) :: nb=4 integer,intent(in),dimension(nb) :: longueurs_blocs,deplacements integer,intent(in) :: ancien_type integer,intent(out) :: nouveau_type,ierror call MPI_TYPE_HINDEXED(nb,longueurs_blocs,deplacements, ancien_type,nouveau_type,ierror)

Types Dérivés Données Hétérogènes MPI_TYPE_STRUCT: constructeur de type dérivé le plus général Mêmes fonctionnalités que MPI_TYPE_INDEXED mais il permet la réplication de blocs hétérogènes Mêmes paramètres que MPI_TYPE_INDEXED mais ancien_types est un vecteur Le calcul de déplacement se fait sur des différences d’adresses MPI_ADRESS() est un routine portable MPI qui retourne l’adresse d’une variable 13 – 16 Décembre 2005 Laurence Viry

nb=5 ; longueur_blocs=(/3,1,4,1,1/); deplacements=(/0,7,11,20,25/) ancien_types=(type1,type2,type3,type1,type3) type1 type2 type3 ancien_types nouveau_type integer,parameter,intent(in) :: nb=5 integer,intent(in),dimension(nb) :: longueurs_blocs,deplacements integer,intent(in),dimension(nb) :: ancien_types integer,intent(out) :: nouveau_type,ierror call MPI_TYPE_STRUCT(nb,longueurs_blocs,deplacements, ancien_types,nouveau_type,ierror)

Envoi d’une particule du proc 0 au proc 1(ex IDRIS) program interaction_particules … ! Definition du type « particule » type particule character(len=5) :: type integer :: masse real,dimension(3) :: coord logical :: classe end type particule ! Initialisation MPI call MPI_INIT(ier) call MPI_COMM_RANK(MPI_COMM_WORLD,rang,ier) ! Construction du type MPI types=(/MPI_CHARACTER,MPI_INTEGER,MPI_REAL,MPI_LOGICAL/) longueurs_blocs=(/5,1,3,1/)

call MPI_ADDRESS(p(1)%type ,adresse(1),ier) call MPI_ADDRESS(p(1)%masse, adresse(2),ier) call MPI_ADDRESS(p(1)%coords, adresse(3),ier) call MPI_ADDRESS(p(1)%classe, adresse(4),ier) ! Calcul des deplacements do i=1,4 deplacement(i)=adresse(i)-adresse(1) enddo call MPI_TYPE_STRUCT(4,longueurs_blocs,deplacement, & types,type_particule,ier) call MPI_TYPE_COMMIT(type_particule,ier) …. ! Envoi des particules de 0 vers 1 if (rang .eq.0) then call MPI_SEND(p(1)%type,n,type_particule,1,etiquette, & MPI_COMM_WORLD,ier) else call MPI_RECV( p(1)%type,type_particule,0,etiquette, & MPI_COMM_WORLD,statut,ier) …

! Fin MPI call MPI_TYPE_FREE(type_particule) call MPI_FINALIZE(ier) end program interaction _ particules

Informations sur un type dérivé MPI Taille totale: MPI_TYPE_SIZE() Bornes inférieures et supérieures: MPI_TYPE_LB() MPI_TYPE_UB() MPI_TYPE_SIZE≤MPI_TYPE_Ub()-MPI_TYPE_LB() MPI_TYPE_EXTENT() 13 – 16 Décembre 2005 Laurence Viry

Types Dérivés : Conclusions Outils puissants et portables de description de donnée Adaptation au types utilisateurs Ils rendent les échanges de données: Plus simples et plus claires Plus performants dans le cas de structure de données hétérogènes L’association des topologies et des types dérivés simplifie l’écriture des problèmes de décomposition de domaine 13 – 16 Décembre 2005 Laurence Viry