View
61
Download
0
Category
Preview:
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
Citation preview
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 !
Recommended