Parallel Computing 1
Parallel Computing 1
COMPUTING
SPÉCIFIQUES
• Threads (Java, C, Python)
• OpenMP
À la fin du cours, l’étudiant sera capable de : • MPI
• Analyser un problème pour identifier son potentiel de parallélisation • GPU (CUDA / OpenCL - introduction)
DU CALCUL PARALLÈLE
3.3 Pipeline TD
• Chaque étape traite une partie
du flux
• Très utilisé en architecture
CPU
3. TYPES DE PARALLÉLISME 8
PERFORMANCES
Dans le calcul parallèle, l’objectif n’est pas seulement de :
• paralléliser un programme
• mais de gagner réellement en performance
PERFORMANCES
2. Speedup (l'accélération)
• S > 1 → amélioration
• S = p (idéal) → parfait
• S=1 : Aucun gain
4. MESURE DES
13
PERFORMANCES
3. Efficacité
Valeur Signification
E≈1 excellente utilisation
E<1 pertes (overhead)
Où: Exemple
• p = nombre de processeurs • S=4
• p=8
E = 0.5 (50%)
Donc, seulement la moitié des ressources est
utilisée efficacement
4. MESURE DES
14
PERFORMANCES
4. Scalabilité (Scalability)
Définition
Capacité d’un système à rester performant
quand on augmente les ressources
• Bonne scalabilité → performance
stable
Types • Mauvaise → saturation
Strong Scaling
• Taille du problème fixe
• On augmente les processeurs
Weak Scaling
• Taille du problème augmente avec les
processeurs
4. MESURE DES
15
PERFORMANCES
5. Coût du parallélisme
Définition
𝐶 = 𝑝 × 𝑇𝑝
𝟏
𝑺=
𝑷
𝟏−𝑷 +𝑵
• P : partie parallélisable
• N : nombre de processeurs
17
5. LOI D’AMDAHL
Nota:
Même avec beaucoup de
processeurs :
• la partie séquentielle bloque la
performance
Exemple :
• 90% parallèle → limite ≈ 10x
18
6. LOI DE GUSTAFSON
Principe
Contrairement à Amdahl :
• on augmente la taille du
problème
La loi de Gustafson (ou Gustafson's Formule
Law) est un principe de calcul 𝑆=𝑁− 1−𝑃 𝑁−1
parallèle formulé par John L.
Gustafson en 1988. Elle propose une
vision alternative à la loi d'Amdahl
pour évaluer la performance des
systèmes parallèles, soulignant que
les gains de vitesse dépendent de la
taille du problème, pas seulement de
la fraction séquentielle du
programme.
19
COMPARAISON AMDAHL VS GUSTAFSON
courbe de Gustafson
courbe d’Amdahl
Définition
Taille des tâches parallèles
GRANULARITÉ DU PARALLÉLISME 21
Impact
Trop de parallélisme ⇒ inefficacité
Formulation mathématique
𝑂𝑣𝑒𝑟ℎ𝑒𝑎𝑑 = 𝑝 × 𝑇𝑝 − 𝑇𝑠
•𝑇𝑠 :temps séquentiel
•𝑇𝑝 :temps parallèle
•𝑝: nombre de processeurs
23
9. DÉCOMPOSITION D’UN PROBLÈME
24
9. DÉCOMPOSITION D’UN PROBLÈME
Étapes
• Partitionnement
• Communication
• Synchronisation
• Agrégation des résultats
25
9. DÉCOMPOSITION D’UN PROBLÈME
Aider le compilateur à
paralléliser
Voici quelques conseils qui peuvent Pensez à utiliser les instructions sum, product, etc quand c'est
aider le compilateur: possible. Par exemple, écrivez
somme = sum(a)
1. Utilisez des instructions globales plutôt que
plutôt que des sommes sur les somme = 0 ;
indices. for (i = 1 ; i<= n ; i++) {
somme = somme + a(i);
Par exemple, écrivez : }
s = a + b ;
plutôt que
Si votre parc informatique vous permet de Comment faire si toutes les machines ne sont pas
lancer plusieurs exécutables en même identiques?
temps, vous pouvez paralléliser votre
problème en confiant à chaque machine Il faut éviter de confier aux machines les plus
les calculs correspondant à une partie de lentes trop de travail sous peine de devoir
ce problème. L'idée ici est de finalement les attendre. L'idée est de confier à
paralléliser la tâche à réaliser plutôt chaque machine la bonne quantité de travail,
que le programme lui-même. Ce afin qu'elles terminent toutes en même temps.
dernier en effet ne doit subir aucune
modification. Notons que l’affectation
des tâches aux processeurs pose un
problème d’ordonnancement.
28
9. DÉCOMPOSITION D’UN PROBLÈME
Répartir les données à
traiter
Comment faire si toutes les machines a. Modèle de distribution continue
ne sont pas identiques?
Pour fixer les choses, supposons que nos ayons 10 machines
Nous pouvons considérer les modèles supplémentaires, 3 fois plus lentes que les 20 premières. Nous
d’ordonnancement suivants : avons 100 calculs à réaliser, qui prennent une minute chacun
sur les machines les plus rapides et donc 3 minutes sur les
plus lentes. Soient N=100 le nombre de calculs à réaliser,
N1=20 le nombre d'ordinateurs rapides, N2=10 le nombre
d'ordinateurs lents. Appelons v1=3 la vitesse des machines
rapides et v2=1 la vitesse des machines lentes. On cherche le
nombre n1 de calculs à confier à chaque machine rapide et le
nombre n2 de calculs à confier à chaque machine lente.
Parallèle :
• division du tableau
• calcul partiel
• fusion
34
EXERCICES
Somme d’un tableau
Exercice 1 Exercice 2
Un programme a : Comparer :
• 80% parallélisable • parallélisme de données
• 4 processeurs • parallélisme de tâches
Calculer le speedup (Amdahl) avec exemples concrets
Exercice 3
Donner un exemple réel en RDC où le
calcul parallèle est utile
35
TRAVAUX PRATIQUES (TP)
ARCHITECTURES PARALLÈLES
parallèles
1. Introduction aux architectures
Définition avancée
Objectifs fondamentaux
ARCHITECTURES PARALLÈLES
2. Architectures parallèles
2.1 Classification de Michael J. Flynn
Principe
ARCHITECTURES PARALLÈLES
2. Architectures parallèles
2.1 Classification de Michael J. Flynn
Exemple :
Programme classique (séquentiel)
ARCHITECTURES PARALLÈLES
2. Architectures parallèles
2.1 Classification de Michael J. Flynn
Exemple :
• traitement d’image (pixels)
• GPU
CHAPITRE 2 :
40
ARCHITECTURES PARALLÈLES
2. Architectures parallèles
2.1 Classification de Michael J. Flynn
Rare :
• systèmes critiques (aéronautique)
CHAPITRE 2 :
41
ARCHITECTURES PARALLÈLES
2. Architectures parallèles
2.1 Classification de Michael J. Flynn
Exemple :
• multi-core
• clusters
CHAPITRE 2 :
42
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.2 Architecture à mémoire partagée (SMP: Symmetric MultiProcessing)
les processeurs sont connectés
par l’intermédiaire d’un RI à
une même mémoire qu’ils
partagent.
Types
• UMA: Uniform Memory
Access
• NUMA: Non-Uniform
Memory Access
Programmation simple
CHAPITRE 2 :
43
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.2 Architecture à mémoire partagée (SMP: Symmetric MultiProcessing)
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.3 Architecture à mémoire distribuée (MPP: Massively Parallel
Processing).
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.3 Architecture à mémoire distribuée (MPP: Massively Parallel
Processing).
Avantages
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.3 Architecture à mémoire distribuée (MPP: Massively Parallel
Processing).
Inconvénients
• Programmation complexe : il
faut gérer explicitement l’échange
de données entre processeurs.
• Temps de communication : les
échanges par le réseau sont plus
lents que l’accès à la mémoire
locale.
• Synchronisation difficile : il
faut s’assurer que les messages
arrivent au bon moment et dans
le bon ordre.
CHAPITRE 2 :
47
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.4 Architecture Hybride
Principe
• combinaison des deux modèles
Exemple
• cluster de machines multi-core
Chaque machine possède plusieurs cœurs partageant Message clé pour les étudiants :
une mémoire locale, et plusieurs machines sont Une architecture hybride combine
reliées entre elles par un réseau. OpenMP + MPI.
CHAPITRE 2 :
48
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.4 Architecture Hybride
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.4 Architecture Hybride
• Complexité de programmation
• Synchronisation complexe
• Débogage difficile
• Gestion mémoire complexe
• Coût matériel élevé
• Consommation énergétique
CHAPITRE 2 :
50
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.4 Architecture GPU (CUDA / OpenCL)
Un GPU (Graphics
Processing Unit) est un
processeur spécialisé conçu
pour exécuter un très grand
nombre d’opérations en
parallèle.
Contrairement au CPU, il
contient :
des centaines à des
milliers de cœurs
optimisés pour calcul
parallèle massif
CHAPITRE 2 :
51
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.4 Architecture GPU (CUDA / OpenCL)
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.4 Architecture GPU (CUDA / OpenCL)
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.4 Architecture GPU (CUDA / OpenCL)
Structure générale
Un GPU contient :
• Streaming Multiprocessors (SM)
• Mémoire partagée
• Mémoire globale
• Cache
CHAPITRE 2 :
54
ARCHITECTURES PARALLÈLES
3. Architectures mémoire
3.4 Architecture GPU (CUDA / OpenCL)
TP pour demain
PROGRAMMATION MULTI-
THREAD
Navigateur Web :
• Thread 1: chargement page
• Thread 2: lecture vidéo
• Thread 3: téléchargement
CHAPITRE 3 : 56
PROGRAMMATION MULTI-
THREAD
2. Processus vs Thread
Définition Processus
Un processus est un
programme en cours
d’exécution.
Différences principales
PROGRAMMATION MULTI-
THREAD
using [Link];
Rôle
PROGRAMMATION MULTI-
THREAD
using [Link];
Exemple
using System;
using [Link];
class Program
{
static void Main()
{
[Link]("Multithreading
activé");
}
}
CHAPITRE 3 : 59
PROGRAMMATION MULTI-
THREAD
PROGRAMMATION MULTI-
THREAD
class Program
{
static void Travail()
{
[Link]("Thread actif");
}
[Link]();
[Link]("Main actif");
}
}
CHAPITRE 3 : 61
PROGRAMMATION MULTI-
THREAD
Exemple
ThreadStart ts = new ThreadStart(Travail);
Thread t = new Thread(ts);
[Link]();
CHAPITRE 3 : 62
PROGRAMMATION MULTI-
THREAD
Exemple
PROGRAMMATION MULTI-
THREAD
Syntaxe
PROGRAMMATION MULTI-
THREAD
Syntaxe
[Link]();
[Link]("Thread
autorisé");
[Link]();
CHAPITRE 3 : 65
PROGRAMMATION MULTI-
THREAD
Syntaxe
[Link](verrou);
[Link]("Section
critique");
[Link](verrou);
CHAPITRE 3 : 66
PROGRAMMATION MULTI-
THREAD
PROGRAMMATION MULTI-
THREAD
PROGRAMMATION MULTI-
THREAD
PROGRAMMATION MULTI-
THREAD
5. Multithreading et performance
CHAPITRE 3 : 70
PROGRAMMATION MULTI-
THREAD
5. Multithreading et performance
Déterminisme d’un système de tâches
Soit, par exemple, deux processus qui accèdent sans contrôle à une même
cellule mémoire M, contenant la valeur 10, le premier pour y ajouter 5, le
deuxième pour doubler la valeur contenue dans M.
PROGRAMMATION MULTI-
THREAD
5. Multithreading et performance
CHAPITRE 3 : 72
PROGRAMMATION MULTI-
THREAD
5. Multithreading et performance
CHAPITRE 3 : 73
PROGRAMMATION MULTI-
THREAD
5. Multithreading et performance
CHAPITRE 3 : 76
PROGRAMMATION MULTI-
THREAD
using System;
Exemple applicatif
5. Multithreading et performance
using [Link];
Somme parallèle d’un tableau class Program
{
static void Main()
{
int[] tab = {1,2,3,4,5};
int somme = 0;
[Link](somme);
}
}
CHAPITRE 3 : 77
PROGRAMMATION MULTI-
THREAD
Exemple applicatif
5. Multithreading et performance
Simulation de téléchargement
[Link]();
[Link]();
CHAPITRE 4 :
PROGRAMMATION AVEC
78
OPENMP
1. Définition
2. Principe de base
OpenMP divise l’exécution d’un programme en plusieurs threads
(lignes d’exécution parallèles) qui partagent la même mémoire.
CHAPITRE 4 :
PROGRAMMATION AVEC
79
OPENMP
Modèle d'exécution
OPENMP
3. Étapes du développement parallèle avec OpenMP
Étape Description
Identifier les parties parallélisables du
1. Analyse du problème
code.
Déterminer les variables partagées et
2. Définition des données
privées.
3. Ajout des directives Utiliser #pragma omp pour activer le
OpenMP parallélisme.
Utiliser les mécanismes de verrouillage
4. Synchronisation
et de réduction.
5. Vérification & Comparer les performances
optimisation séquentielles et parallèles.
CHAPITRE 4 :
PROGRAMMATION AVEC
81
OPENMP
4. Directives de base OpenMP
• Directive #pragma omp parallel
#include <stdio.h>
#include <omp.h>
int main() {
#pragma omp parallel
{
int id = omp_get_thread_num(); // Récupère l'ID du thread
printf("Hello depuis le thread %d\n", id);
}
return 0;
}
CHAPITRE 4 :
PROGRAMMATION AVEC
82
OPENMP
4. Directives de base OpenMP
OPENMP
4. Directives de base OpenMP
• Directive #pragma omp sections
OPENMP
4. Directives de base OpenMP
• Directive #pragma omp single
Exécute un bloc par un seul thread.
OPENMP
Le Problème des Conditions de Course (Race Conditions)
A. La Clause reduction
(La plus performante)
int somme = 0;
Elle crée une copie privée #pragma omp parallel for
par thread, puis combine reduction(+:somme)
les résultats à la fin de for (int i = 0; i < 100; i++) {
manière sécurisée. somme += i;
}
CHAPITRE 4 :
PROGRAMMATION AVEC
86
OPENMP
A. La Clause reduction (La plus performante)
OPENMP
B. La Directive critical
OPENMP
5. Gestion des variables
Les variables sont définies comme privée, globale, etc. comme
nous le démontrons ci-après:
Syntaxe Signification
shared(var) Variable partagée entre tous les threads
private(var) Chaque thread possède sa copie locale
firstprivate(var) Copie initialisée à la valeur du maître
reduction(op:var
Combine les résultats (somme, min, max, etc.)
)
CHAPITRE 4 :
PROGRAMMATION AVEC
89
OPENMP
moyenne /= 1000;
printf("Moyenne = %f\n", moyenne);
return 0;
}
CHAPITRE 4 :
PROGRAMMATION AVEC
91
OPENMP
6. Contrôle du parallélisme
Les variables sont définies comme privée, globale, etc. comme
nous le démontrons ci-après:
OPENMP
7. L'Ordonnancement (Scheduling)
OPENMP
Exercice d'Application : Produit Matrice-Vecteur
Voici comment structurer un calcul complexe :
#pragma omp parallel for private(j) shared(A, x, y, n)
for (i = 0; i < n; i++) {
y[i] = 0.0;
for (j = 0; j < n; j++) {
y[i] += A[i][j] * x[j];
}
}
Analyse technique :
OPENMP
Compilation et Exécution
#include <stdio.h>
1) Préparer le test (code #include <omp.h>
printf("omp_get_max_threads() = %d\n",
omp_get_max_threads());
return 0;
}
CHAPITRE 4 :
PROGRAMMATION AVEC
95
OPENMP
Compilation et Exécution
OPENMP
Compilation et Exécution
Étapes :
[Link] Dev-C++.
[Link]ée un Nouveau → Project → Console Application → C Project (ou C++ si tu veux).
Donne un nom et enregistre.
[Link] le fichier source et écris ton code sources.
[Link] dans le menu Project → Project Options... (ou Project → Parameters selon la version).
[Link] Parameters (Paramètres) :
1. Dans la zone Compiler (ou Compiler Options → Add to command line), ajoute
exactement :
2.-fopenmp
3. Dans la zone Linker (Linker Options), normalement rien d’autre à ajouter ; -
fopenmp suffit généralement (le compilateur ajoute automatiquement -lgomp au
linking). Si tu as un lien manquant, ajoute :
4.-lgomp
[Link] sur OK
CHAPITRE 4 :
PROGRAMMATION AVEC
97
OPENMP
Compilation et Exécution
Compiler et exécuter
Dans Dev-C++ clique Compile → Compile & Run (F9) ou l’icône de compilation.
OPENMP
Exemple #include <stdio.h>
#include <omp.h>
Ecrire un programme
int main() {
parallèle en C qui fait
long N = 1000000;
la somme d’un vecteur double sum = 0.0, data[N];
contenant les entiers.
for (long i = 0; i < N; i++)
data[i] = i;
Questions :
1. Si le programme est exécuté avec 2 threads (ID 0 et 1), quelles seront les valeurs affichées par chaque
thread pour a et b ? Justifiez.
2. Pourquoi l'utilisation de la variable c dans ce bloc est-elle dangereuse ? Quel phénomène risque de se
produire ?
3. Quelle sera la valeur finale de a après la zone parallèle ?
CHAPITRE 4 : PROGRAMMATION100
AVEC OPENMP
Exercices
Exercice 2
On souhaite calculer le produit scalaire de deux vecteurs U et V de
taille N. Le produit scalaire est défini par :
Boucle B :
for (i = 1; i < N; i++) {
A[i] = A[i-1] + B[i];
}
Questions :
1. Laquelle de ces boucles peut être parallélisée directement avec #pragma omp parallel for ?
2. Expliquez pourquoi l'autre boucle pose problème en termes de dépendance de données (RAW - Read
After Write).
3. Que se passerait-il si on forçait quand même la parallélisation de la boucle B ?
CHAPITRE 4 : PROGRAMMATION102
AVEC OPENMP
Exercices
Exercice 4
Vous devez traiter une boucle où le temps de calcul de chaque itération est très
variable.
Par exemple :
• L'itération i=0 prend 1ms.
• L'itération i=100 prend 500ms.
#pragma omp parallel for schedule(______)
for (i = 0; i < N; i++) {
calcul_tres_long_et_variable(i);
}
Questions :
1. Si vous utilisez schedule(static), quel problème de performance risquez-vous de
rencontrer (phénomène d'équilibrage de charge) ?
2. Quelle option de schedule serait la plus appropriée ici pour maximiser l'utilisation des
cœurs ?
3. Expliquez le fonctionnement du mode dynamic.
MERCI
TSHIKUTU Bikengela Anaclet
PhD Student
attshituku@[Link]
TBA International