Rapport - calmip

publicité
UTILISATEUR : Mr Olivier DUCASSE
Utilisation du supercalculateur Soleil dans le cadre de la thèse :
Modélisation électrodynamique d’un réacteur plasma hors équilibre de
dépollution des gaz
DIRECTEUR DE THESE : M. Olivier EICHWALD
RESUME DE LA THESE :
Cette thèse concerne la simulation des ondes d’ionisation (streamer) créées à la
pression atmosphérique entre une pointe et un plan dans les conditions expérimentales d’un
réacteur corona de dépollution des gaz d’échappement.
Un code informatique bidimensionnel (code 2D) a été mis au point en symétrie
cylindrique. Il résout, par la méthode des volumes finis, les équations fluides de continuité
relatives au bilan du nombre d’espèces chargées (électrons et ions), couplées à l’équation de
Poisson pour le calcul du champ électrique. La cinétique chimique prend en compte les
collisions entre espèces (ionisation, attachement, recombinaison), la photo ionisation, l’effet
photo électrique à la cathode et l’émission secondaire due au bombardement ionique. La
modélisation de la dynamique des particules chargées a été couplée à la modélisation de la
cinétique chimique des espèces radicalaires dans le but d’estimer la nature, la localisation et la
densité des radicaux formés durant la phase de décharge.
Une étude a été menée tout d’abord sur l’efficacité de plusieurs schémas numériques
d’ordre 2 pour la résolution de l’équation de continuité. Cet ouvrage a été réalisé dans les
conditions d’un test mathématique contraignant qui génère de forts gradients de densité en
mouvement dans un champ de vitesse fortement inhomogène. Ensuite, les schémas
numériques ont été appliqués à une simulation dite 1,5D de l’évolution d’un streamer. Les
performances du code 2D ont également été comparées avec un code de type éléments finis
développé à l’Université de Patras (Grèce), dans le cadre d’une collaboration inter
universitaire.
La confrontation des résultats de simulation avec ceux issus de l’expérience dans le
cas d’une décharge couronne pointe plan dans l’air et à la pression atmosphérique a
notamment conduit à l’estimation de la production des radicaux atomiques durant la phase de
décharge.
MOTS-CLES :
Dépollution par décharge couronne
Modélisation bidimensionnelle des streamers
Techniques numériques pour la résolution des équations elliptiques
Cinétique chimique
Concentrations des espèces radicalaires
Optimisation et parallélisation de code
DISCIPLINE : Physique et Ingénierie des Plasmas de décharge
LABORATOIRE : Centre de physique des Plasmas et de leur Applications de Toulouse
UMR 5002 CNRS – 118 route de Narbonne 31062 Toulouse cedex 9
Travaux réalisés dans le cadre du projet CALMIP :
Les durées de calcul nécessaires pour la première version du code étaient un élément
très pénalisant. Ainsi, la modélisation de la décharge pour un espace inter-électrode de 3mm
n’était pas envisageable (en dessous de 3mm il est très difficile d’avoir un régime stable de
streamer). En effet, la durée de calcul s’estimait à trois semaines pour que le streamer se
forme et se propage de la pointe jusqu’au plan (sans la phase de relaxation) ; la durée du
phénomène simulé était de 3ns, soit 1 semaine par nanoseconde. De plus, les courbes de
courant (expérimentales) de la décharge montraient des durées de phénomène de l’ordre de
cent nanosecondes (voir figure 5). Donc, la résolution du problème de durée de calcul
devenait primordiale. Face à cette difficulté, nous avons fait appel aux services du Centre
Interuniversitaire de Calcul de Toulouse (CICT) qui héberge le Supercalculateur « Soleil » du
groupement scientifique CALMIP (CALcul en MIdi-Pyrénées). Ainsi, nous avons diminué la
durée de calcul, à tel point que le code est maintenant capable de simuler une décharge
électrique dans un espace inter-électrode de 4mm sur une durée de 120ns, en environ 10
jours ; cette opération a demandé plus de 9 mois de travail. Ce paragraphe résume les
principales étapes de l’optimisation.
Optimisation des durées de calcul en agissant sur
l’agencement des lignes de code :
Cette première optimisation met en adéquation le code avec la manière dont le
processeur traite les informations. Cela concerne l’harmonie du complexe compilateur processeur. Par exemple, pour un calcul impliquant une matrice à deux dimensions (comme le
potentiel V(i,j)), le compilateur FORTRAN ordonne les valeurs du tableau dans la mémoire
du processeur colonne après colonne (indice j) (il fixe j et fait varier i). Dans ce cas, entre
l’indice de ligne (i) et l’indice de colonne (j), c’est l’indice de ligne qui varie le plus vite.
Ainsi, dans l’exemple de la figure 1, c’est la configuration (a) qui sera la plus rapide. Pour
quantifier le gain de temps, on mesure la durée d’un échantillon de 10000 itérations de
l’algorithme SOR (pour la résolution de l’équation de Poisson) respectivement traité dans les
configurations (a) et (b). Ce test est d’abord effectué sur le Supercalculateur Soleil du CICT.
On voit sur le tableau 1 que la succession j → i est plus rapide que celle i → j, mais la
variation est seulement de 3,7% (soit 5 secondes pour 10000 itérations). En effet, les
processeurs Itanium du Supercalculateur sont dotés d’une architecture optimisée pour le
calcul sur les nombres flottants (c'est-à-dire nombre réels) et sont donc très performant à la
base. De plus, les processeurs Itanium sont accompagnés d’un compilateur Intel spécialement
développé pour son architecture (il existe plusieurs versions de compilateur qui sont plus ou
moins performantes pour un problème donné). Cependant, on observe, toujours sur le tableau
1, qu’en utilisant l’option de compilation de niveau trois, on diminue la durée de calcul des
10000 itérations de SOR de 39% par rapport à la configuration initiale (l’augmentation de
l’ordre des options de compilation conduit à des exécutables de taille mémoire plus
importante mais optimisés pour le calcul). Le même test effectué sur le PC Xéon du groupe
avec un compilateur FORTRAN GNU réduit la durée de calcul d’un facteur 2 (diminution de
50% au lieu de 3,7%).
Pour j = 0 → nz
Pour i = 0→ nr
V(i,j)=A
Pour i = 0 → nr
Pour j = 0→ nz
V(i,j)=A
(b)
(a)
Figure 1 : Présentation de deux manières d’effectuer un calcul au sein d’une matrice. Le résultat
numérique est identique dans les deux cas mais les durées de calcul sont très différentes (cf. tableau 1).
Configuration
Boucles imbriquées i puis j
Boucles imbriquées j puis i
Boucles imbriquées i puis j avec option de
compilation de niveau 3
Boucles imbriquées j puis i avec option de
compilation de niveau 3
Durée (s)
135
130 (-3,7%)
108 (-20%)
82
(-39%)
Tableau 1 : Mise en évidence de l’ordre des boucles imbriquées, avec et sans option de compilation, sur la
consommation en temps. Mesures réalisées avec un processeur Itanuim II 1,5GHz et sur un échantillon de
10000 itérations de l’algorithme SOR.
Un autre phénomène sur lequel on joue, grâce à l’agencement des lignes de code, est
l’effet « pipeline ». Il s’agit, pour le système, d’utiliser au maximum ses ressources et de faire
en sorte qu’il n’y ai pas de temps mort au cours de chaque cycle du processeur (dans le
meilleur des cas, un cycle = un calcul et les calculs s’effectuent à la vitesse d’horloge du
calculateur qui fonctionne à X cycles par seconde). Par exemple, le déroulement des boucles
sur deux voir trois niveaux alimente le « pipeline » et améliore en conséquence la durée de
calcul. Ainsi, le déroulement sur deux niveaux (cf. figure 2), de la boucle initiale décrite sur la
figure 1a, diminue la durée de calcul de 42% et de 58% lorsque le déroulement est étendu à
deux puis trois niveaux (voir le tableau 2). Dans ce cas, les ressources du système sont
utilisées au mieux ce que l’on constate en observant sur le tableau 2 l’augmentation du flux
d’opérations (flop/s = floating operations per second).
Pour j = 0 → nz
Pour i = 0 → nr par pas de 2
V(i,j)=A
V(i+1,j)=A
Figure 2 : Présentation du déroulement (unrolling) sur deux niveaux de la boucle associée à la variable i.
Déroulement sur X niveaux
1
2
3
Durée pour 10000 itérations
(s)
82,6
48,0 (-42%)
34,9 (-58%)
Tableau 2 : Mise en évidence du déroulement des boucles sur le pipeline.
Flux d’opérations (Mflop/s)
1217
2037
2707
Parallélisation du code :
La parallélisation du code est la solution qui, après les premiers travaux d’optimisation
présentés ci-dessus, pousse davantage les performances en terme de consommation en temps.
Cependant, c’est un procédé qui a aussi ses limites. Le principe de la parallélisation est très
simple à comprendre ne serait-ce que par son nom évocateur. Il s’agit de répartir sur plusieurs
processeurs, le coût total normalement supporté par un seul. C’est ainsi que la vitesse de
calcul pourrait diminuer d’un facteur correspondant au nombre de processeurs mis en jeu.
Cependant, la loi de Amdahl limite cette tendance et montre qu’en pratique un code
parallélisé à 90% de son volume ne peut dépasser un accroissement de la vitesse d’un facteur
supérieur à 10.
Le projet de la thèse étant la construction d’un code pour la modélisation du
phénomène de décharge de type streamer et non pas la parallélisation du code, on a opté pour
une parallélisation simple à mettre en œuvre (donc peu coûteuse en temps d’investissement).
La parallélisation choisie qui respecte ce cahier des charges, tire partie de l’aspect Mémoire
Partagée du Supercalculateur Soleil hébergé au CICT. La mise en œuvre de la parallèlisation
s’est appuyée sur le procédé OpenMP (Mémoire Partagée). C’est un procédé très efficace à
moindre coût (en terme de modification du code). A l’origine, l’algorithme SOR n’est pas
conçu pour la parallélisation ; on a donc adopté, pour appliquer le procédé de parallélisation,
le schéma dit red and black [Pr-1] qui traite de manière indépendante le calcul du potentiel
d’un demi domaine à l’autre ; le domaine est découpé en un damier similaire à celui d’un jeu
d’échec.
Les résultats de la figure 3 illustrent les variations du gain en temps (obtenu grâce à la
parallélisation) en fonction du nombre de processeurs. Il s’agit de la durée totale consommée
pour effectuer 7000 pas de temps avec option de compilation de niveau trois et l’ensemble des
optimisations décrites dans les paragraphes précédents. On constate que la consommation en
monoprocesseur (on parle aussi de séquentiel) est de 9h42’ à 99%CPU, avec deux
processeurs, 2h46’ à 189%CPU et avec quatre processeurs 3h42’ à 306%CPU. Cet exemple
illustre bien le fait qu’on ne peut pas diminuer la durée de calcul par le simple fait
d’augmenter le nombre de processeurs. En effet, on note pour 4 processeurs, qu’il y a
quasiment 1 processeur qui ne travaille pas (306%CPU). Comme ce dernier coûte plus qu’il
ne rapporte, la durée globale augmente et cette configuration est donc à bannir.
On note aussi que le gain en temps, entre le fonctionnement séquentiel et biprocesseur
du code, est voisin d’un facteur 5. Cette valeur est en contradiction avec la règle, puisque le
facteur de gain en temps ne peut pas excéder le nombre de processeurs. Ce type d’accélération
sur-linéaire est souvent lié à des effets de mémoire cache. En effet, dans notre cas, la
consommation mémoire du problème est divisée en deux (biprocesseurs) ; ainsi chaque sous
problème a plus de chance de résider dans des zones mémoires à accès rapide (comme le
niveau de cache L1).
12
durée (h)
10
8
6
4
2
1
2
3
4
nombre de processeurs
Figure 3 : Influence du nombre de processeurs sur la durée de calcul pour 7000 itérations temporelles et
l’option de compilation de niveau 3. Le graphique montre que la décroissance de la durée de calcul n’est
pas forcément assurée par le simple fait d’augmenter le nombre de processeurs.
Au bilan, on réalise une estimation du gain en temps obtenu entre la première version
du code qui fonctionnait en monoprocesseur (Xeon 3,4GHz), sans optimisation, et la dernière
qui fonctionne en biprocesseur (Itanium II 1,5GHz). Le test est réalisé sur un échantillon de
1000 itérations temporelles pour la configuration pointe-plan avec un rayon de courbure de
20µm et une distance inter-électrode de 4mm. De plus, le nombre total de points de
discrétisation de l’espace géométrique est proche de 200000. Ainsi, la première version du
code consomme 31h26’ (1886min) à 99% CPU alors que la dernière ne consomme que 20min
à 183% CPU. Ainsi, au bout de neuf mois de travail, la durée de calcul a été diminuée de
98,9%.
La parallélisation du code sera poursuivit, toujours en collaboration avec le CICT, en
implantant le mode « par transfert de message » à l’aide de la librairie MPI (Message Passing
Interface). C’est une méthode plus lourde à mettre en œuvre et qui demande un réel savoir
faire, mais qui à terme donnera de meilleurs résultats par rapport à ceux obtenus avec
openMP.
[Pr-1]
[Du-1]
W. H. Press, S. A. Teukolsky, W. T. Vetterling, B. P. Flannery, « Numerical recipes in fortran
; the art of scientific computing », Cambridge university press, second edition.
O Ducasse, L Papageorghiou, O Eichwald, N Spyrou, M Yousfi, « Comparison of two model
with FVM and FEM : critical analysis », to be pubished, (2007).
Exemples de résultats issus du code 2D optimisé :
Figure 4 : Evolution du champ électrique en Townsend (Td) dans le plan de coupe (Orz). Instants : 20, 30,
45, 60, 90 et 130 ns.
140
130
données expérimentales
données du modèle x 10
120
110
intensite (mA)
100
90
80
70
60
50
40
30
20
10
0
0
10
20
30
40
50
60
70
80
90
100
110
temps (ns)
Figure 5 : Comparaison des formes de courant expérimentale et simulée sur 120ns.
120
Téléchargement