2ISEOC Institut Supérieur d’Informatique
TD2 : Programmation des architectures MIMD à mémoire partagée
- openMP -
Exercice 1 : produit scalaire
On se propose de calculer un produit scalaire de deux vecteurs A et B de taille chacun 256.
Les valeurs de chaque vecteur sont définies par une boucle où les valeurs du vecteur A sont
définies par l’indice de la boucle pondéré par 0.5 et les valeurs du vecteur B sont définies par
l’indice de la boucle pondéré par 2. On veut calculer le produit scalaire dans un repère
orthonormal.
1. Donner le code C qui permet de calculer le produit scalaire d’une manière
séquentielle.
2. Donner le code C qui permet de calculer le produit scalaire avec l’API pthread.
3. Donner le code C qui permet de calculer le produit scalaire avec l’API openMP.
Exercice 2 : calcul de Pi
On se propose de calculer la valeur de π (rapport de la circonférence au diamètre d'un cercle=
: 3,14 15 92 653 589 793 238 4). Le code C séquentiel suivant permet de réaliser ce calcul. Il est
à noter que même pour 5 itérations, il donne une valeur qui commence bien par 3.14.
long num_steps = 100000;
double step;
void main()
{
int i; double x,pi,sum=0.0;
step = 1.0 / (double) num_steps;
for (i=1;i<=num_steps;i++)
{
x= (i+0.5)*step;
sum = sum + 4.0 / (1.0 + x*x);
}
pi += step * sum ;
}
1. Implémenter ce code et vérifier son bon fonctionnement.
2. Transformer le calcul de π séquentiel afin de le rendre parallèle avec openMP (pour 2
threads).
1
2ISEOC Institut Supérieur d’Informatique
Proposer trois solutions différentes :
- Une première solution qui permet de paralléliser la boucle for. Chaque thread
(décrit par un identificateur) exécute le même code et ce, sans l’utilisation de la
clause reduction et sans l’utilisation de la clause private.
- Une deuxième solution qui permet de paralléliser la boucle for en utilisant les
variables privées et les sections critiques.
- Une troisième solution qui permet qui parallélise toujours la boucle for mais cette
fois en utilisant en plus des variables privées la clause de réduction.
3. Mesurer le temps d’éxécution des trois solutions proposées. conclure.
Exercice 3 : Calcul de produit et de somme de deux matrices
On se propose de calculer le produit et la somme de deux matrices : C=A x B et D=A + B.
1. Proposer le code séquentiel correspondant sachant que les matrices sont carrées de taille
1000x1000 et que les éléments des matrices A et B sont définis comme suit :
a[i][j] = (i+1)+(j+1)
b[i][j] = (i+1)-(j+1)
2. Insérer les directives OpenMP appropriées pour paralléliser le calcul.
3. comment peut-on rajouter la clause nowait et aura elle des conséquences significatives sur
les performances du code ?
Exercice 4 : Amélioraton d’une contraste d’une image
On se propose de traiter une image afin d’améliorer son contraste (voir figure ci-dessous). Le contraste
permet de quantifier la différence de luminosité entre les parties claires et les parties sombres de
l’image. L’image est considérée aux niveaux de gris. On rappelle qu’une image aux niveaux de gris est
une matrice 2D [L][C]. On prendra L=1152 et C=2048. Les valeurs de cette matrice sont des nombres
entiers compris entre 0 et 255.
(a) Image avant traitement (b) Image après traitement
Figure : Amélioration du contraste
2
2ISEOC Institut Supérieur d’Informatique
Le programme permet de :
- allouer dynamiquement de la mémoire pour la matrice à traiter (matrice A) et pour la matrice obtenue
après traitement (matrice B) ; ne pas oublier de libérer les espaces réservés à la fin du programme pour
une meilleure gestion de la mémoire ;
- remplir la matrice A de valeurs aléatoires comprises entre 0 et 255 (qu’on supposera l’image à
traiter) ;
- déclarer et initialiser deux variables (max et min) qui vont contenir la valeur maximale et la valeur
minimale trouvées dans la matrice A et qui sont des variables nécessaires pour le calcul et
l’amélioration du constraste ;
- décalarer une variable de type float (Contraste) qui contiendra la valeur de constraste de l’image A ;
- fixer le nombre de threads à 2 et implémenter la région parallèle avec les directives de compliation
OpenMP ;
- mesurer le temps d’execution du programme et l’afficher.
La région parallème permet de :
- paralléliser une boucle for qui permet de chercher la valeur maximale (max) et minimale (min) dans
la matrice A. Utiliser la clause reduction pour la recherche de max. Utiliser une variable privée
(min_local) et une section critique pour la recherche de la valeur minimale. La section critique permet
de protéger l’accès à la valeur min qui est une variable partagée entre tous les threads;
- sélectionner un seul thread pour l’affichage des valeurs max et min.
- paralléliser le calcul et l’affichage du contraste avec l’amélioration du constraste. Le
contraste de l’image initiale (matrice A) est une valeur qui se calcule selon la formule
suivante :
𝑐𝑜𝑛𝑡𝑟𝑎𝑠𝑡𝑒
Par contre l’amélioration du constraste permet de changer les valeurs de tous les pixels
comme suit :
255
𝑝 𝑝 𝑚𝑖𝑛
𝑚𝑎𝑥 𝑚𝑖𝑛
Avec pA est le pixel de la matrice A et pB est le pixel résultant après l’amélioration du constraste (pixel
de la matrice B).
Donner le programme qui permet d’implémenter ce calcul en rajoutant les directives openMP.
3
2ISEOC Institut Supérieur d’Informatique
Exercice 5 : analyse et traitement d’images
On se propose d’analyser et de traiter deux séries de N images chacune (N=24). Les images
sont considérées aux niveaux de gris. Une image aux niveaux de gris consiste à une matrice
2D [L][C] avec L=1152 et C=2048.
On suppose qu’on dispose de deux cœurs logiques (threads) sur notre plateforme cible.
Le programme à développer permet de :
- définir deux tableaux de matrices de taille N. Les différentes valeurs des matrices sont
définies aléatoirement entre 0 et 255.
- effectuer le traitement du premier tableau en parallèle avec l’affichage du message « thread
n°… : bonjour de la 1ere section ».
- effectuer le traitement du second tableau en parallèle avec l’affichage du message « thread
n°… : bonjour de la 2eme section ».
Le traitement des matrices consiste à :
- afficher le message « thread n°… : traitement de la 1ere série d’images ».
- calculer la moyenne des différentes valeurs de chaque matrice et la stocker dans une case
d’un tableau de taille N (tableau qui va contenir les moyennes de toutes les matrices). La
moyenne permet de définir la luminosité de l’image.
- calculer les écart-types des images selon la formule suivante et les stocker dans un tableau
de taille N. L’écart-type permet de définir le constraste de l’image (quantifier les écarts par
rapport à la moyenne).
1
𝐶 𝑀 𝑖, 𝑗 𝑀𝑜𝑦
𝐿. 𝐶
-réaliser le seuillage de l’image. Le seuillage permet de transformer une image aux niveaux de
gris à une image dont les valeurs de pixels ne peuvent avoir que les valeurs 255 (blanc) ou 0
(noir). Le seuil est égale à 123.
1. Proposer le code parallèle correspondant et mesurer le temps d’exécution.
2. comment peut-on rajouter la clause nowait et aura elle des conséquences significatives
sur les performances du code ?