Introduction à
OpenMP
Chargé de cours: Lévis Thériault
Département de génie logiciel et des TI
1
Sommaire
OpenMP et programmation en mémoire partagée
Programmation multithreads
Modèle fork/join
OpenMP (Open MultiProcessing)
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
OpenMP4
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 2
Modèle à mémoire partagée
Plusieurs processus
s’exécutent en parallèle
Processus attribués à des
processeurs distincts
Tâche 8 Tâche 1 Tâche 2
La mémoire est partagée
(physiquement ou
virtuellement) Tâche 7 Mémoire Partagée Tâche 3
Les communications entre
processeurs se font par Tâche 6 Tâche 5 Tâche 4
lectures et écritures dans la
mémoire partagée
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 3
Modèle à mémoire partagée
Particulièrement adapté aux architectures à
mémoire partagée (de type SIMD et MIMD)
Multiprocesseurs
Centralisés SMP (IBM SP3/SP4)
Distribués CC-NUMA (SGI Origin 3800)
2 principales représentations :
Threads
Fork/Join
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 4
Modèle de threads
Programme : ensemble de processus légers (threads)
qui coopèrent afin de réaliser un objectif commun
Thread : entité logique, fonction, correspondant à une
partie de programme
Pouvant s’exécuter indépendamment des autres parties
Pouvant s’exécuter de façon concurrente
Possédant des données locales et globales
Un programme écrit sous forme de threads peut être
exécuté séquentiellement
Pseudo-parallélisme
Partage du temps CPU entre les threads durant l’exécution
Changements de contexte
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 5
Modèle de threads
Ce même programme peut aussi être exécuté de façon
réellement parallèle
Répartition des threads sur les processeurs
Un ou plusieurs threads par processeur
Communication par les données globales stockées dans
la mémoire qui est partagée
Fonctionnalités pour
La gestion des threads (création, destruction, etc.)
L’ordonnancement et l’état des threads (actif, exécutable, en
exécution, en veille, etc.)
La synchronisation (sémaphores, barrières, etc.)
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 6
Modèle fork/join
Thread maître Thread maître
Exécution du code séquentiel
Débute et termine l’exécution Fork
Fork : création de threads esclaves
Threads esclaves Threads esclaves
Exécutent la portion parallèle
Join : destruction des esclaves et retour Join
du contrôle au maître Fork
Le nombre de threads peut varier
durant l’exécution
Permet la parallélisation
Join
incrémentale
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 7
Caractéristiques du modèle
Facilité de programmation - Transparence
Ressemble beaucoup au modèle séquentiel
Communications « indirectes » généralement plus faciles à gérer
que le passage de messages
La gestion des synchronisations doit se faire autrement
que par des messages
Régions critiques
Barrières
Sémaphores
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 8
Caractéristiques du modèle
Problème de localité des données
Structurer le code pour tirer profit des caches (si possible)
Exemple : inversion ligne/colonne d’une matrice
Efficacité non garantie
La transparence facilite la tâche du programmeur, mais
l’optimisation de la performance est plus difficile
L’organisation matérielle de la mémoire peut avoir un impact
important pour le même code sur 2 machines
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 9
Développement d’applications basées
sur le modèle à mémoire partagée
Principaux modèles de programmation
Programmation multithreads
Pthreads -> largement utilisé dans les bibliothèques des systèmes
de type UNIX
Java Threads -> extension du langage Java qui encapsule une
classe Thread
Programmation à mémoire partagée structurée (Structured
Shared-Memory Programming)
OpenMP
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 10
OpenMP
Ensemble d’outils permettant d’étendre des langages
séquentiels existants :
Directives de compilation
Appels de routines de bibliothèque
Variables d’environnement
API permettant d’exprimer un modèle de parallélisme à
mémoire partagée dans des programmes
1.0 –> C, C++, Oct. 1998, Fortran Oct. 1997
2.0 –> C, C++, Mars 2002, Fortran Nov. 2000
2.5 –> C, C++, Fortran, Mai 2005
3.0 –> Spécification, Mai 2008
3.1 –> Spécification, Juillet 2011
4.0 –> Spécification, Juillet 2013
Évolution d’OpenMP
[Link] (p.41)
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 11
OpenMP
Permet l’écriture de programmes portables sur la plupart
des multiprocesseurs
Le programmeur spécifie au compilateur et au système
les actions à faire pour exécuter un programme en
parallèle
Responsable de l’exactitude du programme (gestion des race
conditions, des synchronisations, etc.)
OpenMP != générateur de code parallèle
Permet d’écrire un seul programme pouvant être
exécuté de façon parallèle ou séquentielle
Parallélisme de type SPMD (Single Program Multiple
Data)
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 12
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
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 13
OpenMP
OpenMP: API (Application Programming
Interface) pour la programmation parallèle sur
les machines parallèles à mémoire partagée:
Directives au compilateur
Libraire de fonctions
OpenMP fonctionne en conjonction avec C, C++
et Fortran
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014
Développement de programmes en C
avec OpenMP
Parallélisme de type Fork-Join
Parties de code séquentielles
Parties de code parallèles (Régions parallèles)
Vision de la mémoire en 2 niveaux
Partagée -> Variables accessibles par tous les threads (shared)
Privée -> Variables locales aux threads (private, threadprivate)
Inclusion de la bibliothèque OpenMP
#include <openmp.h>
Format d’une directive de compilation :
#pragma omp nom-directive [clause[ [,] clause]…]
clause : composante additionnelle optionnelle
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 15
Structure d’un programme OpenMP
Multithreading et parallélisme fork/join
Un processus est lancé, qui reproduit ensuite les threads lorsqu’une
région parallèle est rencontrée
La parallélisation peut être réalisée de façon incrémentale
Région séquentielle
Région parallèle multithread
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 16
Ajustement de quelques paramètres
importants
Modifier le nombre de threads qui seront actifs dans les
régions parallèles du programme
Par la modification de la variable d’environnement
setenv OMP_NUM_THREADS
Par un appel à une routine à l’intérieur du programme
void omp_set_num_threads(int i);
Peut être modifié plusieurs fois durant une exécution
Obtenir le nombre de processeurs disponibles
int omp_get_num_procs (void)
Le système détermine ce nombre, peut être inférieur au nombre
réel de processeurs
Habituellement : nb threads = nb procs
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 17
Concept général
Un programme OpenMP est exécuté par un processus
unique.
Ce processus active des processus légers (Threads) à
l’entrée d’une région parallèle.
Chaque Threads exécute une tâche composée d’un
ensemble d’instructions.
Pendant l’exécution d’une tâche, une variable peut être
lue et/ou modifiée en mémoire.
Elle peut être définie dans la pile (stack) (espace
mémoire local) d’un Thread; on parle alors de variable
privée.
Elle peut être définie dans un espace à mémoire
partagée par tous les Threads; on parle alors de variable
partagée.
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014
Concept général
1 234
Un programme OpenMP est une Nombre de
alternance de régions séquentielles et tâches
parallèles.
Une région séquentielle est toujours
exécutée par la tâche maître.
Une région parallèle peut être
exécutée par plusieurs tâches à la
fois.
Les tâches peuvent se partager le
travail contenu dans la région
parallèle.
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014
Concept général
Le partage du travail consiste essentiellement à :
Exécuter une boucle par répartition des itérations entre les
tâches ;
Exécuter plusieurs sections de code mais une seule par tâche ;
Exécuter plusieurs occurrences de la même procédure par
différentes tâches (orphaning).
Sections parallèles Procédure parallèle
Boucle parallèle (orphaning)
(Looplevel
parallelism)
X=y+12;
Y=x+21
for i=0;… d=f(x);
g(x);
for i=0;…
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014
Structure d’OpenMP
Directives et clauses de compilation:
elles servent à définir le partage du travail, la synchronisation et le
statut privé ou partagé des données ;
elles sont considérées par le compilateur comme des lignes de
commentaires à moins de spécifier une option adéquate de
compilation pour qu’elles soient interprétées.
Fonctions et sous-programmes: ils font partie d’une
bibliothèque chargée de l’édition des liens du programme.
Variables d’environnement : une fois positionnées, leurs
valeurs sont prises en compte à l’exécution.
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014
Structure d’OpenMP
Programme
Compilation Directives
Édition de liens Bibliothèque
Variables
Exécution
d’environnement
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014
Boucles parallèles
Les boucles for:
for (i = first; i < size; i += prime)
marked[i] = 1;
Avec OpenMP, on peut facilement indiquer l’exécution
parallèle de la boucle
Le compilateur prend le soin de générer le code qui va
allouer les itérations aux Threads
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014
Pragma
« Pragmatic information »
Pragma: une directive au compilateur Fortran, C,
C++
Une façon de communiquer entre le
programmeur et le compilateur
Le compilateur est libre d’ignorer les pragmas
Syntax:
#pragma omp <rest of pragma>
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014
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 ] … ]
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 25
Directives de base
Ouverture d’une région parallèle
C : #pragma omp parallel []
Fortran : !$OMP PARALLEL[]
Fermeture de l’environnement parallèle
C : aucune : la région est englobée entre {}
Fortran : !$OMP END PARALLEL
Obtention du rang du thread (fonction de la bibliothèque)
C : omp_get_thread_num();
Fortran : omp_get_thread_num()
Obtention du nombre de processus (fonction de la bibliothèque)
C : omp_get_num_threads();
Fortran : omp_get_num_threads()
Choix du nombre de threads de la prochaine région parallèle (bibliothèque)
C : omp_set_num_threads(int nb_threads);
Fortran : call omp_set_num_threads(nb_threads)
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 26
Variables d’environnement OpenMP
Le comportement par défaut d’OpenMP peut être précisé par
l’utilisation de variables d’environnement
OMP_NUM_PROCS = nombre de threads qui seront lancés dans
chaque région parallèle
OMP_DYNAMIC = variation possible du nombre de threads suivant la
zone parallèle
OMP_SCHEDULE = contrôle de l’ordonnancement des boucles
OMP_NESTED = possibilité d’utiliser du parallélisme imbriqué
Toutes ces variables seront ignorées si des fonctions de la
bibliothèques équivalentes sont utilisées
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 27
HelloWorld_OpenMP.c
#include <stdio.h>
#include <omp.h>
void main(int argc, char ** argv) {
int rang, nprocs;
#pragma omp parallel private(rang, nprocs)
{
rang = omp_get_thread_num();
nprocs = omp_get_num_threads();
printf(“Bonjour, je suis %d (parmi %d threads)\n”, rang, nprocs);
}
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 28
OpenMP : notions de base
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
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 29
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!
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 30
Clauses de partage/privatisation
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)
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 31
Distribution des itérations des boucles
Une des cibles d’OpenMP : permet 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 parallel for
#pragma omp for for (i=0; i<N; i++) {
for (i=0; i<N; i++) { …
… }
}
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 32
Distribution des itérations 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 de
scheduling, ou via la variable d’environnement
OMP_SCHEDULE
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 33
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…
#pragma omp section
section2…
}
… suite du programme execute par tous
}
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 34
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, for/DO, …)
REDUCTION (opération: liste de variables)
Opérations disponibles:
min, max
+, -, *
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 35
Synchronisation
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
SINGLE
MASTER
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 36
ATOMIC / CRITICAL
Les directives ATOMIC et CRITICAL permettent de spécifier qu’un
et un seul thread entrera dans la région suivant immédiatement la
directive
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 sous-jacente probablement avec des
verrous)
Ces directives peuvent par exemple servir à effectuer une réduction
‘manuelle’ en cours de calcul
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 37
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 forcer la variable
partagée variable à être visible de tous les processeurs après une
mise à jour
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 38
ORDERED
Dans une boucle parallélisée avec OMP for/DO, 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
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 39
SINGLE / MASTER
Ces directives permettent d’assurer que le code n’est exécute que
par un seul thread
Dans le cas de SINGLE, c’est le premier thread qui atteint la zone
considérée qui procède à l’exécution
Dans le cas de MASTER, c’est toujours le thread maître (de rang 0)
qui exécute la tâche
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 40
Fonctions de la bibliothèque OMP
Outre les fonctions déjà évoquées permettant de connaître le rang
des différents threads ainsi que le nombre total de threads, la
bibliothèque OpenMP propose également plusieurs fonctions
Synchronisation par des verrous
omp_set/get_lock(), omp_test_lock()…
Savoir si l’on est dans une zone parallèle ou pas
omp_in_parallel()
…
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 41
Trace d’une matrice (1)
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)
n
Mathématiquement, on sait que : Trace( A) Ak , k
k 1
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
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 42
Trace d’une matrice (2)
#include <stdio.h> printf("La trace de A est : %f \n",
#include <omp.h> traceA);
}
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(+:traceA)
for (i=0; i<N; i++) {
traceA += A[i][i]
}
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 43
OpenMP : notions avancées
Notes sur l’implémentation
Parallélisme imbriqué (nested parallelism)
OpenMP2
OpenMP4
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 44
Notes sur l’implémentation (1)
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
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 45
Notes sur l’implémentation (2)
Le maître Le thread Le thread maître Le thread
exécute le maître insère exécute des tâches de maître
code des tâches la pile. Si elle est vide, il exécute le
séquentiel dans la pile attend la terminaison code
de tâches par les autres threads séquentiel
Un environnement possible d’exécution
Les threads esclaves exécutent la boucle : {prendre tâche dans la pile; exécuter la tâche}
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 46
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
parallélisation des nids de boucles, par exemple pour procéder ‘par
bloc’
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)
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 47
OpenMP2
OpenMP2 est une évolution d’OpenMP qui permet de faciliter
l’utilisation du langage par l’ajout de directives et/ou clauses
Tout particulièrement :
NUM_THREADS qui dans la déclaration d’une zone parallèle permet de
définir le nombre de threads qui seront utilisés
La clause de REDUCTION est étendue aux tableaux
Un principe d’affinité entre les zones parallèles est suggéré, afin que
deux zones successives utilisent les mêmes threads
Des fonctions de prise de temps (omp_get_wtime()) sont mises en
place
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 48
OpenMP4
Support pour différents dispositifs de calcul – omp target
Support pour les opérations SIMD – omp simd
Support pour la parallélisation de tâches – omp cancel
Localité et affinité des « threads » – omp_places
Autres modifications : ex. réductions définies par l’utilisateur
49 Hiver 2015 - Cours 05
Remarques et conclusion
OpenMP est avant tout un outil qui a pour but de
procurer un mode de parallélisation 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
parallélisation des tâches, par rapport à d’autres outils
comme HPF, des études en cours essaient d’y ajouter
cet aspect de placement de données
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 50
Sommaire
OpenMP -> mémoire Caractéristique OpenMP MPI
partagée -> fork/join
Souvent utilisé pour le
parallélisme de données, Utilisable sur les Oui Oui
multiprocesseurs
mais permet aussi le
parallélisme fonctionnel
Utilisable sur les multi- Non Oui
Relativement confortable ordinateurs
pour le programmeur
Les synchronisations Permet le parallélisme Oui Non
incrémental
doivent tout de même être
bien gérées
Codage supplémentaire minimal Oui Non
[Link]
Permet d’exploiter la mémoire Non Oui
directement
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 51
Quelques pointeurs
Le site officiel du ‘standard’ OpenMP (en Anglais)
[Link]
Les cours de l’IDRIS (en Français)
[Link]
[Link]
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 52
Référence
Krawezik, G. (2003). Présentation rapide de OpenMP.
LRI – Université de Paris Sud
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 53