Vous êtes sur la page 1sur 2

FEI- Dept : Info USTHB, le 14 Janvier 2019

Sujet d’Examen (Calcul parallèle M2-RSD)

Exercice I.

I.1. Questions de cours :

 Comment mesure-t-on le « speedup » ?


 Qu’est que l’efficacité d’une application parallèle ?
 En désignant par α la portion du programme qui ne peut être parallélisée, que dit
Amdahl ? donner la borne supérieure de speedup ?
 Qu’est-ce qui caractérise une architecture NUMA?
 Quelle est le rôle de la fonction join() utilisée avec les threads en Java ? donnez un
exemple d’utilisation.
 L'exclusion mutuelle permet de résoudre les problèmes de synchronisations. Comment
faire pour réaliser ceci en Java ?
 Qu’est-ce qu’une directive OpenMP ?

I.2. Loi Amdahl

Soit le programme suivant :

int main () {
funcA(data); //fonction parallélisable
funcB(); //fonction ne peut être parallélisée
}

La fonction funcB s’exécute en 10 secondes et la fonction funcA s’exécute en 20 n secondes,


où n représente la taille des données data à traiter.
 calculez le speedup , théorique d’une version parallèle de ce programme avec la loi
d’Amdhal en supposant que la taille des données à traiter n est fixée à 4.
 Calculez le speedup , théorique d’une version parallèle de ce programme avec la loi
d’Amdhal en supposant que la taille des données à traiter n est fixée à 8.
 Que peut-on conclure ?

Exercice II. OpenMP

II.1. Soit le programme parallèle en OpenMP:

double calculate_pi(double step) {


int i ;
double x, sum = 0.0;
#pragma omp parallel for reduction(+: sum) private(x)
for ( i=0;i<1000000;++i) {
x = (i-0.5) * step;
sum += 2.0 / (1.0 + x*x);
}
return step * sum;
}

Écrivez une version équivalente de ce programme sans l'annotation de réduction.

1/1
II.2. Soit le code suivant parallélisé avec OpenMP. On suppose que le nombre de threads utilisé
est 4 threads (exportation OMP_NUM_THREADS = 4) et le nombre d’itérations iter = 16:

#pragma omp parallel for private(j)


for ( i = 0; i < iter ; ++i) {
for ( j = iter - (i+1); j < iter ; ++j) {
// Cette fonction a un temps de calcul de 2 secondes
compute_iteration(i, j , ...) ;
}

a) Pour la clause schedule de la directive for de OpenMP, expliquez brièvement la différence


entre les valeurs static et dynamic .
b) On suppose le cas d’une stratégie de répartition des itérations statique (la boucle avec
index i), schedule (static). Indiquez dans le tableau suivant quel thread exécute chaque
itération de la boucle et la durée de cette itération. Calculer le temps d'exécution
approximatif par thread et le temps total d'exécution.

# Iteration 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# thread 0
Temps (s) 2

c) On suppose maintenant le cas d’un ordonnancement dynamique de la boucle avec


(index i), schedule (dynamic, 2). Indiquez dans le tableau suivant quel thread exécute
chaque itération de la boucle et la durée de cette itération. Calculer le temps
d'exécution approximatif par thread et le temps total d'exécution.

# Iteration 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# thread 0
Temps (s) 2

d) Quelle est la stratégie de répartition des itérations qu’il serait préférable d’utiliser — static ou
dynamic justifier ?

Exercice III. Programmation – OpenMP - MPI en C:

Soit A une matrice carrée réelle de taille (n× n) où n est une donnée du problème. Ecrire un
programme parallèle où parmi p processus :

 Le processus 0 possède la matrice initiale A. Il joue le rôle de maître. Il distribue le travail sur
les autres processus dits esclaves.
 A chaque processus esclave de rang r (r≠0) est associé une partie de la matrice A (sous-
matrices) de taille nl (distribution équitable entre les processus esclaves);
 Chaque processus de rang r (r≠0) calcule le maximum dans sa partie. Ce calcul se fait en
parallèle en utilisant 3 threads par processus.
 le processus de rang 0 récupère tous les maximums calculés par les autres processus r (r≠0), et
ce pour calculer le maximum global de la matrice A. Il affiche le maximum global trouvé.

2/1

Vous aimerez peut-être aussi