8INF856 Programmation sur architectures parallèles
Contenu Motivations Notions élémentaires Méthode scientifique moderne Évolution des supercalculateurs Où trouver le parallélisme? Programmer un système parallèle
Qu’est-ce que le calcul parallèle? Résoudre un problème plus rapidement en utilisant plusieurs processeurs E.g. Multiplication matricielle: C = A X B Maintenant considéré comme une façon standard de résoudre des problèmes nécessitant une grande puissance de calcul.
Qu’est-ce qu’un ordinateur parallèle? Système informatique avec plusieurs processeurs supportant la programmation parallèle. 2 modèles possibles: Multiprocesseur centralisé: Mémoire partagée par tous les processeurs Multi-ordinateur: Mémoire locale à chaque processeurs Réseau d’interconnection
Qu’est-ce que la programmation parallèle? Programmation dans un langage permettant d’indiquer que certaines instructions peuvent être exécutées de façon simultanée sur différents processeurs. Problématiques: Partition du problème Synchronisation des processeurs Dépendences entre les tâches à réaliser Répartition du travail entre les processeurs
La programmation parallèle est-elle vraiment nécessaire? Alternative: Compilateur permettant d’extraire le parallélisme d’un programme conventionnel. La construction d’un tel compilateur pose des défis d’une très grande difficulté. L’accent est surtout mis sur la parallélisation des boucles Analyse de la dépendance Analyse du gain de performance
La programmation parallèle est-elle vraiment nécessaire? Exemple 1: int S=0; for (int i=0; i<N; i++) S = S + T[i]; Exemple 2: T[0]=0; T[1]=1; for (int i=2; i<=N; i++) T[i] = T[i-1] + T[i-2];
La programmation parallèle est-elle vraiment nécessaire? Conclusion: Il est souvent préférable d’utiliser un algorithme indiquant comment extraire le parallélisme d’un problème La programmation parallèle sert à exprimer un tel algorithme.
Langages parallèles Sur les machines à mémoire partagée, la programmation multithread est la méthode la plus utilisée. Problème: Difficile et sujet à erreurs. Alternatives: Langages ou API permettant d’utiliser le multithreading de façon transparente: Ex. Cilk et openMP
Langages parallèles Sur les machines à mémoire distribuée, on utilise généralement des langages permettant la transmission de message d’un processeur à un autre. MPI (Message Passing Interface) est une norme définissant une bibliothèque permettant le passage de message. Elle est utilisable avec C, C++, Java et Fortran.
Langages parallèles Cartes graphiques: de plus en plus utilisées pour effectuer du calcul GPGPU (General-purpose computing on graphics processing units) Cuda: extension des langages C, C++ et Fortran permettant de programmer des cartes NVIDIA seulement. OpenCL: Permet de programmer des systèmes parallèles hétérogènes.
Méthode scientifique classique Nature Observation Expérimentation physique Théorie
Méthode scientifique moderne Nature Observation Simulation numérique Experimentation physique Théorie
Quelques problèmes fondamentaux posant un défi à l’informatique Calcul de la structure électronique pour la fabrication de nouveaux matériaux Dynamique des fluides Prédiction météorologique Récupération efficace de l’huile Calcul pour comprendre la nature fondamentale de la matière Séquençage du génome humain Vision et reconnaissance de la parole Traitement de données massives (Big Data)
Évolution des supercalculateurs Supercalculateurs: Ce sont les ordinateurs les plus puissant qui existent Typiquement, ils coutent environs 10 millions de dollars US ou plus.
Évolution des supercalculateurs Deuxième guerre mondiale ENIAC: 350 multiplications par secondes Calcul balistique Guerre froide. Supercalculateurs utilisés pour: Conception des armes nucléaires Cryptanalyse
Eniac (350 op/s) 1946 - (U.S. Army photo)
Évolution des supercalculateurs Premier supercalculateur(1976): Cray-1 (architecture vectorielle) 100 millions d’opf par seconde Initialement utilisé uniquement par les gouvernement, puis par les grandes compagnies: Compagnies pétrolières Constructeurs automobiles Compagnies pharmaceutiques
Évolution des supercalculateurs Cosmic Cube (1981) 64 Intel 8086 5 à 10 Mega flops (Mega=million) 2 fois moins cher que le VAX 11/780 et 10 fois plus rapide. Développé par des chercheurs de Caltech nCube (1985) Une vingtaine de compagnies dans les années 80s presque toutes disparues à la fin des années 90s
Tianhe-2 : le plus puissant des supercalculateurs actuels (2014) 125 cabinets; 4 cases par cabinets; 16 panneaux par case; 2 nœuds par panneau; 195 cœurs par nœud.
Tianhe-2 : le plus puissant des supercalculateurs actuels Fabriqué en Chine par la National University of Defense Technology (NUDT) 33,86 pétaflops 16000 nœuds Chaque nœud possède 2 processeurs de 12 cœurs chacun et 3 co-processeurs de 57 cœurs chacun. Nombre total de cœurs: 3 120 000 Système d’exploitation: Linux Mega flops = 106 flops Giga = 109 = milliard (billion) Tera = 1012 = billion (trillion) Peta = 1015 = billiard (quadrillion) Top 500
IBM Sequoia: Le plus puissant des supercalculateurs actuels (2012)
IBM Sequoia: Le plus puissant des supercalculateurs actuels Fabriqué par la compagnie IBM 16,32 pétaflops 98304 processeurs de 8 ou 16 cœurs Nombre total de cœurs: 1 572 864 Système d’exploitation: Linux Mega flops = 106 flops Giga = 109 = milliard (billion) Tera = 1012 = billion (trillion) Peta = 1015 = billiard (quadrillion) Top 500
Où trouver le parallélisme? Parallélisme de données Parallélisme fonctionnel Pipelining
Parallélisme de données La même opération est effectuée en parallèle sur différentes données. La même opération (addition) est effectuée sur les 100 premiers éléments des tableaux b et c. Les additions peuvent être faites en parallèle. For i = 0 to 99 do a[i] = b[i] + c[i]
Parallélisme fonctionnel Différentes tâches appliquées à différentes données. Les lignes 3 et 4 peuvent être exécutées simultanément sur différents processeurs. a = 2 b = 3 x = f(a,b) y = g(a,b) m = max(x,y)
Pipelining Une tâche est divisée en plusieurs paliers Chaque palier est un processus obtenant son entrée du palier précédent Exemple en Unix: cat fichier | grep *.txt | sort | lpr Similaire à une ligne d’assemblage industrielle
Exemple: Cycle d’instructions utilisant la technique du pipeline
Programmer un système parallèle 4 alternatives: Compilateur étendu: traduire un programme séquentiel en programme parallèle Langage étendu: Ajouter des opération parallèles Ajouter une couche au dessus d’un langage séquentiel Définir un nouveau langage parallèle
Stratégie 1: Compilateur étendu (Avantages) Sauve du temps Ne requiert aucune formation pour les programmeurs Il est plus facile de programmer de façon séquentielle
Stratégie 1: Compilateur étendu (Désavantages) L’aide du programmeur est nécessaire pour extraire un maximum de parallélisme d’un problème La technologie actuelle ne fonctionne que dans des situations simple: boucle, etc. Le code résultant peut devenir complexe
Stratégie 2: Langage étendu On ajoute des fonctionalité à un langage existant Créer et terminer des processus parallèles Synchronisation nécessaire On doit permettre aux processus de communiquer Ex. MPI, PVM, Processus/thread, OpenMP
Statégie 2: Langage étendu (Avantages) Les compilateurs sont faciles à implémenter Grande flexibilité dû à l’accès à des fonctions de bas niveau Méthode très populaire donc portable
Statégie 2: Langage étendu (Désavantages) Aucune aide de la part du compilateur Programmes difficiles à déboguer
Stratégie 3: Ajouter une couche Couche inférieure Manipule sa part des données et sa partie des sorties Couche supérieure Création et synchronisation des processus Répartition des données entre les processus Le compilateur est responsable de traduire ces deux niveaux en code exécutable. Quelques prototypes existent. Par exemple: Computationally Oriented Display Environment (CODE). On peut classer OpenCL dans cette catégorie.
Stratégie 4: Nouveau langage Développer un langage entièrement nouveau Il en existe des dizaines Ajouter de nouvelles instructions à un langage existant: Fortran 90 High Performance Fortran C* Cilk
Stratégie 4: Nouveau langage Avantages Permet au programmeur d’indiquer au compilateur où se trouve le parallélisme Permet d’améliorer les performances Désavantages Requiert un nouveau compilateur Pas de standard Réticence des programmeurs.