Ce cours couvre les fondamentaux du parallélisme et de la distribution, incluant les concepts clés de programmation parallèle, l'algorithmique des systèmes distribués et la sémantique des modèles de calcul concurrent. Il aborde les architectures parallèles, les protocoles de synchronisation, la gestion des accès concurrents et les stratégies de répartition de charge. Ce PDF de 147 pages offre un tutoriel complet pour maîtriser la conception et l'optimisation d'applications parallèles et distribuées, en fournissant des exemples pratiques et des techniques avancées. Il s'adresse aux étudiants et professionnels souhaitant approfondir leurs compétences en calcul haute performance et en systèmes répartis.
Ce cours s'adresse aux étudiants en informatique de niveau avancé (licence 3 ou master), ainsi qu'aux professionnels souhaitant approfondir leurs connaissances en calcul parallèle et systèmes distribués. Une maîtrise des bases de la programmation (notamment en Java) et des concepts fondamentaux d'algorithmique est requise. Le cours convient également aux ingénieurs en informatique désireux de se spécialiser dans l'optimisation des performances ou le développement d'applications haute disponibilité.
Introduction générale aux enjeux du parallélisme et de la distribution, avec un aperçu historique de l'évolution des architectures multi-cœurs et des réseaux distribués. Présentation des défis actuels en termes de scalabilité et de performance.
Différences entre parallélisme (traitement simultané sur une même machine) et distribution (traitement réparti sur plusieurs machines). Métriques de performance : speedup, efficacité, surcoût de communication. Exemples concrets d'applications parallèles et distribuées.
Détail de l'API java.lang.Thread, états d'un thread (new, runnable, blocked, terminated). Synchronisation via synchronized, wait/notify, et les locks du package java.util.concurrent. Étude des problèmes classiques (interblocages, starvation) et bonnes pratiques.
Présentation du modèle théorique PRAM (EREW, CREW, CRCW) et son utilisation pour l'analyse d'algorithmes parallèles. Exemples d'algorithmes (somme préfixée, tri) et complexité en temps/logique.
Algorithmes de rendez-vous et d'élection (ex : algorithme de Peterson). Problèmes classiques (producteur-consommateur, lecteurs-rédacteurs) et solutions utilisant des sémaphores ou des moniteurs.
Implémentations matérielles (test-and-set, compare-and-swap) et logicielles (algorithmes de Dekker, Bakery). Preuves de correction (sûreté, vivacité). Impact sur les performances des caches (faux partage).
Ordonnancement statique vs dynamique. Algorithmes pour systèmes homogènes/hétérogènes (round-robin, work stealing). Théorie de l'ordonnancement (graphes de tâches, NP-complétude).
Protocoles de message passing (MPI, PVM). Routage dans les réseaux maillés (dimension ordering). Modèles de performance (latence, bande passante, modèle LogP).
Architecture RMI : stub, skeleton, registry. Sérialisation d'objets et gestion des exceptions distantes. Sécurité (politiques RMISecurityManager). Alternatives modernes (gRPC, REST).
Décomposition matricielle parallèle (LU, QR). Produit matriciel en blocs. Bibliothèques standards (BLAS, ScaLAPACK). Applications en machine learning distribué.
Techniques de réplication (état-machine, quorums). Consensus distribué (Paxos, Raft). Vérification formelle (model checking). Études de cas (bases de données distribuées, blockchains).
Le cours combine théorie (30%) et pratique (70%) via des TP sur machines multicœurs et clusters. Un projet final implémente une application distribuée réelle avec benchmarking. Évaluation par contrôle continu (projets) et examen final (analyse d'algorithmes).
Partner sites PDF Tutorials (English) | PDF Manuales (Spanish) | Cours PDF (French)