Présentation rapide d’

Slides:



Advertisements
Présentations similaires
L’INFORMATIQUE Mihalcea Cezar.
Advertisements

Premier programme en C :
Introduction au Langage C,C++
Architecture de machines Le microprocesseur
Frédéric Gava JFLA2006 Une implantation de la juxtaposition parallèle.
Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.
1 HPC et Windows 2003 CCS pour les développeurs Visual Studio 2005.
1 Bauer Kevin Les processeur Un processeur puisant? « oui mais pour quel utilisation. »
Objectif de l’exposé.
la programmation en langage C
Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.
Bibliothèques Scientifiques
D. Defour, B. Goossens, D. Parello A quoi servent les registres? D. Defour, B. Goossens et D. Parello.
Modèle polyédrique: fondements et application à la parallélisation de programmes réguliers Tanguy Risset DIF 2001/2002.
Les fonctions en Java Partie I Le type void. Dans cette rapide présentation, je vais expliquer :.à quoi servent les fonctions.à quoi faut-il penser avant.
Architecture de machines Le microprocesseur
CYCLE 6 : FONCTIONS FONCTIONS avec paramètres en Entrée 1- Pourquoi les FONCTIONS peuvent échanger des données en E entre elles ? 2- Comment écrire des.
1)Boucle for 2)Boucle while
1 Une introduction à Java IFT 287 (Semaine 1). 2 Java - Historique Développé par Sun Microsystems en 1994 –Inventeur James Gosling (canadien!) Objectif.
Programmation de cartes graphiques
Efficient Code Generation for Automatic Parallelization and
Programme et Langage C++
Approche mémoire partagée Threads – Paradigme de lapproche – Objets exécutés par les processeurs threads vs processus, – un thread possède : Ses registres,
Optimisation et parallélisation de code pour processeur à instructions SIMD multimedia François Ferrand.
Bases de la programmation en C++
Algorithmique et Programmation
Les systèmes multiprocesseurs Ph. Sèvre le 19/12/08.
Franck Cappello CNRS, LRI, Université Paris-sud
Amorçage des compilateurs Un compilateur est un programme écrit dans un langage Peut-il être écrit dans le langage cible ? dans le langage source ? comment.
Les systèmes multiplateformes
LIFI-Java 2004 Séance du Jeudi 9 sept. Cours 1. La notion de langage Décrire une tâche à effectuer –programme Écrire à un haut niveau –facile pour lutilisateur.
Calcul parallèle haute performance dans CAST3M
Parallel Programming in C with MPI and OpenMP
Chap. 2 - Structure d’un ordinateur
Séminaire DEN/DSOE/Simulation sur le calcul hautes performances: le 7 novembre /17 Numerical Platon Contexte –outil daide aux développements de codes.
La librairie assert.h.
Lycée ELKHAWARIZMI De SAFI
Importance du réseau dans des architectures MIMD Tout échange entre les processeurs nécessite un transfert de données via le réseau.
Programmer en langage c
SYSTEMES D’EXPLOITATION
Cours Architecture des Systèmes Informatiques
Cours 1 1 Java. Cours 1 2 Plan général 1.Introduction 2.Les types primitifs, évaluation d’expressions 3.Instructions for, if…. 4.Introduction de l’objet,
Optimisation des performances
PROJET CAPS Compilation, Architecture, Processeurs Superscalaires et Spécialisées.
ALGORITHMIQUE ET PROGRAMMATION C
8INF856 Programmation sur architectures parallèles
ARPO: architecture des processeurs superscalaires,VLIW et optimisation André Seznec et François Bodin.
Programmation parallèle
PARALLÉLISATION AUTOMATIQUE D’ALGORITHMES
Programmation Système et Réseau
PROJET CAPS Compilation, Architecture, Parallélisme et Système.
Projet de Fin d’Etudes – Optimisation SSE 1/28. 1) Présentation du Stage 2) Les instructions SSE 3) Algorithme DSP Audio Conclusion 2/28 Projet de Fin.
1 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Jean-Jacques Girardot
ISBN Chapitre 10 L'implémentation des sous- programmes.
P ROJET D ’ INFORMATIQUE Fait par mélodie Lapointe-Bélanger Mélody Lapierre Sytaïna Vigneault.
Nous devons écrire un programme pour le microcontrôleur
PROJET CAPS Compilation, Architecture, Processeurs Superscalaires et Spécialisées.
INTRODUCTION à LA PROGRAMMATION
ARPO: architecture des processeurs superscalaires,VLIW et optimisation André Seznec et François Bodin.
IRISA/INRIA Les processeurs Alpha et ou comment Compaq espère mener la course en tête.
PROJET CAPS Compilation, Architecture, Parallélisme et Système.
UE MAREP Cours 12 : Révisions
Introduction aux architectures parallèles
Création et Optimisation de Modules Audio avec les instructions SSE
1 Matthieu GUIBERT Rodolphe DELLA NEGRA 1. Introduction, Concepts de base, Boucles. TP 2. Tableaux,structures,conditions, séquences, chaînes de caractères,
Lyon, 24/04/2007 Portage et déploiement de l'application Climat sur Eric Maisonnave.
Java Réalisé par: Mouna POKORA. PLAN: Définition : Historique: Caractéristiques: un langage orienté objet: un langage interprété : un langage portable:
Visual Information Solutions Multithreading. Visual Information Solutions Qu’est-ce que le multithreading ? Un thread est une partie des instructions.
Département Informatique L’optimisation Laurent JEANPIERRE IUT de CAEN – Campus 3.
Ecole Informatique 2010 La Programmation des Architectures Multi-cœurs Cécile Barbier Fatih Bellachia Alain Masserot.
Transcription de la présentation:

Présentation rapide d’ 1

OpenMP et la programmation multithread en mémoire partagée Plan OpenMP et la programmation multithread en mémoire partagée La programmation multithread OpenMP OpenMP en pratique Les directives de partage du travail Les directives de synchronisation La bibliothèque d’OpenMP OpenMP plus précisément… Implémentation pratique Le parallélisme imbriqué OpenMP2

OpenMP permet une parallelisation progressive des codes Contexte et intérêt d’OpenMP OpenMP est un standard de programmation multithread en mémoire partagée OpenMP est portable sur l’ensemble des calculateurs à mémoire partagée (développé et soutenue par des fabricants de machines et de compilateurs) OpenMP permet une parallelisation progressive des codes OpenMP est utilisable avec les langages Fortran (77,90,…), C et C++ Les compilateurs enrichissent les langages de programmation existants principalement par directives ( de partage de travail, de synchronisation ) plus quelques fonctions de la bibliothèque OpenMP

Contexte et intérêt d’OpenMP

OpenMP est une approche très simple de la programmation multi-treaded Contexte et intérêt d’OpenMP OpenMP est une approche très simple de la programmation multi-treaded Les nouveaux processeurs permettent d’utiliser plusieurs tread Intel Pentium IV Hypertreaming AMD Opteron 2XX 4XX 8XX sont des calculateurs parallèle à mémoire partagée Apparition de CPU multi-core IBM Power SUN UltraSPARc IV HP PA8800 Bientôt Opteron, pentium

La plus part des instructions OpemMP sont des directives Un programme simple en OpenMP La plus part des instructions OpemMP sont des directives Une des cibles d’OpenMP est la parallelisation des boucles OpenMP permet une approche incrémentale du parallélisme (peu de changement du code source) Programme séquentiel Programme parallèle void main() { double Res[1000]; for(int i=0;i<1000;i++) gros_calcul(Res[i]); } void main() { double Res[1000]; #pragma omp parallel for for(int i=0;i<1000;i++) gros_calcul(Res[i]); }

Introduction au modèle multithread en mémoire partagée OpenMP Partie 1 : OpenMp ? Introduction au modèle multithread en mémoire partagée OpenMP Structure d’un programme OpenMP Directives d’ouverture/fermeture de région parallèle HelloWorld_OpenMP.c

On dispose de n processeurs Multithreading en mémoire partagée Le problème : On dispose de n processeurs Ces machines sont connectées par un mécanisme de mémoire partagée entre eux  Comment utiliser cette machine à n processeurs reliés par de la mémoire partagée ? RAM (partagée) CPU

Une réponse : le multithreading en mémoire partagée Faire exécuter un processus qui va « spawner » des threads (flots d’exécution) sur chaque processeur Effectuer des échanges de données de façon transparente via la mémoire partagée Synchroniser explicitement au besoin, par exemple avec des verrous (locks) Le modèle le plus simple pour l’utilisateur paraît être d’ouvrir/fermer les sections parallèles en fonction des besoins et de la possibilité de paralléliser

OpenMP ‘Quasi’-standard développé et soutenu par les fabricants de machines, et de compilateurs But : spécifier une interface simple pour permettre la programmation parallèle en mémoire partagée à l’aide de threads Le modèle choisi repose sur des directives de compilation qui génèrent un code multithread En fait ces directives proviennent des directives constructeurs déjà présentes chez Cray, SGI, … et tous les autres fabricants de multiprocesseurs de grande taille Le but est de promouvoir la simplicité d’utilisation de telles machines (très coûteuses) via une interface simple d’utilisation

Les directives de compilation Utiliser un langage à directives revient à insérer des lignes de commandes dans le code du programme, et qui seront traitées par le pré-compilateur. Ces directives sont utilisées sur des régions structurées! (un point d’entrée, un point de sortie, uniques) Dans le cas d’OpenMP, un code C ou Fortran multithread est alors généré, puis compilé Les directives OpenMP sont des commentaires (permet de compiler avec/sans le support OpenMP), prenant la forme : C : #pragma omp <directive> [clause [clause ] … ] Fortran : !$OMP, C$OMP, *$OMP <directive> [clause [ clause ] … ]

Multithreading et parallélisme fork/join Structure d’un programme OpenMP Multithreading et parallélisme fork/join Un processus est lancé, qui « spawne » ensuite les threads lorsqu’une région parallèle est rencontrée La parallelisation peut être réalisée de façon incrémentale Région séquentielle Région parallèle multithread

!$OMP PARALLEL [CLAUSE [[,] CLAUSE] …] … !$OMP END PARALLEL C/C++ : Les régions parallèles La déclaration : Fortran : !$OMP PARALLEL [CLAUSE [[,] CLAUSE] …] … !$OMP END PARALLEL C/C++ : #pragma omp parallel { } Remarque : leurs portées ne ce limite pas au bloc mais également à toutes les procédures appelées dans le bloc parallèle double A[1000] #pragma omp parallel { int id = omp_get_thread_num(); fonc(id,A); }

Les régions parallèles La variable A est partagée par tout les threads double A[1000] fonc(0,A) fonc(1,A) fonc(3,A) printf("fin\n "); fonc(4,A) Tous les threads s’attendent ici (synchronisation de type barrière)

Notions élémentaires : variables partagées ou privées Partie 2 : OpenMP concrètement Notions élémentaires : variables partagées ou privées Directives de partage de travail Directives de synchronisation Fonctions de la bibliothèque Exemple concret : calcul de la trace d’une matrice carrée

Une variable partagée pourra être écrite et lue par tous les threads Des variables partagées et privées Une variable partagée pourra être écrite et lue par tous les threads Une variable est dite privée pour un thread si seulement lui peut la lire et l’écrire Les clauses SHARED ou PRIVATE permettent de préciser lors de l’ouverture de la région quelles variables sont partagées ou privées. Il est aussi possible de préciser la valeur par défaut (exemple : !$OMP PARALLEL DEFAULT(SHARED) ) Certaines variables sont privées par défaut. Exemple : les indices des boucles parallélisées avec les directives for/DO Les variables utilisées dans les fonctions appelées par les zones parallèles sont systématiquement privées!

La variable est privée pour chacun des threads SHARED Des variables partagées et privées PRIVATE La variable est privée pour chacun des threads SHARED La variable est partagée entre tous les threads FIRSTPRIVATE La variable est privée et prend la valeur qu’avait la variable du même nom sur le thread maître LASTPRIVATE La valeur en sortie de région parallèle est la copie de celle de la dernière itération en séquentiel THREADPRIVATE Utilisée pour préciser qu’une variable est privée (utile pour les variables globales)

Fortran : !$OMP DO / !$OMP END DO En pratique : La cible : distribution des boucles Une des cibles d’OpenMP : permettre de distribuer les itérations des boucles entre les différents threads Syntaxe : C : #pragma omp for Fortran : !$OMP DO / !$OMP END DO En pratique : #pragma omp parallel { #pragma omp for for (i=0; i<N; i++) … }

Ce comportement peut être changé en utilisant la clause NOWAIT La cible : distribution des boucles Par défaut, tous les threads s’arrêtent et attendent lorsque la fin de la boucle est atteinte (barrière de synchronisation explicite) Ce comportement peut être changé en utilisant la clause NOWAIT La façon dont les itérations sont distribuées entre les différents threads peut être modifiée via la clause schedule, ou via la variable d’environnement OMP_SCHEDULE static, taille : consiste a diviser les itérations en paquets d'une taille donnée (sauf peut-être pour le dernier) dynamic, taille : les itérations sont divisées en paquets de taille donnée. Sitôt qu'une tâche épuise ses itérations, un autre paquet lui est attribue guided, taille : les itérations sont divisées en paquets dont la taille décroît exponentiellement jusqu’à taille. runtime : le choix ce fait lors de l’exécution ordered : l’ordre de la boucle est respecté ( mode debug principalement )

Distribution du calcul La directive SECTION permet d’attribuer à chaque thread un bloc structuré différent (programmation MPMD : Multiple Program, Multiple Data) #pragma omp parallel #pragma omp sections { #pragma omp section section1… section2… section3… }

Utilisation (dans PARALLEL, DO/for, …) La clause de réduction Afin de permettre d’effectuer une opération globale sur les valeurs locales obtenues en sortie d’une région parallèle, on peut utiliser une clause de réduction Utilisation (dans PARALLEL, DO/for, …) REDUCTION (opération: liste de variables) Opérations disponibles: min, max +, -, * … int i; double z,res=0.0; double v[1000]; #pragma omp parallel for reduction(+:ps) private (z) for(i=0;i<1000;i++) { z = f(i) ; res = res + z ; }

Single / Master Ces directives permettent d’assurer que le code n’est exécute que par un seul thread Dans le cas de SINGLE, un seul thread (généralement le premier) procède à l’exécution de la zone considérée, les autres attendent ce thread a la fin du bloc SINGLE. La clause COPYPRIVATE permet de diffuser la valeur d’une liste de variables privées avant de sortir de cette région Dans le cas de MASTER, c’est toujours le thread maître (de rang 0) qui exécute cette tache. Il n’y a aucune synchronisation des threads avec cette directive.

Ce sont les directives: ATOMIC CRITICAL BARRIER FLUSH ORDERED Les synchronisations OpenMP possède des directives permettant de synchroniser les threads entre eux, ou du moins de contrôler plus finement le déroulement de l’exécution. Ce sont les directives: ATOMIC CRITICAL BARRIER FLUSH ORDERED

Les Instructions atomique x = x (op) exp avec (op) : +, -, *, /, etc Atomic / Critical Les directives ATOMIC et CRITICAL permettent de spécifier qu’un seul thread entrera à la fois dans la région suivant immédiatement la directive (l’ordre restant indéterminé) La différence réside dans le fait que ATOMIC se base principalement sur les instructions atomiques des processeurs, et correspond à une mise à jour de variable alors que CRITICAL englobe toute une partie de code (implémentation moins efficace) Les Instructions atomique x = x (op) exp avec (op) : +, -, *, /, etc x = f(x,exp) exp : une expression arithmétique indépendante de x Ces directives peuvent par exemple servir à effectuer une réduction « manuelle » en cours de calcul

Barrier / flush Barrier / Flush La directive BARRIER est une barrière de synchronisation : tous les threads l’atteignant attendront que les autres threads arrivent à la barrière avant de continuer l’exécution La directive FLUSH(variable) permet de rafraîchir la variable partagée variable visible de tous les processeurs. Elle est d'autant plus utile que la mémoire d'une machine est hiérarchisée. Elle peut servir à synchroniser

Ordered (plutôt en Debug) Dans une boucle parallélisée avec OMP DO/for, la directive ORDERED permet de s’assurer que l’ordre des opérations à l’intérieur de la zone de la directive sera exécutée dans l’ordre correspondant aux itérations de la boucle, comme dans le cas séquentiel. Ceci est utile principalement en mode debug.

omp_get_num_threads(), omp_get_tread_num() Des fonctions de la bibliothèque OpenMP Fonctions permettant de connaître le rang des différents threads ainsi que le nombre total de threads, omp_get_num_threads(), omp_get_tread_num() Synchronisation par des verrous omp_init_lock(), omp_set/unset_lock(), omp_test_lock()… Savoir si l’on est dans une zone parallèle ou pas omp_in_parallel() Mesurer le temps écoulé en seconde, avec quelle précision omp_get_wtime(), omp_get_wtick() …

Calcul de la trace d’une matrice An Exemple : Trace d’une matrice Calcul de la trace d’une matrice An Rappel : la trace d’une matrice est la somme des éléments de sa diagonale (matrice nécessairement carrée) Mathématiquement, on sait que : Immédiatement, on voit facilement que le problème peut être parallélisé en calculant la somme des éléments diagonaux sur plusieurs processeurs puis en utilisant une réduction pour calculer la trace globale

printf("La trace de A est : %f \n", traceA); Exemple : Trace d’une matrice #include <stdio.h> #include <omp.h> void main(int argc, char ** argv) { int me, np, root=0; int N; /* On suppose que N = m*np */ double A[N][N]; double traceA = 0; /* Initialisation de A */ /* … */ #pragma omp parallel default(shared) #pragma omp for reduction (+:trace) for (i=0; i<N; i++) traceA += A[i][i] } printf("La trace de A est : %f \n", traceA);

Note sur l’implémentation Le parallélisme imbriqué OpenMP2 Partie 3 : Notions avancées Note sur l’implémentation Le parallélisme imbriqué OpenMP2

Notes sur l’implémentation La création sémantique de multiples zones parallèles ne signifie pas forcement leur création réelle… Modèle abstrait Implémentation probable

Notes sur l’implémentation Le maître exécute le code séquentiel Le thread maître insère des taches dans la pile de taches Le thread maître exécute des taches de la pile. Si elle est vide, il attend la terminaison par les autres threads Le thread maître exécute le code séquentiel Un environnement possible d’exécution Les threads esclaves exécutent la boucle :{prendre une tâche dans la pile; exécuter la tâche}

Parallélisme imbriqué La notion de parallélisme imbriqué fait référence à la possibilité d’ouvrir une région parallèle à l’intérieur d’une région déjà parallèle Immédiatement, on peut voir les applications dans le cas de la parallelisation des nids de boucles, par exemple pour procéder ‘par blocs’ Toutefois, la plupart des compilateurs sérialisent les régions imbriquées, par manque de support au point de vue du système d’exploitation (en pratique, seules les NEC SX5 et les Compaq ES-40 permettent une telle approche)

Remarques OpenMP est avant tout un outil qui a pour but de procurer un mode de parallelisation attractif car incrémental et simple d’utilisation Il est avant tout promu par les constructeurs et les fabricants de compilateurs Se concentrant uniquement sur l’aspect de la parallelisation des taches, par rapport à d’autres outils comme HPF, des études en cours essaient d’y ajouter cet aspect de placement de données

Le site officiel du ‘standard’ OpenMP (en Anglais) Plus d’information => Le site officiel du ‘standard’ OpenMP (en Anglais) http://www.openmp.org Les cours de l’IDRIS (en Français) http://www.idris.fr/data/cours/parallel/openmp/