Equation d'Helmholtz 3D
Parallélisation de l'equation d'Helmholtz 3D par MPI et OpenMP
Equation modèle : problème de Helmholtz
L'équation de Helmholtz en trois dimensions d'espace est notre second problème.Le problème mathématique s'écrit :
avec
On construit le second membre f pour que u_ex(x,y,z) = x.y.z.(x-1).(y-1).(z-1) soit solution de cette équation.
La parallélisation est faite par décomposition de domaine avec MPI et aussi par partage du travail avec OpenMP.
La discrétisation spatiale est faite par un schéma aux différences finies d'ordre deux à trois points.
Le système discrétisé est :
La matrice du système linéaire, A, est l'opposée du laplacien discrétisé. Elle est alors symétrique et définie positive.
Les pas d'espace sont hx = 1/(ntx + 1), hy = 1 / (nty + 1) et hz = 1 / (ntz + 1).
Les deux méthodes itératives, Jacobi et Gradient Conjugué, sont employées pour chaque type de parallélisation.
Cas test
Le test est fait pour ntx = nty = ntz = 256.Le scalaire lambda vaut 1E-4.
Le critère d'arrêt pour Jacobi est : écart inférieur à 1E-10 ou 1000 itérations effectuées.
Le critère d'arrêt pour le Gradient Conjugué est : résidu inférieur à 1E-10 ou 1000 itérations effectuées.
Selon la méthode employé c'est l'une ou l'autre des conditions qui interrompt la méthode itérative.
Les codes parallèles sont lancés sur 2 et 4 processus.
Résultats code séquentiel
Les mesures du temps sont réalisées à l'intérieur du code.Le résidu correspond à la différence entre deux itérés successifs pour la méthode de Jacobi ou le vecteur résidu pour la méthode du Gradient Conjugué. L'erreur maximale correspond à l'erreur entre la solution calculée et la solution analytique connue.
| Code séquentiel | ||
| 1 processus | Jacobi | Gradient Conjugué |
| Nombre d'itérations | 609 | 135 |
| Résidu final | 0.9763E-10 | 0.8935E-10 |
| Erreur maximale | 0.3859E-08 | 0.4540E-13 |
| Temps écoulé (sec.) | 157.2 | 66.1 |
| MFlops | 779.9 | 514.3 |
Résultats sur 2 processus
Les mesures du temps sont réalisées à l'intérieur du code.Les performances sont évaluées en comptant le nombre d'opérations flottantes pour chaque processus.
L'accélération et l'efficacité se calculent à partir des temps du code séquentiel et du code parallèle considéré.
| Jacobi | Gradient Conjugué | |||
| 2 processus | OMP | MPI | OMP | MPI |
| Nombre d'itérations | 609 | 609 | 135 | 135 |
| Résidu final | 0.9763E-10 | 0.9963E-10 | 0.8935E-10 | 0.8935E-10 |
| Erreur maximale | 0.3859E-08 | 0.3859E-08 | 0.4539E-13 | 0.4539E-13 |
| Temps écoulé (sec.) | 87.0 | 71.5 | 42.7 | 34.7 |
| MFlops/processus | 704.7 | 857.7 | 397.6 | 489.5 |
| MFlops code | 1409.3 | 1715.3 | 795.1 | 979.0 |
| Accélération | 1.81 | 2.20 | 1.90 | 1.87 |
| Efficacité | 0.90 | 1.10 | 0.77 | 0.95 |
Résultats sur 4 processus
Les mesures du temps sont réalisées à l'intérieur du code.Les performances sont évaluées en comptant le nombre d'opérations flottantes pour chaque processus.
L'accélération et l'efficacité se calculent à partir des temps du code séquentiel et du code parallèle considéré.
| Jacobi | Gradient Conjugué | |||
| 4 processus | OMP | MPI | OMP | MPI |
| Nombre d'itérations | 609 | 609 | 135 | 135 |
| Résidu final | 0.9763E-10 | 0.9763E-10 | 0.8935E-10 | 0.8935E-10 |
| Erreur maximale | 0.3859E-08 | 0.3859E-08 | 0.4538E-13 | 0.4540E-13 |
| Temps écoulé (sec.) | 51.8 | 33.8 | 26.7 | 18.0 |
| MFlops/processus | 592.1 | 908.1 | 318.1 | 470.7 |
| MFlops code | 2368.5 | 3632.2 | 1272.6 | 1882.8 |
| Accélération | 3.03 | 3.56 | 2.48 | 3.67 |
| Efficacité | 0.76 | 0.89 | 0.62 | 0.92 |
Load-balancing pour la méthode de Jacobi
Tableau des performances détaillées pour OpenMP pour Jacobi :| OpenMP | 2 threads cumul |
4 threads cumul |
Rappel Séquentiel |
| Temps | |||
| calcul | 125.5 | 134.7 | 98.0 |
| converge | 44.3 | 54.5 | 58.5 |
Tableau des performances détaillées pour MPI pour Jacobi :
| MPI | 2 processus | 4 processus | Rappel Séquentiel | ||||||
| Temps | proc 0 | proc 1 | Cumul | proc 0 | proc 1 | proc 2 | proc 3 | Cumul | |
| calcul | 39.3 | 39.0 | 78.3 | 17.0 | 17.1 | 17.0 | 17.0 | 68.1 | 98.0 |
| converge | 29.9 | 29.7 | 59.5 | 15.1 | 15.1 | 15.1 | 15.0 | 60.3 | 58.8 |
Load-balancing pour le Gradient Conjugué
Tableau des performances détaillées pour OpenMP pour le Gradient Conjugué :| OpenMP | 2 threads cumul |
4 threads cumul |
Rappel Séquentiel |
| Temps | |||
| saxpy | 46.2 | 56.7 | 35.7 |
| pmv | 20.2 | 23.0 | 16.7 |
| prodscal | 16.3 | 19.7 | 12.7 |
Tableau des performances détaillées pour MPI pour le Gradient Conjugué :
| MPI | 2 processus | 4 processus | Rappel Séquentiel | ||||||
| Temps | proc 0 | proc 1 | Cumul | proc 0 | proc 1 | proc 2 | proc 3 | Cumul | |
| saxpy | 17.7 | 17.3 | 35.0 | 9.2 | 9.3 | 9.0 | 9.3 | 36.9 | 35.7 |
| pmv | 8.5 | 8.5 | 16.9 | 3.7 | 3.7 | 3.7 | 3.7 | 14.7 | 16.7 |
| prodscal | 7.6 | 7.7 | 15.2 | 4.3 | 4.4 | 4.5 | 4.4 | 17.4 | 12.7 |
Conclusions
- le Gradient Conjugué est nettement plus efficace que la méthode de Jacobi en nombre d'itérations mais il faut se rappeler que le coût par itération n'est pas le même;- les versions parallèles permettent d'obtenir des temps de retour plus courts que la version séquentielle du code avec des résultats qualitativement équivalents;
- le load-balancing est bon entre les différents processus même si le temps cumulé est parfois supérieur au temps de la même routine en séquentiel, notamment pour les versions OpenMP;
- La version MPI est en général plus performante car les données de chaque processus sont dans la mémoire locale, contrairement à la version OpenMP qui repose sur le partage (vision globale de données publique). Une version OpenMP basée sur les données locales est en cours de préparation afin de les comparer plus précisément.
- les mesures effectuées dépendent de l'état du système, de la charge de la machine et mais demeurent intéressantes pour les routines représentant une part significative du temps consommé.
Fichiers
On peut récupérer l'arborescence sous forme d'archive tar.gz .Les deux répertoires Jacobi et Gradient contiennent chacun les trois sous-répertoires MPI, OMP et SEQ (resp. version MPI, version OpenMP et version séquentielle).
Chacun de ses trois répertoires contient les répertoires suivants : src, bin et run (resp. code source, les binaires et les fichiers de résultats).
Dans le répertoire run se trouvent des sous-répertoires de la forme xp (x = 1, 2, 4) correspondant au nombre de processus. Ils contiennent les fichiers d'échantillonnage et les analyses qui en résultent. Ces fichiers ont servi à la réalisation des tableaux précédents.