Utilisation de MPI avec Python



Documents pareils
Introduction à la Programmation Parallèle: MPI

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

PVM 1 PVM. Parallel Virtual Machine

1. Structure d'un programme FORTRAN 95

Les bases du langage Python

Cours Informatique Master STEP

Présentation du langage et premières fonctions

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Initiation à la programmation en Python

Systèmes parallèles et distribués

Examen Médian - 1 heure 30

Introduction au calcul parallèle avec OpenCL

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

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

Application 1- VBA : Test de comportements d'investissements

Cours 7 : Utilisation de modules sous python

Plan du cours Cours théoriques. 29 septembre 2014

Problèmes liés à la concurrence

Programmation parallèle pour le calcul scientifique

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

Les classes en Python

Introduction to Parallel Programming with MPI

Java Licence Professionnelle CISII,

Parallélisme et Répartition

Exercices Types Algorithmique et simulation numérique Oral Mathématiques et Algorithmique Banque PT Propositions de réponses

Programmation parallèle et distribuée

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Génération de code binaire pour application multimedia : une approche au vol

Introduction à la programmation concurrente

Règles et paramètres d'exploitation de Caparmor 2 au 11/12/2009. Pôle de Calcul Intensif pour la mer, 11 Decembre 2009

Rapport de Mini-Projet en ArcGIS Engine

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

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

Découverte de Python

Propagation sur réseau statique et dynamique

Programme Compte bancaire (code)

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

2 Formation utilisateur

IRL : Simulation distribuée pour les systèmes embarqués

Paris Airports - Web API Airports Path finding

Le langage VHDL. Eduardo Sanchez EPFL

Lier Erlang avec d autres langages de programmation

Cours de Fortran 90 / 95

TP 1. Prise en main du langage Python

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Durée estimée :1 journée Date de la réalisation : Description Fournisseur Référence Nombre PU HT LM35CZ, LM35AZ LM35DZ

LINUX REMPLAÇANT WINDOWS NT

Package Java.util Classe générique

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Les risques d OpenFlow et du SDN

OS Réseaux et Programmation Système - C5

Python Les fondamentaux du langage


Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Chapitre 2 Devine mon nombre!

Recherche dans un tableau

2 Comment fonctionne un ordinateur, dans les grandes lignes

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

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

SERVEUR WEB. Christian Dupaty BTS Systèmes Numériques Lycée Fourcade Gardanne Académie d Aix Marseille

Cours d algorithmique pour la classe de 2nde

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

Représentation d un entier en base b

.NET - Classe de Log

Langage Java. Classe de première SI

ALGORITHMIQUE ET PROGRAMMATION En C

Systèmes distribués et virtualisation de ressources

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Utilitaires méconnus de StrataFrame

Utilisation d objets : String et ArrayList

Une bibliothèque de templates pour CUDA

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

Initiation au HPC - Généralités

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

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Exercices sur SQL server 2000

Object Constraint Language (OCL)

Les commandes de base de LINUX

Systèmes répartis. Fabrice Rossi Université Paris-IX Dauphine. Systèmes répartis p.1/49

Olivier Mondet

Cours Bases de données 2ème année IUT

Reconstruction de bâtiments en 3D à partir de nuages de points LIDAR

Java - la plateforme

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

OCL - Object Constraint Language

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

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Ateliers Python+Qt : Premiers pas : Comment développez ses propres interfaces graphiques sur le RaspberryPi?

CREATION WEB DYNAMIQUE

STAGE IREM 0- Premiers pas en Python

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

as Architecture des Systèmes d Information

CHAPITRE 9. Codes source. 9.1 Insertion brute

Convers3 Documentation version Par Eric DAVID : vtopo@free.fr

Construction de logiciel et packaging

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

Compilation (INF 564)

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Transcription:

Laboratoire de mathématiques d'orsay 9 décembre 2010

Plan 1 Introduction 2 Principe de MPI 3 mpi4py 4 Ressources

Introduction Plan 1 Introduction 2 Principe de MPI 3 mpi4py 4 Ressources

Introduction Comment paralléliser son code? GPU1 GPU2 GPU1 GPU2 Mémoire core1 core2 core3 core4 Mémoire core1 core2 core3 core4 réseau

Introduction Quels sont les outils pour paralléliser son code? 1 Threads 2 PVM pypvm pynpvm 3 MPI pympi mpi4py 4 GPU PyCUDA PyOpenCL

Principe de MPI Plan 1 Introduction 2 Principe de MPI 3 mpi4py 4 Ressources

Principe de MPI MPI : Message Passing Interface conçue en 1993, norme dénissant une bibliothèque de fonctions, utilisable avec les langages C et Fortran, permet d'exploiter des ordinateurs distants ou multiprocesseurs par passage de messages.

Principe de MPI MPI : Message Passing Interface Fonctionnalités de MPI-1 nombre de processus, numéro du processus,... communications point à point, communications collectives, communicateurs, types dérivées, topologies.

Principe de MPI MPI : Message Passing Interface Fonctionnalités de MPI-2 gestion dynamique des processus, I/O parallèle, interfaçage avec Fortran95 et C++, extension des communications collectives aux intercommunicateurs, communications de mémoire à mémoire,...

Principe de MPI MPI : Message Passing Interface Programme séquentiel monprogramme.py Mémoire core exécution import numpy as np a = np.zeros(100)...

Principe de MPI SPMD : Single Program Multiple Data Mémoire core monprogramme.py import numpy as np a = np.zeros(100)... réseau Mémoire core

PyMPI Principe de MPI projet inititié en 2002 par Patrick Miller interfaçage de la bibliothèque MPI-1 directement en API C ce module gère nombre de processus, numéro du processus,... communications point à point, communications collectives, création de sous-communicateurs.

mpi4py Principe de MPI projet inititié en 2006 par Lissandro Dalcin interfaçage de la bibliothèque MPI-1/2 avec Swig (version < 1) interfaçage de la bibliothèque MPI-1/2 avec Cython (version >= 1) ce module gère toutes les fonctionnalités que l'on peut trouver dans MPI-1/2

Principe de MPI Tests de performance Ping pong Chaque processus dispose d'un tableau de double. Envois alternés de paquets de données entre 2 processus. Les paquets sont de plus en plus grands. On regarde combien de temps il faut pour recevoir ces paquets.

Principe de MPI Tests de performance

Principe de MPI Un petit mot sur pickle Le module pickle permet de convertir n'importe quel objet complexe Python en suites d'octets (sérialisation). Ce ux peut être sauvegardé, être transmis via le réseau. On peut ensuite le reconstruire (désérialisation). Le module cpickle est une implémentation en C plus rapide que pickle.

Principe de MPI Un petit mot sur pickle Exemple import cpickle import numpy as np a = np.linspace(0., 1., 100) b = "une chaine" fichier = open("pickledata", "w") cpickle.dump([a, b], fichier, 0)

Plan mpi4py 1 Introduction 2 Principe de MPI 3 mpi4py 4 Ressources

mpi4py bloquante Exemple 0 7 1 valeur = 1000 6 2 5 3 4

mpi4py Exemple Fortran program point_a_point implicit none include 'mpif.h' integer, dimension(mpi_status_size) :: statut integer, parameter :: etiquette=100 integer :: rang,valeur,code call MPI_INIT(code) call MPI_COMM_RANK(MPI_COMM_WORLD,rang,code) if (rang == 1) then valeur=1000 call MPI_SEND(valeur,1,MPI_INTEGER,5,etiquette,MPI_COMM_WORLD,code) elseif (rang == 5) then call MPI_RECV(valeur,1,MPI_INTEGER,1,etiquette,MPI_COMM_WORLD,statut,code) print *,'Moi, processus 5, j''ai reçu ',valeur,' du processus 1.' end if call MPI_FINALIZE(code) end program point_a_point

mpi4py Même exemple avec Python import mpi4py.mpi as mpi rang = mpi.comm_world.rank if rang == 1: valeur = 1000 mpi.comm_world.send(valeur, dest = 5) elif rang == 5: valeur = mpi.comm_world.recv(source = 1) print "Moi, Processus 5, j'ai recu", valeur, "du processus 1."

mpi4py Un exemple un peu plus complexe class point: def init (self, num, x, y): self.num = num self.x = x self.y = y def str (self): s = "coordonnees du point " + str(self.num) + " :\n" s += "x : " + str(self.x) + ", y : " + str(self.y) + "\n" return s

mpi4py Un exemple un peu plus complexe (suite) import mpi4py.mpi as mpi from numpy import array from point import point rank = mpi.comm_world.rank if rank == 0: sendvalues = [point(1, 2., 4.5), array([3, 4, 8]), \ {1:'un', 2:'deux', 3:'trois'}] mpi.comm_world.send(sendvalues, dest = 1) else: recvvalues = mpi.comm_world.recv(source = 0) for v in recvvalues: print v

mpi4py Envoi d'un tableau Numpy import mpi4py.mpi as mpi import numpy as np rank = mpi.comm_world.rank n = 10 if rank == 0: sendarray = np.linspace(0., 1., n) mpi.comm_world.send([sendarray, mpi.double], dest = 1) else: recvarray = np.empty(n) mpi.comm_world.recv([recvarray, mpi.double], source = 0) print recvarray

Résumé mpi4py Dans le module mpi4py.mpi COMM_WORLD : communicateur par défaut (englobe tous les processus lancés) COMM_WORLD.size : nombre de processus COMM_WORLD.rank : rang du processus COMM_WORLD.send, COMM_WORLD.recv : envoi et réception de messages via cpickle COMM_WORLD.Send, COMM_WORLD.Recv : envoi et réception de tableaux Numpy INTEGER, FLOAT, DOUBLE, COMPLEX,... : types des données des tableaux Numpy envoyés et reçus

mpi4py non bloquante Exemple 2 3 0 1

mpi4py non bloquante Exemple 2 3 0 1

mpi4py non bloquante import mpi4py.mpi as mpi rang, size = mpi.comm_world.rank, mpi.comm_world.size if rang == 0: voisins = [2, 1] if rang == 1: voisins = [0, 3] if rang == 2: voisins = [3, 0] if rang == 3: voisins = [1, 2] recvalue = [] for v in voisins: mpi.comm_world.isend([np.arange(1000), mpi.int], v, tag=10*v + rang) for v in voisins: recvalue.append(np.empty(1000, dtype=np.int)) mpi.comm_world.recv([recvalue[-1], mpi.int], v, tag=10*rang + v) print rang, voisins, recvalue

mpi4py Synchronisation globale mpi4py.mpi.comm_world.barrier()

mpi4py Diusion générale bcast(obj = None, root = 0) Bcast(buf, root = 0) 0 1 2 A 3 0 A 1 A 2 A 3 A

mpi4py Diusion générale Exemple avec cpickle import mpi4py.mpi as mpi if mpi.comm_world.rank == 0: a = [(1, 2), {2: 'toto', 3: 'titi'}] a = mpi.comm_world.bcast(a, 0) else: a = mpi.comm_world.bcast(none, 0) print a

mpi4py Diusion générale Exemple avec numpy import mpi4py.mpi as mpi import numpy as np n = 10 a = np.empty(n) if mpi.comm_world.rank == 0: a = np.linspace(0, 1, n) mpi.comm_world.bcast([a, mpi.double], 0) print a

mpi4py Communication dispersive scatter(sendobj=none, recvobj=none, root = 0) Scatter(sendbuf, recvbuf, root = 0) 0 1 0 A 1 1 A 2 2 A 1 A 2 A 3 A 4 3 2 A 3 3 A 4

mpi4py Communication dispersive Exemple avec cpickle import mpi4py.mpi as mpi if mpi.comm_world.rank == 0: a = [(1, 2), {2: 'toto', 3: 'titi'}] a = mpi.comm_world.scatter(a, 0) else: a = mpi.comm_world.scatter(none, 0) print a

mpi4py Communication dispersive Exemple avec numpy import mpi4py.mpi as mpi import numpy as np n = 16 b = np.empty(n/4) if mpi.comm_world.rank == 0: a = np.linspace(0, 1, n) mpi.comm_world.scatter([a, mpi.double], [b, mpi.double], 0) else: mpi.comm_world.scatter(none, [b, mpi.double], 0) print b

Rassembler mpi4py gather(sendobj=none, recvobj=none, root = 0) Gather(sendbuf, recvbuf, root = 0) 0 A 1 1 A 2 0 1 2 A 3 3 A 4 2 A 1 A 2 A 3 A 4 3

Rassembler mpi4py Exemple avec cpickle import mpi4py.mpi as mpi if mpi.comm_world.rank == 0: a = (1, 2) a = mpi.comm_world.gather(a, 0) print a else: a = {2: 'toto', 3: 'titi'} mpi.comm_world.gather(a, 0)

Rassembler mpi4py Exemple avec numpy import mpi4py.mpi as mpi import numpy as np n = 4 rank = mpi.comm_world.rank size = mpi.comm_world.size interval = mpi.comm_world.size*n - 1 deb = float(n*rank)/interval fin = float(n*(rank + 1) - 1)/interval a = np.linspace(deb, fin, n) if mpi.comm_world.rank == 0: b = np.empty(n*size) mpi.comm_world.gather([a, mpi.double], [b, mpi.double], 0) else: mpi.comm_world.gather([a, mpi.double], None, 0) if rank == 0: print b

mpi4py Tout rassembler allgather(sendobj=none, recvobj=none) Allgather(sendbuf, recvbuf) 0 A 1 0 A 1 A 2 A 3 A 4 1 A 2 1 A 1 A 2 A 3 A 4 2 A 3 2 A 1 A 2 A 3 A 4 3 A 4 3 A 1 A 2 A 3 A 4

Rassembler mpi4py Exemple avec cpickle import mpi4py.mpi as mpi if mpi.comm_world.rank == 0: a = (1, 2) a = mpi.comm_world.gather(a, 0) print a else: a = {2: 'toto', 3: 'titi'} mpi.comm_world.gather(a, 0)

Rassembler mpi4py Exemple avec numpy import mpi4py.mpi as mpi import numpy as np n = 4 rank = mpi.comm_world.rank size = mpi.comm_world.size interval = mpi.comm_world.size*n - 1 deb = float(n*rank)/interval fin = float(n*(rank + 1) - 1)/interval a = np.linspace(deb, fin, n) if mpi.comm_world.rank == 0: b = np.empty(n*size) mpi.comm_world.gather([a, mpi.double], [b, mpi.double], 0) else: mpi.comm_world.gather([a, mpi.double], None, 0) if rank == 0: print b

mpi4py Echanges croisés alltoall(sendobj=none, recvobj=none) Alltoall(sendbuf, recvbuf) 0 A 1 A 2 A 3 A 4 0 A 1 B 1 C 1 D 1 1 B 1 B 2 B 3 B 4 1 A 2 B 2 C 2 D 2 2 C 1 C 2 C 3 C 4 2 A 3 B 3 C 3 D 3 3 D 1 D 2 D 3 D 4 3 A 4 B 4 C 4 D 4

Réduction mpi4py reduce(sendobj=none, recvobj=none, op=sum, root=0) Reduce(sendbuf, recvbuf, op=sum, root=0) allreduce(sendobj=none, recvobj=none, op=sum) Alleduce(sendbuf, recvbuf, op=sum) mpi4py.mpi.sum : somme des éléments mpi4py.mpi.prod : produit des éléments mpi4py.mpi.max : recherche du maximum mpi4py.mpi.min : recherche du minimum mpi4py.mpi.maxloc : recherche de l'indice du maximum mpi4py.mpi.minloc : recherche de l'indice du minimum...

Réduction mpi4py On reprend notre classe point en y ajoutant def add (self, p2): return point(0, self.x + p2.x, self.y + p2.y) Exemple avec cpickle import mpi4py.mpi as mpi from point import point rank = mpi.comm_world.rank p1 = point(0, rank, rank + 1) p2 = mpi.comm_world.allreduce(p1, mpi.sum) print p2

Idée générale mpi4py 0 2 0 2 4 1 3 maîtres 1 3 esclaves

Idée générale mpi4py 0 2 inter_comm 0 2 4 1 3 1 3 maîtres esclaves

Idée générale mpi4py 0 2 inter_comm 0 2 4 1 3 1 3 maîtres intra_comm esclaves

mpi4py La fonction Spawn Création d'un lien entre maîtres et esclaves Comm.Spawn(self, command, args=none, maxprocs=1, info=info_null, root=0) Comm communicateur COMM_WORLD, communicateur COMM_SELF, communicateur que vous aurez créé. Remarque : cette commande renvoie un communicateur représentant l'inter_comm.

mpi4py Autres fonctions utiles Comm.Get_parent() Le processus esclave demande si il a un processus maître et lequel. Comm.Merge(high=False) Création de l'intra_comm entre le ou les maîtres et les esclaves. Comm.Disconnect() Déconnecte le processus d'un communicateur.

Exemple 1 mpi4py master.py #!/usr/bin/env python import mpi4py.mpi as mpi worker = mpi.comm_world.spawn("slave.py", None, 2, root=1) intra = worker.merge() print 'maitre:', mpi.comm_world.get_rank(), \ intra.get_rank(), intra.get_size() intra.disconnect() worker.disconnect() Attention le chier slave.py doit être exécutable.

Exemple 1 mpi4py slave.py #!/usr/bin/env python import mpi4py.mpi as mpi master = mpi.comm.get_parent() intra = master.merge() print 'ouvrier', intra.get_rank(), intra.get_size() intra.disconnect() master.disconnect()

Exemple 2 mpi4py master.py #!/usr/bin/env python import mpi4py.mpi as mpi worker = mpi.comm_self.spawn("slave.py", None, 2, root=0) intra = worker.merge() print 'maitre:', mpi.comm_world.get_rank(), \ intra.get_rank(), intra.get_size() intra.disconnect() worker.disconnect() On reprend le slave.py de l'exemple précédent.

mpi4py Interfacer avec swig testswig.c #include "testswig.h" int testswig(mpi_comm comm, int a) { int sum, size, rank; } MPI_Comm_size(comm, &size); MPI_Comm_rank(comm, &rank); MPI_Allreduce(&a, &sum, 1, MPI_INT, MPI_SUM, comm); return sum;

mpi4py Interfacer avec swig testswig.i %module testswig %{ #include "testswig.h" %} %include mpi4py/mpi4py.i %mpi4py_typemap(comm, MPI_Comm); %include "testswig.h"

mpi4py Interfacer avec swig setup.py from distutils.core import setup, Extension import mpi4py swig = mpi4py.get_include() include = [swig, "/usr/lib/openmpi/include"] sources = ["testswig.c", "testswig.i"] setup( ext_modules = [ Extension("_testSwig", sources = sources, swig_opts = ["-I" + swig], include_dirs = include ) ] )

mpi4py Interfacer avec swig Création du module $ python setup.py build_ext -i Exemple d'utilisation import mpi4py.mpi as mpi import numpy as np from _testswig import testswig rank = mpi.comm_world.get_rank() sum = testswig(mpi.comm_world, rank) print sum

mpi4py Interfacer avec f2py testf2py.f90 subroutine testf2py(comm, a, sum) use mpi implicit none integer :: comm integer :: rank, size, nlen, ierr integer :: a, sum!f2py integer, intent(out):: sum call MPI_Comm_rank(comm, rank, ierr) call MPI_Comm_size(comm, size, ierr) call MPI_allreduce(a, sum, 1, MPI_INTEGER, MPI_SUM, comm,ierr) end subroutine testf2py

mpi4py Interfacer avec f2py Création du module $ f2py --f90exec=mpif90 -m testf2py -c testf2py.f90 Exemple d'utilisation import mpi4py.mpi as mpi from testf2py import testf2py rank = mpi.comm_world.get_rank() sum = testf2py(mpi.comm_world.py2f(), rank) print "processus", rank, "somme dans python", sum

mpi4py Interfacer avec Cython testcython.pyx cimport mpi4py.mpi as MPI from mpi4py.mpi_c cimport * cdef extern from "stdio.h": int printf(char*,...) cdef int c_testcython(mpi_comm comm, int a): cdef int size, rank, sum MPI_Comm_size(comm, &size) MPI_Comm_rank(comm, &rank) printf("hello, World! I am process %d of %d.\n", rank, size) MPI_Allreduce(&a, &sum, 1, MPI_INT, MPI_SUM, comm) return sum

mpi4py Interfacer avec Cython testcython.pyx (suite) def testcython(mpi.comm comm not None, a ): cdef MPI_Comm c_comm = comm.ob_mpi return c_testcython(c_comm, a)

mpi4py Interfacer avec Cython setup.py from distutils.core import setup, Extension from Cython.Distutils import build_ext import mpi4py cythoninc = mpi4py.get_include() includedir = [cythoninc, "/usr/lib/openmpi/include" setup(ext_modules = [ Extension("testcython", sources = ["testcython.pyx"], cython_opts = ["-I" + cythoninc], include_dirs = includedir )], cmdclass = {'build_ext': build_ext} )

mpi4py Interfacer avec Cython Création du module $ python setup.py build_ext -i Exemple d'utilisation import mpi4py.mpi as mpi from testcython import testcython rank = mpi.comm_world.get_rank() sum = testcython(mpi.comm_world, rank) print "processus", rank, "somme dans python", sum

Ressources Plan 1 Introduction 2 Principe de MPI 3 mpi4py 4 Ressources

Ressources cours MPI de l'idris site de mpi4py site de pympi