Stage au laboratoire Informatique Distribuée

Post on 23-Jan-2016

51 views 0 download

description

Stage au laboratoire Informatique Distribuée. Grenoble, été 2005. Parallelisation adaptative de programmes itératifs. Charles Bouillaguet. Le laboratoire ID-IMAG. Commun CNRS-INRIA Fait partie de l’ I nstitut de M ath. A ppliquées de G renoble - PowerPoint PPT Presentation

Transcript of Stage au laboratoire Informatique Distribuée

Stage au laboratoire Informatique Distribuée

Charles Bouillaguet

Grenoble, été 2005Grenoble, été 2005

Parallelisation adaptativede programmes itératifs

Le laboratoire ID-IMAG

• Commun CNRS-INRIA

• Fait partie de l’Institut de Math. Appliquées de Grenoble

• Deux équipes de recherche : MESCAL et MOAIS

• MOAIS = Multi-programmation et Ordonnancement sur ressources distribuées pour les Applications Interactives de Simulation

• Equipe jeune, beaucoup de stagiaires et de thésards

Le laboratoire ID-IMAG

Le laboratoire ID-IMAGcharles

De l’autre côté de la rue

De l’autre côté de la rue

Le cadre

Jean-Louis Roch :mon directeur de stage

QuickTime™ et undécompresseur TIFF (non compressé)

sont requis pour visionner cette image.

• Chef de MOAIS• L’homme le plus

speed du monde

Deux ou trois notions d’algorithmique parallèle

Deux ou trois notions d’algorithmique parallèle

• Qu’est-ce qu’un programme parallèle ?

Deux ou trois notions d’algorithmique parallèle

• Qu’est-ce qu’un programme parallèle ?

• Qu’est-ce qu’une architecture parallèle ?

Deux ou trois notions d’algorithmique parallèle

• Qu’est-ce qu’un programme parallèle ?

• Qu’est-ce qu’une architecture parallèle ?

• Comment ça se programme ?

Deux ou trois notions d’algorithmique parallèle

• Qu’est-ce qu’un programme parallèle ?

• Qu’est-ce qu’une architecture parallèle ?

• Comment ça se programme ?

• Comment organiser les calculs ?

Qu’est-ce qu’un programme parallèle ?

C’est un programme qui crée plusieurs tâches(qui s’exécutent simultanément)

Qu’est-ce qu’un programme parallèle ?

C’est un programme qui crée plusieurs tâches(qui s’exécutent simultanément)

On peut le voir comme un graphe orienté acyclique

Qu’est-ce qu’un programme parallèle ?

• Chaque noeud représente une opération

• Une opération ne peut s’exécuter que lorsque tous ses parents ont terminé

Exemple : calcul de 10!

Qu’est-ce qu’un programme parallèle ?

• nombre de noeuds du graphe = nombre total d’opérations (noté T1)

• plus long chemin dans le graphe = temps critique (noté T∞)

Qu’est-ce qu’un programme parallèle ?

• nombre de noeuds du graphe = nombre total d’opérations (noté T1)

• plus long chemin dans le graphe = temps critique (noté T∞)

Chemin critique

Qu’est-ce qu’un programme parallèle ?

• nombre de noeuds du graphe = nombre total d’opérations (noté T1)

• plus long chemin dans le graphe = temps critique (noté T∞)

Temps d’exécution sur p processeurs (Tp) ?

Qu’est-ce qu’un programme parallèle ?

Let rec produit from to = match (to - from) with | 0 -> from | 1 -> from * to | n -> let i = (to-n/2) in (Fork (produit from i)) * (Fork (produit (i+1) to))

Théorie de la factorielle parallèle

Qu’est-ce qu’un programme parallèle ?

Qu’est-ce qu’un programme parallèle ?Théorie de la factorielle parallèle

Fork

*

A.B.C. à n-1 noeuds

A.B.C. à n/2-1 noeuds

Let rec produit from to = match (to - from) with | 0 -> from | 1 -> from * to | n -> let i = (to-n/2) in (Fork (produit from i)) * (Fork (produit (i+1) to))

Théorie de la factorielle parallèle

Fork

*

T1 = O(n)T∞ = O(log n)

Qu’est-ce qu’un programme parallèle ?

Let rec produit from to = match (to - from) with | 0 -> from | 1 -> from * to | n -> let i = (to-n/2) in (Fork (produit from i)) * (Fork (produit (i+1) to))

Qu’est-ce qu’un programme parallèle ?

MAIS…

Qu’est-ce qu’un programme parallèle ?

MAIS…En fait, T1 = (n/2) TFork + n T*

et TFork >> T*

Exemple avec 2 processeurs :

9 étapes de calcul sur 2 processeurs

10 étapes sur un seul processeur

(et encore…)

Qu’est-ce qu’un programme parallèle ?

Qu’est-ce qu’une architecture parallèle ?

Qu’est-ce qu’une architecture parallèle ?

Deux types de base

• Les machines à mémoire partagée

• Les machines à mémoire distribuée

Et un mélange des deux

• Les clusters de machines SMP

Qu’est-ce qu’une architecture parallèle ?

Architecture à mémoire partagée

Qu’est-ce qu’une architecture parallèle ?

Architecture à mémoire partagée

Qu’est-ce qu’une architecture parallèle ?

Architecture à mémoire partagée

Que des avantages :

• Possibilité d’avoir des variables globales

• Communication entre les tâches très simple et très rapide

•Synchronisation des tâches peu coûteuse

Qu’est-ce qu’une architecture parallèle ?

Architecture à mémoire partagée

Que des avantages :

• Possibilité d’avoir des variables globales

• Communication entre les tâches très simple et très rapide

•Synchronisation des tâches peu coûteuse

Un inconvénient :

•Le prix (et la complexité) de la machine est exponentiel en le nombre de processeurs

Qu’est-ce qu’une architecture parallèle ?

Architecture à mémoire distribuée

Qu’est-ce qu’une architecture parallèle ?

Architecture à mémoire distribuée

Qu’est-ce qu’une architecture parallèle ?

Architecture à mémoire distribuée

Que des inconvénients :

• Communication inter-processus lente et problématique (machines non-homogènes)

• Pas de variables globales…(dommage, c’était bien pratique)

Qu’est-ce qu’une architecture parallèle ?

Architecture à mémoire distribuée

Que des inconvénients :

• Communication inter-processus lente et problématique (machines non-homogènes)

• Pas de variables globales…(dommage, c’était bien pratique)

Mais bon…

Coût linéaire, possibilité d’avoir une grosse puissance de calcul : 100, 400, 1000 machines

Qu’est-ce qu’une architecture parallèle ?

En pratique…On a souvent des clusters de machines SMP (seuil critique à 2)

Problème : •Certaines tâches communiquent entre elles par le réseau, d’autres par une mémoire centrale •La création d’une tâche “locale” et d’une tâche distante ne mettent pas en jeu les mêmes mécanismes

Qu’est-ce qu’une architecture parallèle ?

En pratique…On a souvent des clusters de machines SMP (seuil critique à 2)

Problème :

C’est le cauchemar du programmeur

Comment ça se programme ?

Comment ça se programme ?

Pour garantir un minimum de portabilité, on aimerait que le programme soit indépendant…

•Du nombre de processeurs

•Du type d’architecture

Comment ça se programme ?

Pour garantir un minimum de portabilité, on aimerait que le programme soit indépendant…

•Du nombre de processeurs

•Du type d’architecture

Langages parallèlesLibrairies parallèles pour langages séquentiels

Comment ça se programme ?

KAAPIKernel for Adaptative, Asynchronous Parallel and Interactive programming

•Librairie C++ developpée à ID•Gère la création de tâches de manière transparente•Gère la communication entre les tâches et la synchronisation

•Majoration de Tp

•Tolérance aux panne •Ajout/suppression de ressources en ligne

Comment ça se programme ?

KAAPIKernel for Adaptative, Asynchronous Parallel and Interactive programming

•Librairie C++ developpée à ID•Gère la création de tâches de manière transparente•Gère la communication entre les tâches et la synchronisation

•Majoration de Tp

•Tolérance aux panne •Ajout/suppression de ressources en ligne•Un peu lourdingue à utiliser•API de haut niveau déficiente

Comment ça se programme ?

KAAPI

Le programme : graphe de flot de données (“dataflow”)

•Graphe bi-partite•Noeuds ronds : données•Noeuds carrés : fonctions•Flèches : dépendances

Comment ça se programme ?

KAAPI

KAAPI calcule le graphe lors de l’exécution. Cela permet :

•De gérer la synchronisation entre les tâches

•De déplacer les données sur la bonne machine pour exécuter une cloture donnée

Comment ça se programme ?

KAAPI

Comment ça se programme ?

KAAPI

Comment organiser les calculs ?

Comment organiser les calculs ?

Le scheduling

Comment organiser les calculs ?

Le scheduling

2 processeursT2 = 9

(triche : Fork est plus long que *)

Tp dépend de l’ordonnancement des calculs.

Optimal ?

Comment organiser les calculs ?

Le scheduling

2 processeursT2 = 9

(triche : Fork est plus long que *)

Tp dépend de l’ordonnancement des calculs.

Dommage :Optimal-scheduling est NP-Complet

Optimal ?

Comment organiser les calculs ?

Le scheduling

Et encore !

•Le graphe du programme n’est connu qu’à l’exécution (on-line scheduling)

•Les machines n’ont pas toutes la même vitesse

•La vitesse des machines peut varier (!)

•Il est exclu que les machines passent leur temps à se renseigner les unes sur les autres

•Il est exclu que les machines passent longtemps à déterminer quelle est leur prochaine tâche

Comment organiser les calculs ?

Le scheduling

Vol de travail distribué, randomizé

•Chaque processeur a une pile de clotures prêtes

•Tâche terminée ? Exécuter la cloture du dessus

•Pile vide ? Tirer un autre processeur au hasard et voler la cloture du bas (en tirer un autre si sa pile était vide)

Comment organiser les calculs ?

Le scheduling

Vol de travail distribué, randomizé

•Chaque processeur a une pile de clotures prêtes

•Tâche terminée ? Exécuter la cloture du dessus

•Pile vide ? Tirer un autre processeur au hasard et voler la cloture du bas (en tirer un autre si sa pile était vide)

Magique :

Comment organiser les calculs ?

La granularité des calculs

Comment organiser les calculs ?

La granularité des calculs

Problème de la factoriellepasse son temps à créer des tâches !

•Algorithmes à grain fin : nombre de tâches dépendant de la taille du problème

Comment organiser les calculs ?

La granularité des calculs

Problème de la factoriellepasse son temps à créer des tâches !

•Algorithmes à grain fin : nombre de tâches dépendant de la taille du problème

•Algorithmes à gros grain : nombre de tâche dépendant de la machine (une par CPU)

Le sujet de mon stage

Le sujet de mon stage

Le grain adaptatif

Ne garder que les avantages•Nombre de tâches réduit au strict minimum•Pas de limite à l’extraction de parallélisme

Le sujet de mon stage

Le grain adaptatif

Ne garder que les avantages•Nombre de tâches réduit au strict minimum•Pas de limite à l’extraction de parallélisme

Idées•Les algo. séquentiels sont toujours plus efficaces•Work-first principle (dégénération séquentielle)

Le sujet de mon stage

Le grain adaptatif

Hypothèses•Algorithme à grain fin de type découpe récursive•La séquence d’instruction qui conclut l’algo. sequentiel peut être remplacée par un appel à l’algo. parallèle

(pas très contraignant)

Le sujet de mon stage

Le grain adaptatif

CPU 1

Le sujet de mon stage

Le grain adaptatif

CPU 1

Le sujet de mon stage

Le grain adaptatif

CPU 1

CPU 2

Le sujet de mon stage

Le grain adaptatif

CPU 1

CPU 2

Vol de travail

Le sujet de mon stage

Le grain adaptatif

CPU 1 CPU 2

Le sujet de mon stage

Le grain adaptatif

CPU 1 CPU 2

Le sujet de mon stage

Le grain adaptatif

CPU 1 CPU 2

Le sujet de mon stage

Le grain adaptatif

Fusion des 2 morceaux(une étape de l’algo. parallèle)

Le sujet de mon stage

Le grain adaptatif

“Adaptatif” parce que

•S’adapte à des machines de vitesses différentes

•S’adapte à la variation de vitesse des machines

•S’adapte aux données (algo. irreguliers)

•Permet facilement d’ajouter des machines en cours de calcul

Et en plus…

•Nombre de tâches réduit au minimum

Le sujet de mon stage

Paralléliser des programmes itératifs

Le vrai but de mon stageObtenir un algo adaptatif pour des programmes de la forme :

(L’opérateur (+) est supposé associatif)

Le sujet de mon stage

Paralléliser des programmes itératifs

ExempleLet rec jouet n = function | a when a > 1 000 000 000 000 -> n-1 | a -> jouet (n+1) (a + abs (sin n))

Ça calcule :

Le sujet de mon stage

Paralléliser des programmes itératifs

Problèmes :•Chaque itération de la boucle dépend de la précédente•Le test d’arret…

Solution :•Découper le problème en macro-étapes•On fait des calculs parallèle à l’intérieur d’une ME•On synchronise tout le monde entre 2 ME

Le sujet de mon stage

Paralléliser des programmes itératifs

Le sujet de mon stage

Paralléliser des programmes itératifs

Compromis entre nombre et taille des ME

Petites ME :

résultat

Le sujet de mon stage

Paralléliser des programmes itératifs

Compromis entre nombre et taille des ME

ME exponentielles :

résultat Calculs inutiles

Le sujet de mon stage

Paralléliser des programmes itératifs

Accélération en fonction du nombre de CPU

0

1

2

3

4

5

6

7

8

1 2 3 4 5 6 7 8

#CPU

Résultats expérimentaux avec le jouet

Le sujet de mon stage

Paralléliser des programmes itératifs

Résultats expérimentaux avec le jouet

Bilan

Bilan

•Beaucoup de découvertes

•Un peu de maths

•Beaucoup de programmation (C++, grrrrr…)

•Beaucoup de debuggage (pénible, gdb, mode texte)

•Beaucoup de messages d’erreur

Bilan

(.gnu.linkonce.t._ZN7ClosureI28compute_residues_in_parallelIN6LinBox7ModularIdEENS1_17IntegerModularDetINS1_12SparseMatrixINS1_17UnparametricFieldI7IntegerEESt4pairISt6vectorIjSaIjEESA_IS7_SaIS7_EEEEENS1_15WiedemannTraitsEEENS1_11RandomPrimeEEE4srunEPN4Core7ClosureEPNSM_6ThreadE+0x30): In function `Closure<compute_residues_in_parallel<LinBox::Modular<double>, LinBox::IntegerModularDet<LinBox::SparseMatrix<LinBox::UnparametricField<Integer>, std::pair<std::vector<unsigned, std::allocator<unsigned> >, std::vector<Integer, std::allocator<Integer> > > >, LinBox::WiedemannTraits>, LinBox::RandomPrime> >::srun(Core::Closure*, Core::Thread*)':: undefined reference to `compute_residues_in_parallel<LinBox::Modular<double>, LinBox::IntegerModularDet<LinBox::SparseMatrix<LinBox::UnparametricField<Integer>, std::pair<std::vector<unsigned, std::allocator<unsigned> >, std::vector<Integer, std::allocator<Integer> > > >, LinBox::WiedemannTraits>, LinBox::RandomPrime>::doit(Core::Thread*)'

test-det.o(.gnu.linkonce.t._ZNK4Core13WrapperFormatI24WorkDescriptorEncapsulerE5writeERNS_7OStreamEPKvj+0x21): In function `Core::WrapperFormat<WorkDescriptorEncapsuler>::write(Core::OStream&, void const*, unsigned) const':: undefined reference to `operator<<(Core::OStream&, WorkDescriptorEncapsuler const&)'test-det.o(.gnu.linkonce.t._ZNK4Core13WrapperFormatI24WorkDescriptorEncapsulerE4readERNS_7IStreamEPvj+0x21): In function `Core::WrapperFormat<WorkDescriptorEncapsuler>::read(Core::IStream&, void*, unsigned) const':: undefined reference to `operator>>(Core::IStream&, WorkDescriptorEncapsuler&)'collect2: ld returned 1 exit statusmake: *** [test-det] Erreur 1

Bilan

/users/huron/bouillag/linbox-0.2.1/linbox/algorithms/cra-domain.h: In function `void LinBox::compute_residues_adaptive(std::vector<_Field::Element, std::allocator<_Field::Element> >*, std::vector<T, std::allocator<_CharT> >*, FunctionEncapsuler<Function>&, RandPrime&, WorkDescriptorEncapsuler&, WorkDescriptorEncapsuler&, bool) [with Domain = LinBox::Modular<double>, Function = LinBox::IntegerModularDet<LinBox::SparseMatrix<LinBox::GMP_Integers, std::pair<std::vector<size_t, std::allocator<size_t> >, std::vector<Integer, std::allocator<Integer> > > >, LinBox::WiedemannTraits>, RandPrime = LinBox::RandomPrime]':/users/huron/bouillag/linbox-0.2.1/parallel-stuff/kaapi_stuff.h:81: instantiated from `void compute_residues_in_parallel<Domain, Function, RandPrime>::doit(Core::Thread*) [with Domain = LinBox::Modular<double>, Function = LinBox::IntegerModularDet<LinBox::SparseMatrix<LinBox::GMP_Integers, std::pair<std::vector<size_t, std::allocator<size_t> >, std::vector<Integer, std::allocator<Integer> > > >, LinBox::WiedemannTraits>, RandPrime = LinBox::RandomPrime]'/users/huron/bouillag/linbox-0.2.1/parallel-stuff/kaapi_stuff.h:27: instantiated from `static void Closure<Runnable>::srun(Core::Closure*, Core::Thread*) [with Runnable = compute_residues_in_parallel<LinBox::Modular<double>, LinBox::IntegerModularDet<LinBox::SparseMatrix<LinBox::GMP_Integers, std::pair<std::vector<size_t, std::allocator<size_t> >, std::vector<Integer, std::allocator<Integer> > > >, LinBox::WiedemannTraits>, LinBox::RandomPrime>]'/users/huron/bouillag/linbox-0.2.1/linbox/algorithms/cra-domain.h:344: instantiated from `Integer& LinBox::ChineseRemainder<Domain>::Early_operator(Integer&, const Function&, RandPrime&) [with Function = LinBox::IntegerModularDet<LinBox::SparseMatrix<LinBox::GMP_Integers, std::pair<std::vector<size_t, std::allocator<size_t> >, std::vector<Integer, std::allocator<Integer> > > >, LinBox::WiedemannTraits>, RandPrime = LinBox::RandomPrime, Domain = LinBox::Modular<double>]'/users/huron/bouillag/linbox-0.2.1/linbox/algorithms/cra-domain.h:392: instantiated from `Integer& LinBox::ChineseRemainder<Domain>::operator()(Integer&, const Function&, RandPrime&) [with Function = LinBox::IntegerModularDet<LinBox::SparseMatrix<LinBox::GMP_Integers, std::pair<std::vector<size_t, std::allocator<size_t> >, std::vector<Integer, std::allocator<Integer> > > >, LinBox::WiedemannTraits>, RandPrime = LinBox::RandomPrime, Domain = LinBox::Modular<double>]'/users/huron/bouillag/linbox-0.2.1/linbox/solutions/det.h:351: instantiated from `Blackbox::Field::Element& LinBox::det(Blackbox::Field::Element&, const Blackbox&, const LinBox::RingCategories::IntegerTag&, const MyMethod&) [with Blackbox = LinBox::SparseMatrix<LinBox::GMP_Integers, std::pair<std::vector<size_t, std::allocator<size_t> >, std::vector<Integer, std::allocator<Integer> > > >, MyMethod = LinBox::WiedemannTraits]'/users/huron/bouillag/linbox-0.2.1/linbox/solutions/det.h:65: instantiated from `Blackbox::Field::Element& LinBox::det(Blackbox::Field::Element&, const Blackbox&, const MyMethod&) [with Blackbox = LinBox::SparseMatrix<LinBox::GMP_Integers, std::pair<std::vector<size_t, std::allocator<size_t> >, std::vector<Integer, std::allocator<Integer> > > >, MyMethod = LinBox::WiedemannTraits]'test-det.cc:77: instantiated from here/users/huron/bouillag/linbox-0.2.1/linbox/algorithms/cra-domain.h:154: `crp_format' undeclared (first use this function)

Bilan

•Beaucoup de découvertes

•Un peu de maths

•Beaucoup de programmation (C++, grrrrr…)

•Beaucoup de debuggage (pénible, gdb, mode texte)

•Beaucoup de messages d’erreur

•Un article en cours d’écriture

•Une réalisation logicielle (application au calcul du polynôme minimal de grandes matrices entières creuses dans Linbox), censée être présentée lors d’un Workshop dans un mois, mais pas finie !