Plan de la formation. Calcul parallèle avec MPI. Pourquoi paralléliser? Parallélisation. Présentation, environnement MPI. Communications point à point



Documents pareils
Introduction à la Programmation Parallèle: MPI

MPI-1 2ème partie : Programmation «non bloquante» et communications de groupe

Plan du cours Cours théoriques. 29 septembre 2014

PVM 1 PVM. Parallel Virtual Machine

Programmation parallèle et distribuée

Initiation au HPC - Généralités

Les communications collectives. Caractéristiques. Communications dans un groupe de processus. Dans un communicateur donné.

Grid Computing. Mihaela JUGANARU-MATHIEU École Nationale Supérieure des Mines de St Etienne

UE Programmation Impérative Licence 2ème Année

Parallélisme et Répartition

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours Informatique Master STEP

TP : Gestion d une image au format PGM

Introduction au langage C

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Cours d initiation à la programmation en C++ Johann Cuenin


Introduction à MATLAB R

TP1 : Initiation à Java et Eclipse

Introduction to Parallel Programming with MPI

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Runtime. Gestion de la réactivité des communications réseau. François Trahay Runtime, LaBRI sous la direction d'alexandre Denis Université Bordeaux I

as Architecture des Systèmes d Information

Programmer en JAVA. par Tama

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Métriques de performance pour les algorithmes et programmes parallèles

Compilation (INF 564)

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Présentation du PL/SQL

Projet Active Object

Corrigé des TD 1 à 5

Gestion de mémoire secondaire F. Boyer, Laboratoire Sardes

Chap III : Les tableaux

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Techniques de stockage. Techniques de stockage, P. Rigaux p.1/43

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Cours 1 : La compilation

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Chapitre 5 : Les procédures stockées PL/SQL

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Evaluation des performances de programmes parallèles haut niveau à base de squelettes

CORBA haute performance

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Etude d Algorithmes Parallèles de Data Mining

Équilibrage Dynamique de Charge pour des Calculs Parallèles sur Cluster Linux - Une Évaluation de l Environnement AMPI.

Cours 1: Java et les objets

1. Structure d'un programme FORTRAN 95

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Systèmes parallèles et distribués

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Génie Logiciel avec Ada. 4 février 2013

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Limitations of the Playstation 3 for High Performance Cluster Computing

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

D2.2 Définition des mécanismes minimaux d un runtime tolérant aux pannes dans les infrastructures Petascale

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours Bases de données

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Utilisation d objets : String et ArrayList

Cours de Systèmes d Exploitation

Définitions. Numéro à préciser. (Durée : )

I. Introduction aux fonctions : les fonctions standards

1 Mesure de la performance d un système temps réel : la gigue

REALISATION d'un. ORDONNANCEUR à ECHEANCES

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Cours 1 : Qu est-ce que la programmation?

Présentation du langage et premières fonctions

Examen Médian - 1 heure 30

Julien MATHEVET Alexandre BOISSY GSID 4. Rapport RE09. Load Balancing et migration

Info0804. Cours 6. Optimisation combinatoire : Applications et compléments

Rappels d architecture

Mise en œuvre des serveurs d application

Algorithmique et Programmation, IMA

Java Licence Professionnelle CISII,

2. MAQUETTAGE DES SOLUTIONS CONSTRUCTIVES. 2.2 Architecture fonctionnelle d un système communicant.

UE C avancé cours 1: introduction et révisions

Compléments de documentation Scilab : affichage de texte et formatage de nombres

INF6500 : Structures des ordinateurs. Sylvain Martel - INF6500 1

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Programmation C. Apprendre à développer des programmes simples dans le langage C

TP 1. Prise en main du langage Python

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Gestion de clusters de calcul avec Rocks

Fiche technique CPU 315SN/PN (315-4PN33)

Structure fonctionnelle d un SGBD

SYSTÈME DE GESTION DE FICHIERS

Rapport d activité. Mathieu Souchaud Juin 2007

Transcription:

Plan de la formation Calcul parallèle avec MPI Guy Moebs Parallélisation Présentation, environnement MPI Communications point à point Laboratoire de Mathématiques Jean Leray, CNRS, Université de Nantes, École Centrale de Nantes Mars 2010 Communications collectives Types de données dérivés Communicateurs et topologies Entrées / sorties collectives : MPI I/O Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 1 / 221 Parallélisation Présentation, environnement MPI Communications point à point Communications collectives Types de données dérivés Communicateurs et topologies Entrées / sorties collectives : MPI I/O Exemple récapitulatif : équation de la Chaleur 1D Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 3 / 221 Exemple récapitulatif : équation de la Chaleur 1D Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 2 / 221 Pourquoi paralléliser? La première question à se poser, c est savoir si la parallélisation de l application est nécessaire Ecrire un programme séquentiel est déjà du travail, souvent difficile ; la parallélisation le rendra encore plus dur Il y a eu beaucoup de progrès technologique dans le matériel informatique (processeurs à 3 GHz, bus mémoire,...) mais il ne faut pas compter sur des avancées au même rythme Pourtant il existe toujours des applications scientifiques qui consomment trop de ressources en temps de processeur ou en mémoire Pour celles-ci, la seule solution, pour des raisons techniques ou économiques, reste la parallélisation Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 4 / 221

But de la parallélisation Qu est-ce que la parallélisation? Ensemble de techniques logicielles et matérielles permettant l exécution simultanée de séquences d instructions indépendantes, sur des processeurs différents Bénéfice de la parallélisation? But de la parallélisation 1 processeur 4 processeurs Exécution plus rapide du programme (gain en temps de restitution) en distribuant le travail Résolution de problèmes plus gros (plus de ressource matérielle accessible, notamment la mémoire) Temps d'execution Diminution du temps d exécution le but (Faible) augmentation du temps CPU total - effet de bord Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 5 / 221 Exemple : différences finies Problème de différences finies 1D On dispose du vecteur X (0) de taille N et on doit calculer X (T ) selon : 0 < i < N 1, 0 t < T : X (t+1) i = X (t) (t) i 1 + 2X i + X (t) i+1 4 N=8 X X X X X X X X 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 gauche X i droite Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 7 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 6 / 221 Exemple Algorithme parallèle : création de N tâches, une par valeur de X la tâche i dispose de X (0) i et doit calculer X (1) i, X (2) i,..., X (T ) i A chaque étape elle doit disposer de X (t) i 1 et X (t) i+1 en provenance des tâches i 1 et i + 1 (attention à i = 0 et i = N) Travail en 3 étapes pour la tâche i : 1. envoie sa donnée X (t) i à ces voisines, gauche et droite (si elles existent) 2. reçoit X (t) (t) i 1 et X i+1 en provenance des tâches i 1 et i + 1 (attention à i = 0 et i = N) 3. utilise ces données pour calculer X (t+1) i Les N tâches travaillent indépendamment Seule contrainte : synchronisation lors des réceptions pour effectuer l étape 3 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 8 / 221

Optimisation de la parallélisation Optimisation de la parallélisation Execution sur 1 processeur Execution sur 1 processeur Execution sur 4 processeurs Communications inter-processeurs Execution sur 4 processeurs Communications inter-processeurs Temps Temps Une parallélisation efficace minimise les communications Temps CPU total = + A additionner au temps CPU total Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 9 / 221 Accélération et efficacité Les deux sont une mesure de la qualité de la parallélisation Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 10 / 221 Accélération et efficacité Soit T(p) le temps d exécution sur p processeurs Accélération Courbe Efficacité L Accélération A(p) et l Efficacité E(p) sont définies comme étant : A(p) = T(1) / T(p) (p=1, 2, 3,...) E(p) = A(p) / p idéale En pratique Courbe idéale : 100% En pratique Pour une accélération parallèle parfaite on obtient : T(p) = T(1) / p A(p) = T(1) / T(p) = T(1) / ( T(1) / p) = p E(p) = A(p) / p = p / p = 100% Nombre de processeurs Nombre de processeurs Les programmes scalables demeurent efficaces pour un grand nombre de processeurs (scalables = passage à l échelle) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 11 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 12 / 221

Scalabilité Propriété d une application à être exécutée efficacement sur un très grand nombre de processeurs Raisons possibles d une faible scalabilité : La machine parallèle employée : architecture inadaptée, charge,... Le programme parallélisé : analyser le comportement, améliorer les performances un peu des deux... Loi d Amdahl Plus une règle qu une loi Principe : Loi d Amdahl Prenons un exemple avec une parallélisation de l ordre de 80% du code : T(1) = T(parallele) + T(séquentiel) = 80 + 20 Sur p processeurs, on obtient : T(p) = 80 / p + 20 Quel que soit p, T(p) > 20 A(p) = T(1) / T(p) = 100 / ( 80 / p + 20 ) < 5 E(p) = ( A(p) / p ) < ( 5 / p ) p + 0! La partie non parallèle d un programme limite les performances et fixe une borne supérieure à la scalabilité Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 13 / 221 Loi d Amdahl 8,0 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 14 / 221 Interconnexion Pour un programmeur, un point essentiel réside dans le type de mémoire de l architecture cible : mémoire partagée ou mémoire distribuée 7,0 Acceleration 6,0 5,0 4,0 3,0 2,0 P = 2 P = 4 P = 8 L interconnexion a un grand impact sur : - le choix de l implémentation de la parallélisation - la performance parallèle - la facilité d utilisation 1,0 0,0 20,0 40,0 60,0 80,0 100,0 Pourcentage de code parallelise L application elle-même, va influer sur la relative importance de ces facteurs Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 15 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 16 / 221

Ordinateur à mémoire distribuée Le système est programmé en utilisant l échange de messages protocole réseau Ordinateur à mémoire partagée Le mouvement des données est transparent pour l utilisateur transfert mémoire envoie les données déplace les données interconnexion reçoit les données déplace les données interconnexion empaquète les données dépaquète les données S.M.P. = Symmetric Multi-Processor (tous les processeurs sont égaux) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 17 / 221 Types de parallélisme Parallélisme de tâches Plusieurs traitements Traitements indépendants Echanges de données, directives de contrôle Le parallélisme découle de la réalisation simultanée de différents traitements sur les données Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 18 / 221 Modèles de programmation : passage de messages Les communications sont effectuées en envoyant et en recevant explicitement les messages Les synchronisations sont aussi gérées explicitement Parallélisme de données Données régulières et en grand nombre Traitement identique sur chaque donnée Programmation Data-parallèle Le parallélisme découle de l application simultanée du même traitement sur des données différentes Le programmeur est complètement responsable de l implémentation de la parallélisation Cela signifie prendre soin de : - la gestion des processus, - l envoi, la réception des messages, - les synchronisations (e.g. les barrières) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 19 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 20 / 221

Exemple de passage de messages B + C = A Exemple de passage de messages MAITRE création des esclaves ESCLAVE (partage B et C) + = + = pour chaque esclave envoi (B,C) fin boucle réception (B,C) + + Temps = = pour chaque esclave réception (A) fin boucle A = B + C envoi (A) (assemblage A) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 21 / 221 Passage de messages Il existe des bibliothèques pour implémenter le passage de messages : Message Passing Interface (MPI) (www.mpi-forum.org) Le standard de facto Parallel Virtual Machine (PVM) Etait la librairie la plus utilisée Que peut-on en dire? MPI et PVM sont disponibles gratuitement MPI évolue, PVM est figée Implémentation domaine public Les vendeurs de solutions HPC proposent souvent des versions optimisées De telles versions tirent partie des fonctionnalités des architectures Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 22 / 221 Modèles de programmation : mémoire partagée Les communications sont effectuées de manière transparente Certaines synchronisations sont aussi gérées de manière transparente C est un très mauvais synonyme pour parallélisation automatique faite par le compilateur Le but est d utiliser le compilateur pour implémenter le parallélisme décrit à l aide de directives (encore fournies par le programmeur) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 23 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 24 / 221

Exemple pour mémoire partagée Un exemple trivial : DO I = 1, N A(I) = B(I) + C(I) END DO Le compilateur va effectuer le travail suivant (sur 4 processeurs) : N / 4 N / 4 N / 4 N / 4 B C A + = Processeur 1 Processeur 2 Processeur 3 Processeur 4 Mémoire partagée Ce n est pas non plus un monde parfait... Les compilateurs ont encore besoin de directives pour les aider mais aussi assurer la portabilité OpenMP est un effort pour définir un standard (www.openmp.org) En général les compilateurs parallélisent au niveau de la boucle Pour assurer des résultats corrects, une analyse fine des dépendances des données est requise Deux problèmes majeurs pour les compilateurs : - obtenir toujours la bonne valeur - toute l information n est pas connue à la compilation : considérer l hypothèse la plus défavorable Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 25 / 221 Passage de messages ou mémoire partagée? Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 26 / 221 Modèle de programmation hybride quelques observations... Passage de Messages Mémoire partagée noeud 1 noeud 2 Plus long à implémenter Plus facile à implémenter Performance noeud 1 noeud 2 noeud 3 noeud 4 Plus de détails à prendre en compte Augmente la taille du code Moins de détails à gérer Faible hausse de la taille du code noeud 3 noeud 4 passage de messages passage de messages + mémoire partagée Plus de maintenance Peu de maintenance séquentiel Complexe à déboguer et optimiser Augmente le volume mémoire Plus facile à déboguer et optimiser Usage efficace de la mémoire Modèle de programmation Offre une scalabilité optimale Scalable, mais... Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 27 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 28 / 221

Modèle de programmation hybride Deux types de parallélisme : - parallélisme à gros grains (passage de messages) - parallélisme à grains fins (mémoire partagée) Parallélisation Présentation, environnement MPI Programmation parallèle à un niveau Programmation parallèle hybride Communications point à point Communications collectives mémoire partagée Types de données dérivés communications Communicateurs et topologies Entrées / sorties collectives : MPI I/O Exemple récapitulatif : équation de la Chaleur 1D Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 29 / 221 Passage de messages : qu est-ce que c est? Plusieurs processus exécutent le même programme (mais pas forcément les mêmes parties) ; Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 30 / 221 MPI : qu est-ce que c est? Message Passing Interface : bibliothèque de passage de messages 0 1 2 3 Début des années 1990 : chaque constructeur dispose de sa propre implémentation de l échange de messages Besoin d unifier ces modèles pour parvenir à un ensemble de routines couvrant un large spectre de machines et efficacement implémentable Chaque processus dispose de ses propres données et n a pas d accès direct aux données des autres processus ; Les données du programme sont stockées dans la mémoire du processeur sur lequel s exécute le processus ; Une donnée est échangée entre deux ou plusieurs processus via un appel à des routines particulières et spécialisées Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 31 / 221 Brouillon présenté en Novembre 1993 (Supercomputing 93)... Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 32 / 221

MPI : qu est-ce que c est? L interface avec ces routines définit un standard pratique, portable, efficace, et flexible : utilisable par des programmes écrits en C et Fortran, gestion efficace : évite les recopies en mémoire et permet le recouvrement communications / calcul, interface supportée par les machines de nombreux constructeurs, interface proche de l existant (PVM,...), sémantique indépendante du langage, interface conçue pour être thread-safe Passage de messages avec MPI Il repose sur l échange de messages entre les processus pour le transfert de données, les synchronisations, les opérations globales La gestion de ces échanges est réalisée par MPI (Message Passing Interface) Cet ensemble repose sur le principe du SPMD (Single Program Multiple Data) Chaque processus dispose de ses propres données, sans accès direct à celles des autres Explicite, cette technique est entièrement à la charge du développeur Ces échanges qui impliquent deux ou plusieurs processus se font dans un communicateur Chaque processus est identifié par son rang, au sein du groupe Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 33 / 221 Passage de messages avec MPI On classe les routines de la bibliothèque en plusieurs catégories, décrites par la suite ; celles qui traitent de 1. l environnement MPI ; 2. des communications point à point ; 3. des communications collectives ; 4. des types de données dérivés ; 5. des communicateurs ; 6. des entrées / sorties. Voyons cela en détails... Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 34 / 221 Environnement MPI Initialisation en début de programme (MPI INIT) INTEGER :: ierr = 0 CALL MPI INIT (ierr) MPI crée alors un communicateur qui regroupe tous les processus actifs et va gérer leurs échanges de données. Le communicateur par défaut s appelle MPI COMM WORLD 0 1 5 2 4 3 Finalisation en fin de programmme (MPI FINALIZE) INTEGER :: ierr = 0 CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 35 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 36 / 221

Environnement MPI Le nombre de processus gérés par un communicateur est connu avec la routine MPI COMM SIZE : INTEGER :: ierr = 0 INTEGER :: nbprocs CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr) Chaque processus est identifié par son rang, un entier entre 0 et la valeur retournée par MPI COMM SIZE -1, fourni par la routine MPI COMM RANK : INTEGER :: ierr = 0 INTEGER :: monrang CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr) les routines suivantes sont ainsi présentes dans tous les programmes MPI : - MPI INIT ; - MPI FINALIZE ; - MPI COMM SIZE ; - MPI COMM RANK Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 37 / 221 Environnement MPI : TP 1 PROGRAM hello USE mpi IMPLICIT NONE INTEGER :: nbprocs, monrang, ierr = 0 CALL MPI INIT (ierr) CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr) CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr) Fichiers d en-tête Un fichier d entête est toujours nécessaire (mpif.h, mpi.h) La norme MPI 2 crée des interfaces pour le Fortran 95, le C/C++. En Fortran, on dispose dorénavant d un module qui encapsule : - la déclaration des constantes, - la définition des sous-programmes MPI. Ce module s utilise de manière analogue à tout module, avec l instruction USE : USE mpi Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 38 / 221 Environnement MPI : TP 1 Compilation : (plate-forme dépendant!) ifort -O3 tp1.f90 -o tp1.out -lmpi Exécution : mpirun -np 3./tp1.out Bonjour, je suis le processus de rang 2 parmi 3 processus. Bonjour, je suis le processus de rang 0 parmi 3 processus. Bonjour, je suis le processus de rang 1 parmi 3 processus. WRITE (6,*) Bonjour, je suis le processus de rang, & monrang, parmi, nbprocs, processus. CALL MPI FINALIZE (ierr) END PROGRAM hello Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 39 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 40 / 221

Communications Pour réaliser des opérations impliquant des données d autres processus, il est nécessaire d échanger ces informations aux travers de messages Ces messages se font sous la forme de communications impliquant au moins deux processus On peut faire une analogie avec le courrier électronique Parallélisation Présentation, environnement MPI Communications point à point Communications collectives 0 Types de données dérivés Expediteur 5 4 Communicateurs et topologies Collecte 1 Donnee 3 Entrées / sorties collectives : MPI I/O 2 Destinataire Exemple récapitulatif : équation de la Chaleur 1D Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 41 / 221 Communications point à point La communication point à point est une communication entre deux processus : expéditeur et destinataire Elle comprend deux opérations élémentaires : l envoi et la réception Différents ingrédients sont nécessaires pour composer un message - le communicateur - l identifiant du processus expéditeur - l identifiant du processus destinataire - une étiquette (tag) qui permet au programme de distinguer différents messages ils forment l enveloppe du message Les données envoyées sont typées, le message contient aussi : - la donnée à transmettre, - son type, intrinsèque ou dérivé, - sa taille Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 43 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 42 / 221 Communications point à point USE mpi INTEGER :: monrang, ierr = 0 CHARACTER(10) :: message INTEGER, DIMENSION(MPI STATUS SIZE) :: status CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr) IF (monrang == 0) THEN message = "Salut" CALL MPI SEND (message, len(message), MPI CHARACTER,& 1, 99, MPI COMM WORLD, ierr) ELSE CALL MPI RECV (message, len(message), MPI CHARACTER,& 0, 99, MPI COMM WORLD, status, ierr) WRITE (6, (A) ) message END IF Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 44 / 221

Communications point à point Le processus 0 (monrang = 0) envoie un message au processus de rang 1 (monrang = 1) avec l opération d envoi : CALL MPI SEND (buf, count, datatype, dest, tag, & comm, ierr) buf, count et datatype constituent le message L enveloppe spécifie le destinataire et inclut des informations utilisables par le destinataire pour sélectionner un message particulier Ainsi c est l envoi : - d un message identifié par tag, - de longueur count, - de type datatype, - à partir de l adresse buf, - au processus dest, - dans le communicateur comm. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 45 / 221 CALL MPI SEND (buf, count, datatype, dest, tag, comm, ierr) buf IN au choix count IN entier non négatif datatype IN objet MPI dest IN entier tag IN entier comm IN objet MPI ierr OUT entier CALL MPI RECV (buf, count, datatype, src, tag, comm, status, ierr) buf OUT au choix count IN entier non négatif datatype IN objet MPI src IN entier tag IN entier comm IN objet MPI status OUT tableau d entiers ierr OUT entier Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 47 / 221 Communications point à point Le processus 1 (monrang = 1) réceptionne un message avec l opération MPI RECV : CALL MPI RECV (buf, count, datatype, src, tag, comm, status, ierr) Les trois premiers arguments décrivent le buffer de réception Les trois suivants permettent de choisir le message voulu Le dernier (hors code d erreur) contient des informations sur le message juste reçu Important : l étiquette doit être la même pour les deux processus Ainsi c est la réception : - d un message identifié par tag, - de longueur count, - de type datatype, - à partir de l adresse buf, - en provenance du processus src, - dans le communicateur comm Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 46 / 221 Communications point à point : TP 2 Taper le programme précédent Le compiler L exécuter sur 2 processus L exécuter sur 4 processus Remarques / Conclusions? Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 48 / 221

Communications point à point : premier bilan MPI SEND (buf,count,datatype,dest,tag,comm,ierr) INTEGER, DIMENSION(MPI STATUS SIZE) :: status MPI RECV (buf, count, datatype, src, tag, comm, status, ierr) Envoi et réception d une donnée vers un destinataire avec attente de la fin de la communication avant de continuer l exécution Un message peut être reçu si on a la correspondance sur l enveloppe (source, tag, comm) Sécurité : on a la donnée envoyée ou reçue (resp.) avant de la modifier / l employer (resp.) Inconvénient : attente de la fin de l opération, voire de l opération elle-même pour continuer les calculs Autres possibilités... à suivre Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 49 / 221 Principaux types de données intrinsèques : C Les types des données sont transmis à MPI au travers de constantes Type de données MPI Type de données C MPI CHAR signed char MPI SHORT signed short int MPI INT signed int MPI LONG signed long int MPI UNSIGNED CHAR unsigned char MPI UNSIGNED SHORT unsigned short int MPI UNSIGNED unsigned int MPI UNSIGNED LONG unsigned long int MPI FLOAT float MPI DOUBLE double MPI LONG DOUBLE long double Principaux types de données intrinsèques : Fortran Les types des données sont transmis à MPI au travers de constantes Type de données MPI Type de données Fortran MPI INTEGER INTEGER MPI REAL REAL MPI DOUBLE PRECISION DOUBLE PRECISION MPI COMPLEX COMPLEX MPI LOGICAL LOGICAL MPI CHARACTER CHARACTER(1) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 50 / 221 Communications point à point : autres possibilités On peut recevoir un message de n importe quelle source : MPI ANY SOURCE On ne connait pas forcément à la compilation le processus qui va envoyer le message On peut recevoir un message muni de n importe quelle étiquette : MPI ANY TAG On ne connait pas forcément à la compilation l ordre d arrivée des messages L argument status des réceptions contient la bonne étiquette et le rang de l expéditeur Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 51 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 52 / 221

Communications point à point : autres possibilités On peut envoyer un message à un processus n existant pas : MPI PROC NULL Cela permet d éviter des tests fastidieux (conditions aux limites,...) On peut envoyer des messages dont le contenu n est pas une donnée de type intrinsèque, on utilise les types dérivés (voir plus loin) On peut effectuer un envoi et une réception en une seule communication : MPI SENDRECV On peut échanger des données en une seule communication : MPI SENDRECV REPLACE Communications point à point : échanges L échange combine l envoi d un message vers un processus et la réception d un autre message d un autre processus Ces deux processus peuvent être les mêmes Les buffers et les types peuvent être différents MPI SENDRECV ( & sendbuf, sendcount, sendtype, dest, sendtag, & recvbuf, recvcount, recvtype, src, recvtag, & comm, status, ierr) Fonction très utile pour des opérations dans une chaîne de processus Attention à l usage : envoi et réception bloquants Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 53 / 221 Communications point à point : échanges Remplacement des contenus des buffers entre deux processus : MPI SENDRECV REPLACE ( & buf, count, datatype, dest, & sendtag, src, recvtag, & comm, status, ierr) Le même buffer est employé pour l envoi et la réception L implémentation gère le stockage intermédiaire additionnel Attention à l usage : envoi et réception bloquants Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 55 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 54 / 221 Communications point à point : TP 3 USE mpi INTEGER, DIMENSION(MPI STATUS SIZE) :: status INTEGER, PARAMETER :: tag = 100 INTEGER :: ierr = 0 INTEGER :: u, v, monrang, nbprocs, suiv, prec CALL MPI INIT (ierr) CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr) CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr) suiv = mod (monrang+1, nbprocs) prec = mod (nbprocs+monrang-1,nbprocs) v = 0 u = 100 + monrang CALL MPI SENDRECV (u, 1, MPI INTEGER, suiv, tag, & v, 1, MPI INTEGER, prec, tag, & MPI COMM WORLD, status, ierr) write (6,*) processus, monrang, u =, u, v =, v CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 56 / 221

Communications point à point : TP 3 Taper le programme précédent Communications point à point Toutes les communications se font simultanément Le compiler L exécuter sur 2 processus L exécuter sur 4 processus Remarques / Conclusions? Attention : tous les processus commencent par envoyer, aucun n est en réception! Risque de blocage (deadlock) selon l implémentation sous-jacente de MPI SEND! Selon les cas, on peut être amené à privilégier les routines MPI SEND et MPI RECV TP 4 : écrire un programme analogue au précédent à l aide des deux routines MPI SEND et MPI RECV sans risque de deadlock Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 57 / 221 Optimisation des communications point à point Important d optimiser les communications : gain en perf. Minimiser le temps passé à faire autre chose que des calculs (i.e. l overhead) Différentes possibilités : - recouvrir les communications par des calculs - éviter la recopie du message dans une zone mémoire temporaire - minimiser les surcoûts dûs aux appels répétés aux routines de communications Différents types de communication : - communications standards - communications synchrones - communications bufférisées - communications persistantes. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 59 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 58 / 221 Communications standards CALL MPI SEND (buf, count, datatype, dest, tag, & comm, ierr) CALL MPI RECV (buf, count, datatype, src, tag, & comm, status, ierr) Communication telle que la réception n a lieu que si le message envoyé est arrivé (communication bloquante) Ceci est assuré (pour l expéditeur) soit : - par bufférisation : recopie du message dans un buffer ; - par synchronisation : avant de continuer le calcul après un envoi, on attend que la réception correspondante soit initialisée C est le cas des routines MPI SEND et MPI RECV Le MPI SEND devient bloquant lorsque le message est trop gros pour le buffériser. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 60 / 221

Communications synchrones Communication synchrone : avant de continuer le calcul après un envoi, on attend que la réception correspondante soit initialisée ; il n y a pas de bufférisation CALL MPI SSEND (buf, count, datatype, dest, tag,& comm, ierr) La complétion ne peut se faire que si la réception a été postée (i.e. prête) La complétion d un MPI SSEND indique donc que : - la donnée envoyée est à nouveau disponible (i.e. modifiable), - la réception a commencé Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 61 / 221 Communications persistantes Dans le cas de boucles contenant des communications avec la même liste d arguments : répétition des communications Lier cette liste d arguments à une opération de communication une seule fois Utiliser et ré-utiliser cette opération pour initier et effectuer les communications Permet de réduire la latence (temps pris pour initialiser une communication) ; cela dépend de l implémentation et de l interconnexion sous-jacente Communications bufférisées Le message est recopié dans un buffer avant d être envoyé Cette opération peut être commencée (et terminée) sans que la réception correspondante ne soit prête CALL MPI BSEND (buf, count, datatype, dest, tag,& comm, ierr) Les allocations des buffers mémoire MPI sont gérées avec MPI BUFFER ATTACH (buffer, size, ierr) MPI BUFFER DETACH (buffer, size, ierr) Le buffer est alloué dans la mémoire locale du processus expéditeur Le buffer est uniquement utilisable pour les messages bufférisés Un seul buffer alloué à la fois par processus Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 62 / 221 Communications persistantes Une routine pour initier l envoi : CALL MPI SEND INIT (buf, count, datatype, dest, & tag, comm, request, ierr) Une routine pour initier la réception : CALL MPI RECV INIT (buf, count, datatype, src, & tag, comm, request, ierr) L argument request identifie la communication INTEGER :: request Une routine pour effectuer l opération (dans la boucle) : CALL MPI START (request, ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 63 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 64 / 221

Communications asynchrones Le programme continue avant l initialisation de la réception correspondante Cela permet de calculer pendant le transfert CALL MPI ISEND (buf, count, datatype, dest, tag,& comm, request, ierr) CALL MPI IRECV (buf, count, datatype, src, tag,& comm, request, ierr) L argument request permet d identifier les opérations de communications impliquées et de les faire correspondre Communications asynchrones Les commandes associées pour tester : CALL MPI WAIT (request, status, ierr) Attendre jusqu à la terminaison d une requête CALL MPI TEST (request, flag, status, ierr) Vérifier si une requête est terminée (flag =.TRUE.) CALL MPI PROBE (source, tag, status, comm, ierr) Contrôler avant réception si une requête est arrivée Version non bloquante : MPI IPROBE Il existe des variantes des communications précédentes en mode asynchrone Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 65 / 221 Bilan des routines disponibles Communications usuelles Envois MPI SEND bloquant standard MPI ISEND non bloquant standard MPI SSEND bloquant synchrone MPI ISSEND non bloquant synchrone MPI BSEND bloquant bufférisé MPI IBSEND non bloquant bufférisé Réceptions MPI RECV bloquante standard MPI IRECV non bloquante standard Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 66 / 221 Bilan des routines disponibles Communications persistantes Envois MPI SEND INIT bloquant standard MPI SSEND INIT bloquant non bufférisé MPI BSEND INIT bloquant bufférisé Réception MPI RECV INIT bloquante standard Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 67 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 68 / 221

Communications point à point : TP 5 USE mpi INTEGER :: nprocs, rang, ierr = 0 INTEGER, DIMENSION(MPI STATUS SIZE) :: status INTEGER, PARAMETER :: na = 513, nb = 513 INTEGER, PARAMETER :: m = 2049, tag = 100 REAL*8, DIMENSION(na,na) :: a REAL*8, DIMENSION(nb,nb) :: b, d REAL*8, DIMENSION(na) :: pivota REAL*8, DIMENSION(nb) :: pivotb REAL*8, DIMENSION(m,m) :: c CALL MPI INIT (ierr) CALL MPI COMM SIZE (MPI COMM WORLD, nprocs, ierr) CALL MPI COMM RANK (MPI COMM WORLD, rang, ierr) CALL random number (a) CALL random number (b) CALL random number (c) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 69 / 221 Communications point à point : TP 5 ELSE IF (rang == 1) THEN! je calcule CALL DGETRF (na, na, a, na, pivota, ierr)! je recois le gros message CALL MPI RECV (c(1,1), m*m, MPI DOUBLE PRECISION,& 0, tag, MPI COMM WORLD, status, ierr)! ce calcul est independant du message CALL DGETRF (nb, nb, b, nb, pivotb, ierr) Communications point à point : TP 5 IF (rang == 0) THEN! j envoie un gros message CALL MPI SEND (c(1,1), m*m, MPI DOUBLE PRECISION,& 1, tag, MPI COMM WORLD, ierr)! je calcule la factorisation LU avec lapack CALL DGETRF (na, na, a, na, pivota, ierr)! ce calcul modifie le contenu du tableau c c(1:nb,1:nb) = matmul (a(1:nb,1:nb), b) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 70 / 221 Communications point à point : TP 5 Compiler le programme standard ifort -xs -O3 tp5.f90 -Vaxlib -lmpi -lmkl intel lp64 -lmkl sequential -lmkl core -o tp5.out L exécuter sur 2 processus Mettre des communications synchrones L exécuter sur 2 processus Mettre des communications asynchrones L exécuter sur 2 processus Remarques / Conclusions?! ce calcul depend du message precedent a(:,:) = transpose ( c(1:na,1:na) ) + a(:,:) END IF CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 71 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 72 / 221

Quelques règles simples... selon les situations Initier les réceptions avant les envois En cas d échange, mettre les appels à MPI IRECV avant les MPI SEND Eviter l usage de bufffers temporaires Utiliser les routines synchrones MPI SSEND Recouvrir les communications par des calculs Utiliser des communications non bloquantes MPI ISEND et MPI IRECV Minimiser les surcoûts liés à des appels répétés avec les mêmes arguments Utiliser des communications persistantes N.B. : les performances des différents types de communication point à point sont dépendantes des implémentations MPI. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 73 / 221 Communications collectives La communication collective est une communication qui implique un ensemble de processus, tous ceux du communicateur fourni en argument C est un argument essentiel En une seule opération, on effectue une série de communications point à point L ensemble des processus effectuent le même appel avec des arguments correspondants Parallélisation Présentation, environnement MPI Communications point à point Communications collectives Types de données dérivés Communicateurs et topologies Entrées / sorties collectives : MPI I/O Exemple récapitulatif : équation de la Chaleur 1D Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 74 / 221 Communications collectives La sémantique et la syntaxe des opérations collectives sont analogues à celles des communications point à point Il n y a pas d étiquette dans les appels à ces routines Certaines routines ont un processus qui est seul expéditeur ou seul destinataire : il s appelle le processus root Certains arguments n ont alors de sens que pour le processus root Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 75 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 76 / 221

Communications collectives Il existe différents types de communication collective : Opérations de diffusion / collecte de données Diffusion globale de données : MPI BCAST Distribution sélective de données : MPI SCATTER Collecte de données réparties : MPI GATHER Collecte, par tous les processus, de données réparties : MPI ALLGATHER Communications collectives Opérations préalables sur des données réparties Opération de réduction : MPI REDUCE Opération de réduction avec diffusion globale du résultat : MPI ALLREDUCE Barrières de synchronisation globale CALL MPI BARRIER (comm, ierr) Chaque processus appelant est bloqué jusqu à ce que tous les processus du communicateur font l appel Distribution sélective, par tous les processus, de données réparties : MPI ALLTOALL Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 77 / 221 Diffusion globale de données CALL MPI BCAST(buf,count,datatype,root,comm,ierr) Le processus root envoie un message : à tous les processus du communicateur comm, de longueur count, de type datatype, à partir de l adresse buf P0 P0 A Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 78 / 221 Diffusion globale de données PROGRAM bcast USE mpi IMPLICIT NONE INTEGER :: ierr = 0 INTEGER :: u, monrang, nbprocs CALL MPI INIT (ierr) CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr) CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr) P1 P2 A MPI_BCAST P1 P2 A A IF (monrang == 0) READ (5,*) u CALL MPI BCAST(u, 1, MPI INTEGER, 0, MPI COMM WORLD,& ierr) P3 P3 A Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 79 / 221 write (6,*) processus, monrang, u =, u call MPI FINALIZE (ierr) END PROGRAM bcast Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 80 / 221

Diffusion globale de données L appel à la routine MPI BCAST permet d éviter : IF (monrang == 0) THEN DO i = 0, nbprocs - 1 CALL MPI SEND (u, 1, MPI INTEGER, i, tag, & MPI COMM WORLD, ierr) END DO END IF CALL MPI RECV (u, 1, MPI INTEGER, 0, tag, & MPI COMM WORLD, status, ierr) Exécution : echo 10 mpirun -np 3./bcast.out processus 0 u = 10 processus 2 u = 10 processus 1 u = 10 Distribution sélective de données CALL MPI SCATTER(sendbuf, sendcount, sendtype, & recvbuf, recvcount, recvtype, & root, comm, ierr) Le processus root envoie un message étant : de longueur sendcount, de type sendtype, à partir de l adresse sendbuf, à chacun des processus du communicateur comm Chaque processus du communicateur comm (root inclus) indique recevoir un message : de longueur recvcount, de type recvtype, à partir de l adresse recvbuf Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 81 / 221 Distribution sélective de données L action de la routine MPI SCATTER peut être vue comme La donnée initiale est partagée en n morceaux contigus de taille identique : le ième morceau est envoyé au ième processus Les arguments relatifs à la donnée envoyée n ont de sens que pour le processus root P0 P0 A0 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 82 / 221 Distribution sélective de données La routine MPI SCATTER peut être vue comme (i) le processus root effectue n envois : CALL MPI SEND(sendbuf+i.sendcount.extent(sendtype),& sendcount, sendtype, i,...) (ii) et chaque processus (root inclus) du communicateur exécute la réception suivante : CALL MPI RECV (recvbuf, recvcount, recvtype, & root,...) P1 P2 A0 A1 A2 A3 MPI_SCATTER P1 P2 A1 A2 extent(sendtype) = MPI TYPE EXTENT(sendtype) : le nombre d octets en mémoire P3 P3 A3 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 83 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 84 / 221

Distribution sélective de données USE mpi INTEGER, PARAMETER :: nb valeurs = 128 INTEGER :: i, monrang, nbprocs, lbloc, ierr = 0 REAL(4),ALLOCATABLE,DIMENSION(:) :: valeurs,donnees CALL MPI INIT (ierr) CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr) CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr) lbloc = nb valeurs / nbprocs ALLOCATE (donnees(lbloc), STAT=ierr ) IF (monrang == 3) THEN ALLOCATE (valeurs(nb valeurs), STAT=ierr ) valeurs(:) = (/(1000.0 4+REAL(i,4),i=1,nb valeurs)/) END IF Distribution sélective de données CALL MPI SCATTER (valeurs, lbloc, MPI REAL, & donnees, lbloc, MPI REAL, 3, & MPI COMM WORLD, ierr) WRITE (6,*) processus, monrang, a recu, & donnees(1), a, donnees(lbloc), & du processus 3 CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 85 / 221 Distribution sélective de données ifort -O3 scatter.f90 -o scatter.out -lmpi Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 86 / 221 Distribution sélective de données L affichage ne se fait pas forcément dans l ordre des rangs mpirun -np 4./scatter.out processus 3 a recu 1097. a 1128. du processus 3 processus 1 a recu 1033. a 1064. du processus 3 processus 2 a recu 1065. a 1096. du processus 3 processus 0 a recu 1001. a 1032. du processus 3 Attention : Toutes les valeurs ne sont pas distribuées si le nombre de destinataires n est pas un diviseur du nombre de données à envoyer : il faut gérer l éventuel reliquat On peut être amené à gérer des paquets de taille variable mpirun -np 5./scatter.out processus 1 a recu 1026. a 1050. du processus 3 processus 2 a recu 1051. a 1075. du processus 3 processus 3 a recu 1076. a 1100. du processus 3 processus 4 a recu 1101. a 1125. du processus 3 processus 0 a recu 1001. a 1025. du processus 3 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 87 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 88 / 221

Distribution sélective de données La routine MPI SCATTERV étend les possibilités aux distributions non uniformes. CALL MPI SCATTERV ( & sendbuf, sendcounts, displs, sendtype,& recvbuf, recvcount, recvtype, & root, comm, ierr) L argument sendcounts est un tableau d entiers avec le nombre d éléments par destinataire L argument displs est un tableau d entiers qui contient le décalage à partir du début du buffer pour chaque paquet (à fournir en entrée) Distribution sélective de données Ainsi l action de la routine MPI SCATTERV peut être vue comme (i) le processus root effectue n envois : CALL MPI SEND(sendbuf+displs[i].extent(sendtype),& sendcounts[i], sendtype, i,...) (ii) et chaque processus (root inclus) du communicateur exécute la réception suivante : CALL MPI RECV (recvbuf, recvcount, recvtype, & root,...) extent(sendtype) = MPI TYPE EXTENT(sendtype) : le nombre d octets en mémoire Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 89 / 221 Collecte de données réparties Chaque processus envoie son buffer au processus root : opération inverse de MPI SCATTER CALL MPI GATHER (sendbuf, sendcount, sendtype, & recvbuf, recvcount, recvtype, & root, comm, ierr) Chaque processus (root inclus) du communicateur comm indique envoyer un message : au processus root, de longueur sendcount, de type sendtype, à partir de l adresse sendbuf Le processus root reçoit ces messages et les concatène dans l ordre des rangs, chacun étant : de longueur recvcount, de type recvtype, à partir de l adresse recvbuf Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 91 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 90 / 221 Collecte de données réparties L action de la routine MPI GATHER peut être vue comme Chaque processus envoie un ensemble de données, de nature compatible Le processus root effectue n réceptions : Le morceau du ième processus va en ième position N.B. : les arguments relatifs à la donnée reçue n ont de sens que pour le processus root P0 P1 P2 P3 A0 A1 A2 A3 MPI_GATHER Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 92 / 221 P0 P1 P2 P3 A0 A1 A2 A3

Collecte de données réparties La routine MPI GATHER peut être vue comme (i) chaque processus (root inclus) du communicateur effectue l envoi : CALL MPI SEND (sendbuf, sendcount, sendtype, & root,...) (ii) et le processus root effectue n réceptions : CALL MPI RECV(recvbuf+i.recvcount.extent(recvtype),& recvcount, recvtype, i,...) extent(recvtype) = MPI TYPE EXTENT(recvtype) : le nombre d octets en mémoire Collecte de données réparties USE mpi INTEGER, PARAMETER :: nb valeurs = 128 INTEGER :: i, monrang, nbprocs, lbloc, ierr = 0 INTEGER, ALLOCATABLE,DIMENSION(:) :: valeurs, donnees CALL MPI INIT (ierr) CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr) CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr) lbloc = nb valeurs / nbprocs ALLOCATE (valeurs(lbloc), STAT=ierr ) valeurs(:) = (/(1000+i+lbloc*monrang,i=1,lbloc)/) write (6,*) processus, monrang, possede, & valeurs(1), a, valeurs(lbloc) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 93 / 221 Collecte de données réparties IF (monrang == 2) & ALLOCATE (donnees(nb valeurs), STAT=ierr) CALL MPI GATHER (valeurs, lbloc, MPI INTEGER, & donnees, lbloc, MPI INTEGER, 2, & MPI COMM WORLD, ierr) IF (monrang == 2) & WRITE (6,*) processus 2 a recu, donnees(1), &..., donnees(lbloc+1),..., & donnees(nb valeurs) CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 94 / 221 Collecte de données réparties ifort -O3 gather.f90 -o gather.out -lmpi mpirun -np 4./gather.out processus 2 possede 1065 a 1096 processus 1 possede 1033 a 1064 processus 3 possede 1097 a 1128 processus 0 possede 1001 a 1032 processus 2 a recu 1001... 1033... 1128 mpirun -np 3./gather.out processus 0 possede 1001 a 1042 processus 1 possede 1043 a 1084 processus 2 possede 1085 a 1126 processus 2 a recu 1001... 1043... -370086 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 95 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 96 / 221

Collecte de données réparties L affichage ne se fait pas forcément dans l ordre des rangs Attention : Toutes les valeurs ne sont pas initialisées et transmises correctement si le nombre d expéditeurs n est pas un diviseur du nombre de données à envoyer On peut être amené à gérer des paquets de taille variable Collecte de données réparties La routine MPI GATHERV étend les possibilités aux collectes non uniformes. CALL MPI GATHERV ( & sendbuf, sendcount, sendtype, & recvbuf, recvcounts, displs, recvtype, & root, comm, ierr) L argument recvcounts est un tableau d entiers avec le nombre d éléments par expéditeur L argument displs est un tableau d entiers qui contient le décalage à partir du début du buffer pour placer chaque paquet dans le buffer de root (à fournir en entrée) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 97 / 221 Collecte de données réparties Ainsi l action de la routine MPI GATHERV peut être vue comme (i) chaque processus (root inclus) du communicateur effectue l envoi : CALL MPI SEND (sendbuf, sendcount, sendtype,& root,...) (ii) et le processus root exécute n réceptions : CALL MPI RECV(recvbuf+displs[i].extent(recvtype),& recvcounts[i], recvtype, i,...) extent(recvtype) = MPI TYPE EXTENT(recvtype) : le nombre d octets en mémoire Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 99 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 98 / 221 Collecte, par tous les processus, de données réparties La routine MPI ALLGATHER peut être vue comme MPI GATHER où tous les processus sont destinataires du résultat et non pas uniquement le processus root CALL MPI ALLGATHER(sendbuf, sendcount, sendtype,& recvbuf, recvcount, recvtype,& comm, ierr) Chaque processus du communicateur comm indique envoyer un message : de longueur sendcount, de type sendtype, à partir de l adresse sendbuf Chaque processus reçoit ces messages et les concatène dans l ordre des rangs, chacun étant : de longueur recvcount, de type recvtype, à partir de l adresse recvbuf Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 100 / 221

Collecte, par tous les processus, de données réparties Collecte, par tous les processus, de données réparties Un appel à la routine MPI ALLGATHER peut être vu comme : Tous les processus effectuent un appel à MPI GATHER CALL MPI GATHER (sendbuf, sendcount, sendtype, & recvbuf, recvcount, recvtype, & root, comm, ierr), P0 P1 A0 A1 P0 P1 MPI_ALLGATHER A0 A0 A1 A1 A2 A2 A3 A3 P2 A2 P2 A0 A1 A2 A3 Tous les processus effectuent un appel à MPI BCAST Même processus root! CALL MPI BCAST (recvbuf, recvcount, recvtype, & root, comm, ierr) P3 A3 P3 A0 A1 A2 A3 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 101 / 221 Collecte, par tous les processus, de données réparties USE mpi INTEGER, PARAMETER :: nb valeurs = 128 INTEGER :: i, monrang, nbprocs, lbloc, ierr = 0 INTEGER,ALLOCATABLE,DIMENSION(:) :: valeurs, donnees CALL MPI INIT (ierr) CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr) CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr) lbloc = nb valeurs / nbprocs ALLOCATE (valeurs(lbloc), donnees(nb valeurs) ) valeurs(:) = (/(1000+i+lbloc*monrang,i=1,lbloc)/) write (6,*) processus, monrang, possede, & valeurs(1), a, valeurs(lbloc) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 102 / 221 Collecte, par tous les processus, de données réparties CALL MPI ALLGATHER (valeurs, lbloc, MPI INTEGER, & donnees, lbloc, MPI INTEGER, & MPI COMM WORLD, ierr) WRITE (6,*) processus, monrang, a recu, & donnees(1),..., donnees(lbloc+1), &..., donnees(nb valeurs) CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 103 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 104 / 221

Collecte, par tous les processus, de données réparties ifort -O3 allgather.f90 -o allgather.out -lmpi mpirun -np 2./allgather.out processus 0 possede 1001 a 1064 processus 0 a recu 1001... 1065... 1128 processus 1 possede 1065 a 1128 processus 1 a recu 1001... 1065... 1128 mpirun -np 3./allgather.out processus 0 possede 1001 a 1042 processus 2 possede 1085 a 1126 processus 1 possede 1043 a 1084 processus 0 a recu 1001... 1043... -370086 processus 1 a recu 1001... 1043... -370086 processus 2 a recu 1001... 1043... -370086 Collecte, par tous les processus, de données réparties L affichage ne se fait pas forcément dans l ordre des rangs Attention : Toutes les valeurs ne sont pas initialisées et transmises correctement si le nombre d expéditeurs n est pas un diviseur du nombre de données à envoyer : il faut gérer l éventuel reliquat On peut être amené à gérer des paquets de taille variable Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 105 / 221 Collecte, par tous les processus, de données réparties La routine MPI ALLGATHERV peut être vue comme MPI GATHERV où tous les processus sont destinataires du résultat et non pas que le processus root CALL MPI ALLGATHERV (& sendbuf, sendcount, sendtype, & recvbuf, recvcounts, displs, recvtype,& comm, ierr) L argument recvcounts est un tableau d entiers avec le nombre d éléments par destinataire L argument displs est un tableau d entiers qui contient le décalage à partir du début du buffer pour placer chaque paquet dans le buffer de root Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 106 / 221 Collecte, par tous les processus, de données réparties Un appel à la routine MPI ALLGATHERV peut être vu comme si : Tous les processus effectuent un appel à MPI GATHERV CALL MPI GATHERV (& sendbuf, sendcount, sendtype, & recvbuf, recvcounts, displs, recvtype,& root, comm, ierr) Tous les processus effectuent un appel à MPI BCAST Même processus root! CALL MPI BCAST (recvbuf, recvcount, datatype, & root, comm, ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 107 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 108 / 221

Distribution sélective, par tous les processus, de données réparties La routine MPI ALLTOALL est une extension de MPI ALLGATHER dans le cas où chaque processus envoie des données distinctes à chacun des destinataires CALL MPI ALLTOALL (sendbuf, sendcount, sendtype,& recvbuf, recvcount, recvtype,& comm, ierr) Chaque processus envoie un message étant : de longueur sendcount, de type sendtype, à partir de l adresse sendbuf, à chacun des processus du communicateur comm Chaque processus du communicateur comm indique recevoir un message : de longueur recvcount, de type recvtype, à partir de l adresse recvbuf, de chacun des processus du communicateur comm Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 109 / 221 Distribution sélective, par tous les processus, de données réparties Distribution sélective, par tous les processus, de données réparties Tous les arguments sont significatifs pour tous les processus Un appel à la routine MPI ALLTOALL peut être vu comme si tous les processus effectuent n envois et n réceptions distincts CALL MPI SEND(sendbuf+i.sendcount.extent(sendtype), sendcount, sendtype, i,...) CALL MPI RECV(recvbuf+j.recvcount.extent(recvtype), recvcount, recvtype, j,...) Le jème bloc du ième processus est envoyé au jème processus et placé dans son ième bloc Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 110 / 221 Distribution sélective, par tous les processus, de données réparties USE mpi P0 P1 A0 A1 A2 A3 B0 B1 B2 B3 MPI_ALLTOALL P0 P1 A0 A1 B0 B1 C0 C1 D0 D1 INTEGER, PARAMETER :: nb valeurs = 4 INTEGER :: i, monrang, nbprocs, lbloc, ierr = 0 INTEGER, DIMENSION(nb valeurs) :: valeurs, donnees P2 P3 C0 D0 C1 D1 C2 D2 C3 D3 P2 P3 A2 A3 B2 B3 C2 C3 D2 D3 CALL MPI INIT (ierr) CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr) CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 111 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 112 / 221

Distribution sélective, par tous les processus, de données réparties lbloc = nb valeurs / nbprocs valeurs(1:nb valeurs) = & (/(1000+i+lbloc*monrang*100, i=1,nb valeurs)/) write (6,*) processus, monrang, avant, & valeurs(1:nb valeurs) CALL MPI ALLTOALL (valeurs, lbloc, MPI INTEGER, & donnees, lbloc, MPI INTEGER, & MPI COMM WORLD, ierr) write (6,*) processus, monrang, apres, & donnees(1:nb valeurs) CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 113 / 221 Distribution sélective, par tous les processus, de données réparties La routine MPI ALLTOALLV ajoute de la flexibilité à MPI ALLTOALL dans les tailles et adresses de localisation dans les buffers d envoi et de réception CALL MPI ALLTOALLV (& sendbuf, sendcounts, sdispls, sendtype, & recvbuf, recvcounts, rdispls, recvtype, & comm, ierr) Les arguments sendcounts et recvcounts sont des tableaux d entiers contenant les nombres d éléments par expéditeur et destinataire Diffusion sélective, par tous les processus, de données réparties ifort -O3 alltoall.f90 -o alltoall.out -lmpi mpirun -np 4./alltoall.out processus 0 avant 1001, 1002, 1003, 1004 processus 1 avant 1101, 1102, 1103, 1104 processus 2 avant 1201, 1202, 1203, 1204 processus 3 avant 1301, 1302, 1303, 1304 processus 0 apres 1001, 1101, 1201, 1301 processus 1 apres 1002, 1102, 1202, 1302 processus 2 apres 1003, 1103, 1203, 1303 processus 3 apres 1004, 1104, 1204, 1304 L affichage ne se fait pas forcément dans l ordre des rangs Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 114 / 221 Distribution sélective, par tous les processus, de données réparties Un appel à la routine MPI ALLTOALLV peut être vu comme si tous les processus effectuent n envois et n réceptions distincts avec des blocs de taille différente : CALL MPI SEND(sendbuf+i.sdispls[i].extent(sendtype),& sendcounts[i], sendtype, i,...) CALL MPI RECV(recvbuf+j.rdispls[j].extent(recvtype),& recvcounts[j], recvtype, j,...) Les arguments sdispls et rdispls sont des tableaux d entiers qui contiennent les décalages à partir du début du buffer pour placer chaque paquet dans les buffers de chaque processus Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 115 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 116 / 221

Opérations préalables sur des données réparties Ces fonctions réalisent une opération globale de réduction, i.e. l obtention d un résultat à partir de données réparties CALL MPI REDUCE (sendbuf, recvbuf, count, & datatype, op, root, comm, ierr) Depuis tous les processus du communicateur comm, on envoie un message : de longueur count, de type datatype, à partir de l adresse sendbuf, pour faire l opération op sur ces valeurs. Réception du résultat à partir de l adresse recvbuf du processus root Si le nombre de données envoyées est supérieur à un, l opération op est appliquée sur chacune des données l opération op est supposée associative Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 117 / 221 Opérations préalables sur des données réparties USE mpi INTEGER, PARAMETER :: nb = 5 INTEGER :: i, monrang, nbprocs, lbloc, ierr = 0 REAL(8), DIMENSION(nb) :: ain, aout... IF (monrang == 0) THEN ain(1:nb) = (/ (1000.0 8 + REAL(i,8), i=1,nb) /) ELSE ain(1:nb) = (/ (monrang * 10.0 8, i=1,nb) /) END IF CALL MPI REDUCE(ain, aout, nb, MPI DOUBLE PRECISION,& MPI SUM, 0, MPI COMM WORLD, ierr) IF (monrang == 0) & write (6, (A,I2,A,20E11.4) ) Rang, monrang, & somme =, aout(1 :nb) CALL MPI FINALIZE (ierr) Opérations préalables sur des données réparties Opérations prédéfinies : MPI MAX : maximum MPI MIN : minimum MPI SUM : somme MPI PROD : produit MPI LAND : ET logique MPI LOR : OU logique MPI LXOR : OU exclusif logique MPI MAXLOC : maximum et position MPI MINLOC : minimum et position Les opérations MPI MAXLOC et MPI MINLOC nécessitent un type de données valeur, indice pour être utilisées Les types proposés par MPI : MPI INTEGER, MPI REAL, MPI DOUBLE PRECISION Opérations de réductions personnelles : les opérateurs MPI OP CREATE et MPI OP FREE permettent de créer et détruire des opérations personnalisées Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 118 / 221 Opérations préalables sur des données réparties Compilation : ifort -O3 reduce.f90 -o reduce.out -lmpi Exécution : mpirun -np 4./reduce.out Rang 0 somme = 0.1061E+04 0.1062E+04 0.1063E+04 0.1064E+04 0.1065E+04 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 119 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 120 / 221

Opérations préalables sur des données réparties CALL MPI ALLREDUCE (sendbuf, recvbuf, count, & datatype, op, comm, ierr) Depuis tous les processus du communicateur comm, on envoie un message : de longueur count, de type datatype, à partir de l adresse sendbuf, pour faire l opération op sur ces valeurs. Réception du résultat à partir de l adresse recvbuf pour tous les processus Si le nombre de données envoyées est supérieur à un, l opération op est appliquée sur chacune des données L opération op est supposée associative Opérations préalables sur des données réparties USE mpi INTEGER, PARAMETER :: nb valeurs = 4 INTEGER :: i, monrang, nbprocs, ierr = 0 INTEGER, DIMENSION(nb valeurs) :: valeurs, donnees... valeurs(1:nb valeurs) = (/(1000+i+lbloc*monrang*100,& i=1,nb valeurs)/) write (6,*) processus, monrang, avant, & valeurs(1:nb valeurs) CALL MPI ALLREDUCE (valeurs, donnees, nb valeurs, & MPI INTEGER, MPI SUM, MPI COMM WORLD, ierr) write (6,*) processus, monrang, apres, & donnees(1:nb valeurs)... Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 121 / 221 Communications collectives : TP 6 Paralléliser le code séquentiel prod seq.f90 de telle sorte que : - la matrice soit partagée entre tous les processus par groupes de lignes contigües - le vecteur second membre soit initialisé par tous les processus - le vecteur résultat soit distribué entre tous les processus - son calcul soit distribué - chaque processus reçoit les morceaux des autres processus pour obtenir le vecteur résultat complet. L exécuter sur différents nombres de processus Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 122 / 221 Parallélisation Présentation, environnement MPI Communications point à point Communications collectives Types de données dérivés Communicateurs et topologies Entrées / sorties collectives : MPI I/O Exemple récapitulatif : équation de la Chaleur 1D Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 123 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 124 / 221

Types de données dérivés On peut envoyer autre chose que des buffers contigus de données de même type! Types simples : entiers, réels,... MPI INTEGER MPI REAL MPI DOUBLE PRECISION MPI COMPLEX MPI LOGICAL MPI CHARACTER Types complexes : - homogène : toutes les données sont de même type (sections de tableau), - hétérogène : les structures en C, les types dérivés en Fortran Il faut gérer ces types, au sens MPI : création : MPI TYPE xxx, validation : MPI TYPE COMMIT, destruction : MPI TYPE FREE Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 125 / 221 Validation - destruction des types crées A la fin de l exécution, tout type crée par l utilisateur doit être détruit CALL MPI TYPE FREE (typename, ierr) Cela libère les ressources mémoire occupées par ce type crée Validation - destruction des types crées Tout type crée par l utilisateur doit être validé par un appel à MPI TYPE COMMIT CALL MPI TYPE COMMIT (typename, ierr) INTEGER :: typename Cette validation ne concerne que le squelette de la structure, pas l usage qui en est fait Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 126 / 221 Types homogènes : valeurs contigües CALL MPI TYPE CONTIGUOUS (count, oldtype, & newtype, ierr) Construction du type newtype, avec count éléments du type oldtype Cette libération n a aucun effet sur d autres types crées à partir de celui qui est ainsi détruit : Un type A crée pour fabriquer un type B peut être détruit à l issue de la création du type B Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 127 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 128 / 221

Types homogènes : valeurs contigües 1 6 11 16 Types homogènes : valeurs distantes d un pas constant CALL MPI TYPE VECTOR(count, blocklength, stride,& oldtype, newtype, ierr) 2 3 4 7 8 9 12 13 14 17 18 19 Construction du type newtype, avec count blocs, formés chacun de blocklength éléments du type oldtype et espacés d un pas stride (exprimé en nombre d éléments) 5 10 15 20 CALL MPI TYPE CONTIGUOUS (5, MPI INTEGER, & colonne, ierr) CALL MPI TYPE COMMIT (colonne, ierr) INTEGER :: colonne Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 129 / 221 Types homogènes : valeurs distantes d un pas constant 1 6 11 16 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 130 / 221 Types homogènes : valeurs distantes d un pas constant CALL MPI TYPE VECTOR (3, 2, 5, MPI INTEGER, & type bloc, ierr) 2 3 7 8 12 13 17 18 CALL MPI TYPE COMMIT (type bloc, ierr) INTEGER :: type bloc 4 5 9 10 14 15 19 20 CALL MPI SEND (a(3,2), 1, type bloc, 1, MPI COMM WORLD, ierr) 1 2 6 7 11 12 16 17 CALL MPI TYPE VECTOR (4, 1, 5, MPI INTEGER, & ligne, ierr) CALL MPI TYPE COMMIT (ligne, ierr) INTEGER :: ligne CALL MPI SEND (a(3:4,2:4), 6, MPI INTEGER, 1, MPI COMM WORLD, ierr) Ici c est analogue mais faire attention aux communications asynchrones 3 4 5 8 9 10 13 14 15 18 19 20 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 131 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 132 / 221

Types homogènes : valeurs distantes d un pas variable CALL MPI TYPE INDEXED (count, blocklengths, & displs, oldtype, newtype, ierr) Construction du type newtype, avec count blocs, formés de blocklengths[i] éléments du type oldtype et décalés chacun d un pas displs[i] L argument blocklengths contient les longueurs des blocs exprimées en nombre d éléments de l ancien type oldtype L argument displs contient les distances à l origine pour chaque bloc, exprimées en nombre d éléments de l ancien type oldtype Types homogènes : valeurs distantes d un pas variable Ancien type : paire Nouveau type : sparse longueur = (2, 1, 3) pas = (0, 3, 7) CALL MPI TYPE INDEXED (3, longueur, pas, paire, & sparse, ierr) CALL MPI TYPE COMMIT (sparse, ierr) INTEGER :: sparse Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 133 / 221 Types homogènes : sections de tableau Extraire une portion de tableau pour l envoyer est utile notamment en décomposition de domaine. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 134 / 221 Types homogènes : sections de tableau, rappels Fortran90 Un tableau est un ensemble d éléments du même type : real(rp), DIMENSION(-1:3,2,0:5) :: tab La norme MPI2.0 fournit une nouvelle fonction qui s inspire du Fortran 90. Le sous-programme MPI TYPE CREATE SUBARRAY permet de créer un sous-tableau à partir d un tableau. CALL MPI TYPE CREATE SUBARRAY & (rank, shape tab, shape subtab, & coord debut, ordre, oldtype, newtype, ierr) Construction du type newtype, de rang rank, de profil shape subtab, extrait à partir de l élément en coord debut selon le rangement mémoire ordre. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 135 / 221 Le rang (rank) d un tableau est son nombre de dimensions L étendue (extent) est le nombre d éléments dans une dimension d un tableau Le profil (shape) d un tableau est un vecteur dont chaque élément est l étendue de la dimension correspondante La taille (size) d un tableau est le produit des éléments du vecteur correspondant à son profil Deux tableaux sont dits conformants s ils ont même profil Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 136 / 221

Types homogènes : sections de tableau On crée le type bloc : rank = 2 shape tab = (/ nb lignes, nb colonnes /) shape subtab = (/ 2, 3 /) coord debut = (/ 2, 1 /) CALL MPI TYPE CREATE SUBARRAY (rank, shape tab, shape subtab,& coord debut, mpi order fortran, mpi integer, block, ierr) CALL MPI TYPE COMMIT (block, ierr) Le processus 0 envoie les données au 1 : CALL MPI SEND (a, 1, block, 1, 99, MPI COMM WORLD, ierr) CALL MPI RECV (b, 1, block, 0, 99, MPI COMM WORLD, status, ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 137 / 221 Types hétérogènes C est le constructeur de type le plus général Il étend MPI TYPE INDEXED aux cas où chaque bloc de données, est de type quelconque Compte tenu de l hétérogénéité des données des blocs, les décalages se calculent en prenant les différences des adresses mémoires des éléments avec MPI ADDRESS : - on stocke les adresses mémoire des champs du type, - on calcule les décalages entre chaque adresse et l adresse du premier champ CALL MPI ADDRESS (location, adresse, ierr) Le calcul des adresses mémoire dépend de l implémentation! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Types hétérogènes CALL MPI TYPE STRUCT (count, blocklengths, & displs, oldtype, newtype, ierr) Construction du type newtype, avec count blocs, formés chacun de blocklengths[i] éléments de type oldtype[i] et décalés chacun d un pas displs[i] L argument blocklengths contient les longueurs des blocs exprimées en nombre d éléments L argument displs contient les distances à l origine pour chaque bloc exprimées en nombre d octets L argument oldtypes contient les différents types de données, un pour chaque bloc Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 138 / 221 Types hétérogènes Construction d un type particule avec les coordonnées, la masse et l espèce chimique... TYPE particule REAL :: masse INTEGER :: espece REAL, DIMENSION(3) :: coords END TYPE particule INTEGER, DIMENSION(3) :: oldtypes, blocklengths INTEGER, DIMENSION(3) :: displs, adrs INTEGER :: type p TYPE (particule) :: p Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 139 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 140 / 221

Types hétérogènes oldtypes = (/ MPI REAL, MPI INTEGER, MPI REAL /) blocklengths = (/ 1, 1, 3 /) CALL MPI ADDRESS (p%masse, adrs(1), ierr) CALL MPI ADDRESS (p%espece, adrs(2), ierr) CALL MPI ADDRESS (p%coords, adrs(3), ierr) DO i = 1, 3 displs(i) = adrs(i) - adrs(1) END DO Types dérivés : TP 7 Ecrire un programme MPI travaillant sur deux processus qui : vérifie le nombre de processus lit un entier par un processus et le diffuse construit une matrice carrée (pas trop grande!) crée un type bloc triangulaire inférieur (diagonale incluse) effectue l échange des parties triangulaires inférieures et les affiche dans l ordre des rangs CALL MPI TYPE STRUCT (3, blocklengths, displs, & oldtypes, type p, ierr) CALL MPI TYPE COMMIT (type p, ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 141 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 142 / 221 Communicateurs Parallélisation Présentation, environnement MPI Communications point à point Communications collectives Types de données dérivés Communicateurs et topologies Entrées / sorties collectives : MPI I/O Exemple récapitulatif : équation de la Chaleur 1D Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 143 / 221 Le communicateur contient tout ce qui est nécessaire pour fournir le cadre adapté aux opérations de communication dans MPI MPI fournit un communicateur par défaut, MPI COMM WORLD, qui contient tous les processus de l application On peut créer des communicateurs de deux manières : - directement à partir d un autre communicateur ; - à partir des groupes (au sens MPI) (non considéré ici) ; Il y a deux sortes de communicateurs : - les intra-communicateurs : pour les opérations sur un groupe de processus au sein d un communicateur ; - les inter-communicateurs : pour les communications entre deux groupes de processus Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 144 / 221

Communicateurs issus d un autre communicateur Cette technique permet de : partitionner en une seule fois un communicateur ; donner le même nom à tous les communicateurs crées ; ne pas manipuler des groupes. Il n y a pas de recouvrement possible En un appel, chaque processus n appartient qu à un seul communicateur Les fonctions de gestion des communicateurs sont : MPI COMM SIZE : le nombre de processus du communicateur MPI COMM RANK : le rang au sein du communicateur MPI COMM SPLIT : le partitionnement d un communicateur MPI COMM FREE : la destruction du communicateur... Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 145 / 221 Création d un communicateur à partir d un autre communicateur L argument key permet d ordonner (définir le rang) des processus au sein de leur nouveau communicateur Mettre key à zéro comme valeur pour le processus qui sera celui de futur rang 0 (dans le nouveau communicateur) et des valeurs strictement positives pour les autres Un processus qui ne fera partie d aucun des nouveaux communicateurs affecte la valeur MPI UNDEFINED à l argument color La valeur en sortie de new comm sera alors MPI COMM NULL Création d un communicateur à partir d un autre communicateur La routine MPI COMM SPLIT permet de partitionner un communicateur : CALL MPI COMM SPLIT (comm, color, key, new comm,& ierr) INTEGER :: color, key, new comm Tous les processus du communicateur doivent l exécuter L argument color (non négatif) permet de distinguer les différents communicateurs crées : Tous les processus avec la même valeur appartiendront au même nouveau communicateur Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 146 / 221 Communicateur pair / communicateur impair INTEGER :: monrang, ierr = 0 INTEGER :: color, key CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr) IF ( MOD(monrang,2) == 0 ) THEN color = 0 IF (monrang == 4) THEN key = 0 ELSE key = monrang + 10 END IF Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 147 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 148 / 221

Communicateur pair / communicateur impair ELSE color = 1 IF (monrang == 1) THEN key = 0 ELSE key = monrang + 10 END IF END IF CALL MPI COMM SPLIT(comm, color, key, new comm, ierr) Topologies Topologie = attribut supplémentaire d un communicateur pour mieux coller à la réalité Numéroter les processus de 0 à (n-1) n est pas toujours la meilleure logique de communication pour l application parallèle Grilles 2D, 3D de processus souvent mieux adaptées Possibilités de graphe de processus si la topologie est plus complexe Cela a aussi une action sur la distribution des processus MPI sur les processeurs sous-jacents grâce à une renumérotation possible des processus... et donc aussi des conséquences sur les performances On ne considère ici que les topologies cartésiennes Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 149 / 221 Répartition des processus par dimension Nombre de processus par dimension : MPI DIMS CREATE CALL MPI DIMS CREATE (nbproc, nbdims, dims, ierr) L argument nbdims : le nombre de dimensions de la grille INTEGER :: nbdims L argument dims : en sortie, le nombre de processus par dimension INTEGER, DIMENSION(1:nbdims) :: dims L argument dims peut être pré-rempli pour imposer le nombre de processus dans une ou plusieurs dimensions : Attention, dans ce cas il faut que dims(i) nbproc i,dims(i) 0 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 151 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 150 / 221 Répartition des processus par dimension Exemples : dims avant l appel Appel à la fonction dims en sortie (0,0) MPI DIMS CREATE (6, 2, dims, ierr) (3,2) (0,0) MPI DIMS CREATE (7, 2, dims, ierr) (7,1) (0,3,0) MPI DIMS CREATE (6, 3, dims, ierr) (2,3,1) (0,3,0) MPI DIMS CREATE (7, 3, dims, ierr) erreur! 3 n est pas un diviseur de 7... Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 152 / 221

Topologie cartésienne Création de la grille cartésienne des processus : MPI CART CREATE création d un nouveau communicateur CALL MPI CART CREATE (MPI COMM WORLD, nbdims, & dims, period, reorg, newcomm, ierr) L argument nbdims : le nombre de dimensions de la grille INTEGER :: nbdims L argument dims : le nombre de processus par dimension INTEGER, DIMENSION(1:nbdims) :: dims L argument period : la périodicité dans chaque dimension LOGICAL, DIMENSION(1:nbdims) :: period L argument reorg : réordonner les processus? LOGICAL :: reorg L argument newcomm : en sortie, le nouveau communicateur attaché à la topologie INTEGER :: newcomm Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 153 / 221 Recherche des coordonnées Recherche des coordonnées, connaissant le rang dans le communicateur de la grille : CALL MPI CART COORDS(comm,rank,nbdims,coords,ierr) L argument coords est un tableau d étendue le nombre de dimensions de la grille (nbdims) INTEGER, DIMENSION(1:nbdims) :: coords Recherche du rang connaissant les coordonnées dans le communicateur de la grille : CALL MPI CART RANK (comm, coords, rank, ierr) INTEGER :: rank y MPI_CART_RANK 0 4 (0,1) 1 0 1 2 3 2 5 6 (1,1) (2,1) 3 7 (3,1) (0,0) (1,0) (2,0) (3,0) x Topologie cartésienne : exemple Topologie cartésienne 2D avec 8 processus, périodicité en y CALL MPI CART CREATE (MPI COMM WORLD, nbdim, & dims, period, reorg, comm2d, ierr) nbdims = 2 dims = (/4, 2/) period = (/.FALSE.,.TRUE./) reorg =.TRUE. y 0 1 2 3 4 5 6 7 0 1 2 3 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 154 / 221 Recherche des voisins Recherche des voisins dans chaque dimension : CALL MPI CART SHIFT (comm, direction, disp, & rank left, rank right, ierr) L argument direction est la dimension concernée, i.e. la coordonnée modifiée par le disp INTEGER :: direction L argument disp indique le déplacement INTEGER :: disp Les arguments rank left et rank right sont les rangs des voisins INTEGER :: rank left, rank right En cas de sortie de la dimension, la valeur retournée est MPI PROC NULL x Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 155 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 156 / 221

Recherche des voisins Recherche des voisins direct Gauche / Droite (ou Ouest / Est) par le processus 5 CALL MPI CART SHIFT (comm2d, direction, disp, & rank left, rank right, ierr) Parallélisation Présentation, environnement MPI Communications point à point direction = 0 disp = 1 rank left = 4 rank right = 6 y 0 1 2 3 4 5 6 7 0 1 2 3 x Communications collectives Types de données dérivés Communicateurs et topologies Entrées / sorties collectives : MPI I/O Exemple récapitulatif : équation de la Chaleur 1D Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 157 / 221 Entrées / sorties collectives : MPI I/O (cours IDRIS) Un des gros apports de MPI 2 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 158 / 221 Un peu de vocabulaire fichier (file) : un ensemble ordonné de données typées. Interface de haut niveau Opérations collectives pour les opérations courantes Nombreuses fonctionnalités On se limite aux principales... déplacement initial (displacement) : une adresse absolue, en octets, par rapport au début d un fichier et à partir de laquelle une vue (view) commence. type élémentaire (etype) : unité de donnée utilisée pour calculer les positionnements et pour accéder aux données ; cela peut être n importe quel type de données, MPI ou dérivé. motif (filetype) : un masque qui constitue la base du partitionnement du fichier entre les processus. vue (view) : une vue définit l ensemble des données visibles d un fichier. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 159 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 160 / 221

Un peu de vocabulaire (suite) position (offset) : la position dans le fichier, exprimée en nombre de type élémentaire, relativement à la vue courante. descripteur (file handle) : le descripteur est un objet caché crée à l ouverture et détruit à la fermeture du fichier. Toutes les opérations se font en spécifiant comme référence son descripteur (ce n est pas une unité logique Fortran). pointeur (file pointer) : ils sont mis à jour automatiquement par MPI et déterminent des positions à l intérieur du fichier. taille du fichier (file size) : la taille d un fichier MPI mesurée en nombre d octets. Gestion des fichiers On donne les principaux sous-programmes (ouverture, fermeture, caractéristiques) mais d autres sont disponibles (suppression, préallocation). Les attributs sont précisés par des opérations avec des constantes entières prédéfinies. Tous les processus d un communicateur au sein duquel un fichier est ouvert participeront aux opérations collectives ultérieures d accès aux données. L ouverture du fichier renvoie un descripteur. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 161 / 221 Attributs des fichiers Attribut Signification MPI MODE RDONLY seulement en lecture MPI MODE RDWR en lecture et en écriture MPI MODE WRONLY seulement en écriture MPI MODE CREATE création du fichier s il n existe pas MPI MODE EXCL erreur si le fichier existe MPI MODE UNIQUE OPEN erreur si le fichier est déjà ouvert par une autre application MPI MODE SEQUENTIAL accès séquentiel (interdit les accès aléatoires) MPI MODE APPEND pointeurs en fin de fichier (ajout) MPI MODE DELETE ON CLOSE destruction après la fermeture Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 162 / 221 Création d un fichier PROGRAM open01 USE mpi IMPLICIT NONE INTEGER :: descripteur, ierr CALL MPI INIT (ierr) CALL MPI FILE OPEN (MPI COMM WORLD, "fichier.txt", & MPI MODE RDWR + MPI MODE CREATE, & MPI INFO NULL, descripteur, ierr) CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) END PROGRAM open01 les attributs s additionnent en Fortran ou se combinent ( & ) en C/C++ On peut fournir d autres informations (selon implémentation!) sinon, une valeur nulle, MPI INFO NULL Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 163 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 164 / 221

Généralités Les transferts de données entre fichiers et zones mémoire des processus se font via des appels explicites à des sous-programmes MPI de lecture et d écriture. On distingue 3 propriétés des accès aux fichiers : le positionnement, qui peut être explicite ou implicite (via des pointeurs, individuels ou partagés par tous les processus) ; la synchronisation, les accès pouvant être bloquants ou non ; Types d accès possibles (1/3) Position- Synchro- Regroupement nement nisation individuel collectif blo- mpi file read at mpi file read at all adresses quantes mpi file write at mpi file write at all expli- non mpi file iread at mpi file read at all begin cites blo- mpi file read at all end quantes mpi file iwrite at mpi file write at all begin mpi file write at all end le regroupement, les accès pouvant être collectifs (tous les processus ayant ouvert le fichier) ou propres à un ou plusieurs processus. Il y a de nombreuses variantes possibles... Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 165 / 221 Types d accès possibles (2/3) Position- Synchro- Regroupement nement nisation individuel collectif pointeurs blo- mpi file read mpi file read all quantes mpi file write mpi file write all implicites non mpi file iread mpi file read all begin blo- mpi file read all end individuels quantes mpi file iwrite mpi file write all begin mpi file write all end Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 166 / 221 Types d accès possibles (3/3) Position- Synchro- Regroupement nement nisation individuel collectif pointeurs blo- mpi file read shared mpi file read ordered quantes mpi file write shared mpi file write ordered implicites non mpi file iread shared mpi file read ordered begin blo- mpi file read ordered end partagés quantes mpi file iwrite shared mpi file write ordered begi mpi file write ordered end ORDERED signifie SHARED et ALL Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 167 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 168 / 221

Compléments accès Il est possible de mélanger les types d accès effectués à un même fichier au sein d une application. Les zones mémoire accédées sont décrites par trois quantités : l adresse initiale de la zone concernée ; le nombre d éléments pris en compte ; le type de données, qui doit correspondre à une suite de copies contiguë du type élémentaire de donnée (etype) de la vue courante. Un déplacement ne peut avoir une valeur négative. Pour mettre un pointeur implicite à une valeur inférieure à sa valeur courante, il faut employer les sous-programmes MPI FILE SEEK ou MPI FILE SEEK SHARED, suivant qu il s agit d un pointeur individuel ou partagé. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 169 / 221 Positionnement explicite des pointeurs dans les fichiers INTEGER, PARAMETER :: nb valeurs=10 INTEGER :: myrank, descripteur, nb octets entier, ierr INTEGER(KIND=MPI OFFSET KIND) :: position fichier INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status Positionnement explicite des pointeurs dans les fichiers Les sous-programmes MPI FILE GET POSITION et MPI FILE GET POSITION SHARED permettent de connaître respectivement la valeur courante des pointeurs individuels et celle du pointeur partagé. Il est possible de positionner explicitement les pointeurs individuels à l aide du sous-programme MPI FILE SEEK, et de même le pointeur partagé avec le sous-programme MPI FILE SEEK SHARED. Il y a trois modes possibles pour fixer la valeur d un pointeur : MPI SEEK SET fixe une valeur absolue ; MPI SEEK CUR fixe une valeur relative ; MPI SEEK END positionne le pointeur à la fin du fichier, à laquelle un déplacement éventuel est ajouté. Avec MPI SEEK CUR, on peut spécifier une valeur négative, ce qui permet de revenir en arrière dans le fichier. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 170 / 221 Utilisation de MPI FILE SEEK Processeur 0 1 2 3 1 2 3 1 0 2 1 0 3 1 0 4 1 2 3 1 0 2 1 0 3 1 0 4 5 6 7 8 CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", MPI MODE RDONLY,& MPI INFO NULL, descripteur, ierr) CALL MPI FILE READ (descripteur, valeurs, 3, MPI INTEGER, status, ierr) CALL MPI TYPE SIZE (MPI INTEGER, nb octets entier, ierr) position fichier = 8*nb octets entier CALL MPI FILE SEEK (descripteur, position fichier, MPI SEEK CUR, ierr) CALL MPI FILE READ (descripteur,valeurs(4), 3, MPI INTEGER, status,ierr) position fichier = 4*nb octets entier CALL MPI FILE SEEK (descripteur, position fichier, MPI SEEK SET, ierr) CALL MPI FILE READ (descripteur, valeurs(7), 4, MPI INTEGER,status,ierr) CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) Fichier Processeur 1 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 1 1 1 1 1 1 1 2 3 1 2 3 0 0 0 1 2 3 0 0 0 5 6 7 8 2 3 4 2 3 4 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 171 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 172 / 221

Lectures/écritures individuelles : déplacements explicites La position est exprimée en nombre d occurrences d un type de données, lequel doit être un multiple du type élémentaire de donnée de la vue courante. Le fichier ne doit pas avoir été ouvert avec l attribut MPI MODE SEQUENTIAL. Écriture individuelle avec déplacement explicite INTEGER, PARAMETER :: nb valeurs=10 INTEGER :: descripteur, ierr, i, myrank, nb octets entier INTEGER(KIND=MPI OFFSET KIND) :: position fichier INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) valeurs (:) = (/(i+myrank*100,i=1,nb valeurs) /) CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", & MPI MODE WRONLY + MPI MODE CREATE, MPI INFO NULL,& descripteur, ierr) CALL MPI TYPE SIZE (MPI INTEGER, nb octets entier, ierr) position fichier = myrank * nb valeurs * nb octets entier CALL MPI FILE WRITE AT (descripteur, position fichier, valeurs, & nb valeurs, MPI INTEGER, status, ierr) CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 173 / 221 Utilisation de MPI FILE WRITE AT Processeur 0 11 2 32 3 4 5 6 7 8 9 10 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 174 / 221 Lecture individuelle avec déplacement explicite INTEGER, PARAMETER :: nb valeurs=10 INTEGER :: descripteur, ierr, myrank, nb octets entier INTEGER(KIND=MPI OFFSET KIND) :: position fichier INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status Fichier Processeur 1 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 101 102 103 104 105 106 107 108 109 110 CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", & MPI MODE RDONLY, MPI INFO NULL,& descripteur, ierr) CALL MPI TYPE SIZE (MPI INTEGER, nb octets entier, ierr) position fichier = myrank * nb valeurs * nb octets entier CALL MPI FILE READ AT (descripteur, position fichier, valeurs, & nb valeurs, MPI INTEGER, status, ierr) CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 175 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 176 / 221

Utilisation de MPI FILE READ AT Processeur 0 11 2 32 3 4 5 6 7 8 9 10 Lectures/écritures individuelles : déplacements implicites individuels Un pointeur individuel est géré par le système, par fichier et par processus. Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 Pour un processus donné, deux accès consécutifs au même fichier permettent donc d accéder automatiquement aux éléments consécutifs de celui-ci. Processeur 1 101 102 103 104 105 106 107 108 109 110 Les pointeurs partagés (ci-après) ne sont jamais accédés ou modifiés. Après chaque accès, le pointeur est positionné sur le type élémentaire de donnée suivant. Le fichier ne doit pas avoir été ouvert avec l attribut MPI MODE SEQUENTIAL. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 177 / 221 Lecture individuelle avec déplacement implicite INTEGER, PARAMETER :: nb valeurs=10 INTEGER :: descripteur, ierr, myrank, nb octets entier INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 178 / 221 Utilisation de MPI FILE READ Processeur 0 11 2 32 3 4 5 6 1 2 3 4 5 6 7 8 9 10 CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", & MPI MODE RDONLY, MPI INFO NULL,& descripteur, ierr) CALL MPI FILE READ (descripteur, valeurs, 6, MPI INTEGER, status, ierr) Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 CALL MPI FILE READ (descripteur, valeurs(7), 4, MPI INTEGER, status, ierr) Processeur 1 1 2 3 4 5 6 1 2 3 4 5 6 7 8 9 10 CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 179 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 180 / 221

Lecture individuelle avec déplacement implicite INTEGER, PARAMETER :: nb valeurs=10 INTEGER :: descripteur, ierr, myrank, nb octets entier INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status Utilisation de MPI FILE READ Processeur 0 11 2 32 3 4 5 0 0 0 0 0 CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", & MPI MODE RDONLY, MPI INFO NULL,& descripteur, ierr) IF (myrank == 0) THEN CALL MPI FILE READ (descripteur, valeurs, 5, MPI INTEGER, status,ierr) ELSE CALL MPI FILE READ (descripteur, valeurs, 8, MPI INTEGER, status,ierr) CALL MPI FILE READ (descripteur, valeurs, 5, MPI INTEGER, status,ierr) END IF CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) Processeur 1 1 2 3 4 5 6 7 8 0 0 9 10 101 102 103 6 7 8 0 0 On stocke les valeurs à partir du même emplacement : écrasement Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 181 / 221 Lectures/écritures individuelles : déplacements implicites partagés Il existe un et un seul pointeur partagé par fichier, commun à tous les processus du communicateur dans lequel le fichier a été ouvert. Tous les processus qui font une opération d entrée-sortie utilisant le pointeur partagé doivent employer la même vue du fichier. L usage des variantes non collectives des sous-programmes entraîne un ordre de lecture non déterministe. Après chaque accès, le pointeur est positionné sur le type élémentaire de donnée suivant. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 182 / 221 Lecture individuelle, déplacement implicite partagé INTEGER, PARAMETER :: nb valeurs=10 INTEGER :: descripteur, ierr, myrank INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", & MPI MODE RDONLY, MPI INFO NULL,& descripteur, ierr) CALL MPI FILE READ SHARED (descripteur, valeurs, nb valeurs, & MPI INTEGER, status, ierr) CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) Les pointeurs individuels ne sont jamais accédés ou modifiés par ces sous-programmes. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 183 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 184 / 221

Utilisation de MPI FILE READ SHARED Processeur 0 101 2 102 3 103 104 105 106 107 108 109 110 Lecture individuelle, déplacement implicite partagé INTEGER, PARAMETER :: nb valeurs=10 INTEGER :: descripteur, ierr, myrank INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) Processeur 1 1 2 3 4 5 6 7 8 9 10 CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", & MPI MODE RDONLY, MPI INFO NULL,& descripteur, ierr) CALL MPI FILE READ SHARED (descripteur, valeurs, 4, MPI INTEGER, & status, ierr) Comportement non déterministe : 2 possibilités!! CALL MPI FILE READ SHARED (descripteur, valeurs(5), 6, MPI INTEGER, & status, ierr) CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 185 / 221 Utilisation de MPI FILE READ SHARED Processeur 0 11 2 32 3 4 1 2 3 4 9 10 101 102 103 104 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 186 / 221 Lectures/écritures collectives Tous les processus du communicateur au sein duquel un fichier est ouvert participent aux opérations collectives d accès aux données. Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 Processeur 1 5 6 7 8 5 6 7 8 105 106 107 108 109 110 Les opérations collectives sont généralement plus performantes que les opérations individuelles car elles autorisent davantage de techniques d optimisation mises en œuvre automatiquement. Comportement non déterministe : 4 possibilités!! Les accès sont effectués dans l ordre des rangs des processus ; le traitement est donc déterministe. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 187 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 188 / 221

Lectures/écritures collectives : déplacements explicites INTEGER, PARAMETER :: nb valeurs=10 INTEGER :: descripteur, ierr, myrank, nb octets entier INTEGER(KIND=MPI OFFSET KIND) :: position fichier INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) Utilisation de MPI FILE READ AT ALL Processeur 0 Fichier 11 2 32 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", & MPI MODE RDONLY, MPI INFO NULL,& descripteur, ierr) Processeur 1 101 102 103 104 105 106 107 108 109 110 CALL MPI TYPE SIZE (MPI INTEGER, nb octets entier, ierr) position fichier = myrank * nb valeurs * nb octets entier CALL MPI FILE READ AT ALL (descripteur, position fichier, valeurs, & nb valeurs, MPI INTEGER, status, ierr) CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) Pas de différence entre MPI FILE READ AT ALL et MPI FILE READ AT... mis à part l efficacité du collectif. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 189 / 221 Lectures/écritures collectives : déplacements implicites individuels INTEGER, PARAMETER :: nb valeurs=10 INTEGER :: descripteur, ierr, myrank, nb octets entier INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 190 / 221 Utilisation de MPI FILE READ ALL Processeur 0 Fichier 11 2 32 3 4 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", & MPI MODE RDONLY, MPI INFO NULL,& descripteur, ierr) Processeur 1 1 2 3 4 1 2 3 4 5 6 7 8 9 10 CALL MPI FILE READ ALL (descripteur, valeurs, 4, MPI INTEGER, & status, ierr) CALL MPI FILE READ ALL (descripteur, valeurs(5), 6, MPI INTEGER, & status, ierr) NB : chaque processus a son propre pointeur individuel, mais l action est faite simultanément CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 191 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 192 / 221

Lectures/écritures collectives : déplacements implicites individuels Utilisation de MPI FILE READ ALL INTEGER, PARAMETER :: nb valeurs=10 INTEGER :: descripteur, ierr, myrank, nb octets entier INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", & MPI MODE RDONLY, MPI INFO NULL, & descripteur, ierr) IF (myrank == 0) THEN CALL MPI FILE READ ALL (descripteur, valeurs(3), 4, MPI INTEGER, & status, ierr) ELSE CALL MPI FILE READ ALL (descripteur, valeurs(5), 5, MPI INTEGER, & status, ierr) END IF CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) Processeur 0 Fichier Processeur 1 10 2 30 1 2 3 4 0 0 0 0 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 0 0 0 0 1 2 3 4 5 0 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 193 / 221 Lectures/écritures collectives : déplacements implicites partagés Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 194 / 221 Utilisation de MPI FILE READ ORDERED Processeur 0 11 2 32 3 4 1 2 3 4 9 10 101 102 103 104 INTEGER, PARAMETER :: nb valeurs=10 INTEGER :: descripteur, ierr, myrank, nb octets entier INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", & MPI MODE RDONLY, MPI INFO NULL, & descripteur, ierr) Processeur 1 5 6 7 8 5 6 7 8 105 106 107 108 109 110 CALL MPI FILE READ ORDERED (descripteur, valeurs, 4, MPI INTEGER, & status, ierr) CALL MPI FILE READ ORDERED (descripteur, valeurs(5), 6, MPI INTEGER, & status, ierr) NB : comportement déterministe ALL + SHARED = ORDERED CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 195 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 196 / 221

Types dérivés : TP 8 Ecrire un programme MPI qui : lit un entier N (dimension) par un processus et le diffuse construit un vecteur d entiers, distribué, de dimension totale N le plus homogène possible lit le fichier vecteur.dat (fourni), rempli d entiers avec les trois routines : MPI FILE READ AT, MPI FILE READ AT ALL et MPI FILE READ ORDERED. chaque processus affiche les bornes et le contenu de sa portion de vecteur Définition des vues Les vues sont un mécanisme souple et puissant pour décrire les zones accédées dans les fichiers. Les vues sont construites à l aide de types dérivés MPI. Chaque processus a sa propre vue (ou ses propres vues) d un fichier, définie par trois variables : - un déplacement initial, - un type élémentaire de données, - un motif. Une vue est définie comme la répétition du motif, une fois le déplacement initial effectué. Des processus différents peuvent avoir des vues différentes d un même fichier, de façon à accéder à des parties différentes. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 197 / 221 Définition de vues Si le fichier est ouvert en écriture, les zones décrites par les types élémentaires et les motifs ne peuvent pas se recouvrir, même partiellement. La vue par défaut consiste en une simple suite d octets (déplacement initial nul, etype et motifs égaux à MPI BYTE) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 198 / 221 Définition de motifs différents selon les processus etype motif proc 0 motif proc 1 motif proc 2 etype motif trous fichier déplacement initial... fichier... déplacement initial données accessibles Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 199 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 200 / 221

Utilisation d une vue : exemple 1 PROGRAM read view01 USE mpi IMPLICIT NONE déplacement initial : 2 entiers etype motif MPI_INTEGER INTEGER, PARAMETER :: nb valeurs = 10 INTEGER(KIND=MPI OFFSET KIND) :: borne inf zero = 0 INTEGER :: myrank, descripteur, motif temp, motif, ierr INTEGER(KIND=MPI OFFSET KIND) :: deplacement initial INTEGER(KIND=MPI ADDRESS KIND) :: borne inf, taille INTEGER, DIMENSION(2) :: longueurs, deplacements INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 201 / 221 Utilisation d une vue : exemple 1 (fin) Utilisation d une vue : exemple 1 (suite) CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", MPI MODE RDONLY, & MPI INFO NULL, descripteur, ierr) deplacements(1) = 1 deplacements(2) = 4 longueurs(1) = 2 longueurs(2) = 1 CALL MPI TYPE INDEXED (2, longueurs, deplacements, MPI INTEGER, & motif temp, ierr) CALL MPI TYPE GET EXTENT (motif temp, borne inf, taille, ierr) CALL MPI TYPE CREATE RESIZED (motif temp, borne inf zero, & borne inf+taille, motif, ierr) CALL MPI TYPE COMMIT (motif, ierr) deplacement initial = 0 CALL MPI FILE SET VIEW (descripteur, deplacement initial, MPI INTEGER, & motif, "native", MPI INFO NULL, ierr) CALL MPI FILE READ (descripteur, valeurs, 7, MPI INTEGER, status, ierr) CALL MPI FILE READ (descripteur, valeurs(8), 3, MPI INTEGER,status,ierr) CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) END PROGRAM read view01 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 202 / 221 Utilisation d une vue : exemple 2 déplacement initial : 0 Processeur 0 12 2 3 5 7 8 10 102 2 3 5 7 8 10 102 103 105 107 etype MPI_INTEGER motif proc 0 motif proc 1 Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 PROGRAM read view02 USE mpi IMPLICIT NONE Processeur 1 2 3 5 7 8 10 102 2 3 5 7 8 10 102 103 105 107 INTEGER, PARAMETER :: nb valeurs = 10 INTEGER :: myrank, descripteur, coord, motif, ierr INTEGER(KIND=MPI OFFSET KIND) :: deplacement initial INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 203 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 204 / 221

Utilisation d une vue : exemple 2 (suite) CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", MPI MODE RDONLY, & MPI INFO NULL, descripteur, ierr) IF (myrank == 0) THEN coord = 1 ELSE coord = 3 END IF CALL MPI TYPE CREATE SUBARRAY (1, (/4/), (/2/), (/coord-1/), & MPI ORDER FORTRAN, MPI INTEGER, & motif, ierr) Utilisation d une vue : exemple 2 (fin) Processeur 0 Fichier 11 2 32 5 6 9 10 103 104 107 108 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 CALL MPI TYPE COMMIT (motif, ierr) deplacement initial = 0 CALL MPI FILE SET VIEW (descripteur, deplacement initial, MPI INTEGER, & motif, "native", MPI INFO NULL, ierr) CALL MPI FILE READ (descripteur, valeurs, nb valeurs, MPI INTEGER, status, ierr) CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) END PROGRAM read view02 Processeur 1 3 4 7 8 101 102 105 106 109 110 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 205 / 221 Utilisation d une vue : exemple 3 etype motif_1 motif_2 motif_3 PROGRAM read view03 USE mpi IMPLICIT NONE MPI_INTEGER déplacement initial : 0 déplacement initial : 0 déplacement initial : 2 entiers INTEGER, PARAMETER :: nb valeurs = 10 INTEGER :: myrank, descripteur, motif 1, motif 2, motif 3 INTEGER :: ierr, nb octets entier INTEGER(KIND=MPI OFFSET KIND) :: deplacement initial INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 206 / 221 Utilisation d une vue : exemple 3 CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", MPI MODE RDONLY, & MPI INFO NULL, descripteur, ierr) CALL MPI TYPE CREATE SUBARRAY (1, (/4/), (/2/), (/0/), & MPI ORDER FORTRAN, MPI INTEGER, & motif 1, ierr) CALL MPI TYPE COMMIT (motif 1, ierr) CALL MPI TYPE CREATE SUBARRAY (1, (/4/), (/2/), (/2/), & MPI ORDER FORTRAN, MPI INTEGER, & motif 2, ierr) CALL MPI TYPE COMMIT (motif 2, ierr) CALL MPI TYPE CREATE SUBARRAY (1, (/4/), (/1/), (/3/), & MPI ORDER FORTRAN, MPI INTEGER, & motif 3, ierr) CALL MPI TYPE COMMIT (motif 3, ierr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 207 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 208 / 221

Utilisation d une vue : exemple 3 (suite) deplacement initial = 0 CALL MPI FILE SET VIEW (descripteur, deplacement initial, MPI INTEGER, & motif 1, "native", MPI INFO NULL, ierr) CALL MPI FILE READ (descripteur, valeurs, 4, MPI INTEGER, status, ierr) Utilisation d une vue : exemple 3 (fin) Processeur 0 11 2 32 5 6 3 4 7 6 10 104 CALL MPI FILE SET VIEW (descripteur, deplacement initial, MPI INTEGER, & motif 2, "native", MPI INFO NULL, ierr) CALL MPI FILE READ (descripteur, valeurs(5), 3, MPI INTEGER,status,ierr) CALL MPI TYPE SIZE (MPI INTEGER, nb octets entier, ierr) deplacement initial = 2*nb octets entier CALL MPI FILE SET VIEW (descripteur, deplacement initial, MPI INTEGER, & motif 3, "native", MPI INFO NULL, ierr) CALL MPI FILE READ (descripteur, valeurs(8), 3, MPI INTEGER,status,ierr) CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) END PROGRAM read view03 Fichier Processeur 1 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 1 2 5 6 3 4 7 6 10 104 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 209 / 221 Types dérivés : TP 9 Ecrire un programme MPI qui : lit deux entiers nx et ny par un processus et les diffuse construit une topologie 2D, grille cartésienne distribue la matrice de dimensions globales nx x ny sur la grille de processus, le plus homogène possible initialise le bloc matriciel de chaque processus avec des entiers croissants construit une vue pour générer un fichier contenant la matrice remplit le fichier Dupliquer le programme mais en lecture Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 211 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 210 / 221 Lectures / écritures non bloquantes Les entrées / sorties non bloquantes sont implémentées selon le modèle utilisé pour les communications non bloquantes. Un accès asynchrone doit donner lieu ultérieurement à un test explicite de complétude ou à une mise en attente (via MPI TEST, MPI WAIT,...) de façon similaire à la gestion des messages non bloquants. Il est possible d effectuer des opérations qui soient à la fois collectives et non bloquantes. Celles-ci nécessite un appel à deux sous-programmes distincts, l un pour déclencher l opération, l autre pour la terminer. On ne peut modifier la zone mémoire concernée durant l opération et il ne peut y avoir qu une seule telle opération en cours à la fois par processus. Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 212 / 221

Utilisation de MPI FILE READ ORDERED BEGIN PROGRAM READ ORDERED BEGIN END USE mpi IMPLICIT NONE INTEGER :: descripteur, ierr, myrank INTEGER, DIMENSION(nb valeurs) :: valeurs INTEGER, DIMENSION(MPI STATUS SIZE) :: status Utilisation de MPI FILE READ ORDERED BEGIN Processeur 0 11 2 32 3 4 CALL MPI INIT (ierr) CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr) CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", & MPI MODE RDONLY, MPI INFO NULL,& descripteur, ierr) CALL MPI FILE READ ORDERED BEGIN (descripteur, valeurs, 4, & MPI INTEGER, ierr) CALL MPI FILE READ ORDERED END (descripteur, valeurs, status, ierr) CALL MPI FILE CLOSE (descripteur, ierr) CALL MPI FINALIZE (ierr) END PROGRAM READ ORDERED BEGIN END Fichier Processeur 1 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 5 6 7 8 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 213 / 221 Parallélisation Présentation, environnement MPI Communications point à point Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 214 / 221 Exemple récapitulatif : équation de la Chaleur 1D Les { équations... u t λ 2 u x 2 = f dans Ω, avec Ω = [0, 1] u = 0 sur Γ = Ω La parallélisation est faite par décomposition de domaine Communications collectives Types de données dérivés Communicateurs et topologies Entrées / sorties collectives : MPI I/O Exemple récapitulatif : équation de la Chaleur 1D Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 215 / 221 La discrétisation spatiale est faite par un schéma aux différences finies d ordre deux à trois points maillage uniforme indicé i pas de discrétisation spatiale hx. La discrétisation temporelle est faite par le schéma de Crank-Nicholson, ordre 2 semi-implicite et inconditionnellement stable dans notre cas, avec dt le pas de la discrétisation. {I 0.5λdt } u n+1 = {I + 0.5λdt } u n + 0.5dt { f n+1 + f n} Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 216 / 221

Discrétisation Le laplacien est ainsi discrétisé : h u(i) = u i 1 2.u i + u i+1 h x 2 + termes d erreurs en h x 2 Le système global s écrit alors sous la forme : u i n+1 0.5λdt u i 1 n+1 2u i n+1 + u i+1 n+1 h x 2 = u i n + 0.5λdt. u i 1 n 2u i n + u i+1 n h x 2 + 0.5dt { f i n+1 + f i n } Algorithme du gradient conjugué A matrice symétrique et définie positive (Ax x) 0 La solution x de Ax = b minimise la fonctionnelle J(x) = (Ax x) 2(b x) Gradient conjugué = méthode itérative, dite de descente, pour que J(x k+1 ) < J(x k ) Algorithme : { x0 donné p 0 = r 0 = b Ax 0 Pour k = 0, 1,... α k = r k 2 (Ap k, p k ) x k+1 = x k + α k p k r k+1 = r k α k A p k β k = r k+1 2 r k 2 p k+1 = r k+1 + β k+1 p k Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 217 / 221 Algorithme séquentiel Initialisations : initialisations des vecteurs (fctfx) calcul des constantes (domaine) Boucle itérative en temps 1. construction du second membre (scdmb) 2. résolution du système linéaire (gradconj) boucle itérative de convergence comprenant : 1 produit matrice-vecteur (pmv) 2 produits scalaires (prodscal) 3 combinaisons linéaires de vecteurs (saxpy) 3. avancement en temps et calcul d erreur (nrmerr) Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 218 / 221 Au travail... 1. Analyser le code séquentiel (le faire tourner ) 2. Analyser les algorithmes mis en œuvre 3. Effectuer le découpage, construire la topologie (grille de processus, voisins,...) 4. Déterminer les dépendances entre les données 5. Faire le bilan : qui a besoin de quoi, quand et où! 6. Déterminer les structures des données à échanger 7. Construire les types MPI ad hoc 8. Dupliquer et modifier le code séquentiel! 9. En bonus, utiliser MPI-I/O pour gérer les fichiers de reprise Finalisations Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 219 / 221 Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 220 / 221

Conclusions Le passage de messages est une technique de parallélisation portable Elle permet de travailler sur tout type d architecture Elle est orientée parallélisme à gros grains Elle permet les échanges au sein de n importe quel groupe de processus Elle permet les échanges de n importe quel type de données Il est préférable d utiliser les formes collectives des opérations d entrée/sortie Guy Moebs (LMJL) Calcul parallèle avec MPI Mars 2010 221 / 221