• Aucun résultat trouvé

Calcul parallèle : comparaison entre MPI et FFTW

Afin de comparer les capacités respectives de ces différents schémas à résoudre nu-mériquement les équations du modèle d’élasticité périodique proposé dans le chapitre 1, on introduit un dipole de dislocations et on laisse relaxer le système en utilisant les équations dynamiques 1.42. Les champs de contrainte σ12 obtenus après relaxation sont représentés sur la figure A.1. L’encart de chaque figure montre un zoom du champ de contrainte à longue distance. On peut noter que les différents schémas représentent le comportement du champ de contrainte de manière satisfaisante. Toutefois, pour les schémas 1 et 2, les contraintes près du cœur de la dislocation sont irrégulières et asymé-triques. De plus, même loin du cœur, les contraintes présentent une forme en dents de scie persistante. Ceci est également le cas pour les champs de déformation et de déplace-ment. Au contraire, les champs obtenus à partir du schéma numérique 3 sont réguliers et symétriques, proche et loin du cœur de la dislocation. Bien que nous n’ayons pas étudié de manière quantitative l’influence de ces champs en dent de scie sur l’évolution d’une population de dislocations, il est clair que l’utilisation du schéma 3 est préférable afin d’éviter tout artefact d’origine numérique.

A.3 Calcul parallèle : comparaison entre MPI et FFTW

Le calcul parallèle est devenu un élément incontournable de la programmation scien-tifique. On peut distinguer deux stratégies différentes pour effectuer la parallélisation d’un code de calcul. Une première consiste à paralléliser certaines étapes de calcul alors qu’une autre consiste à gérer les échanges entre plusieurs instances indépendantes d’un même programme. On propose ici de comparer ces deux approches dans le cas d’un exemple simple. On souhaite intégrer au cours du temps l’équation

˙φ= f(φ) + ∇2φ (A.6) où φ désigne un champ de phase et f(φ) est une fonction non linéaire prise égale à f(φ) = −(1−φ)(1−). Dans les deux approches, le champ φ est discrétisé sur une grille différences finies régulière.

A.3.1 Méthode 1 : Intégration semi-implicite et parallélisation en mémoire partagée

Une approche communément utilisée en champ de phases consiste à intégrer l’équation A.6 au moyen d’une intégration semi-implicite dans l’espace de Fourier (Chen 98, Bronchart 06, Gaubert 09, Cottura 13). Dans l’espace réciproque, le terme∇2φ est simple à calculer car la dérivation se traduit par la multiplication par un nombre complexe iq (voir annexe A.4). De plus, la linéarité du terme de gradient permet l’uti-lisation d’un algorithme semi-implicite et d’un pas de temps plus large que pour une intégration explicite. Cette technique se décompose en différentes étapes :

1. Calcul du terme non-linéaire à l’instant t : ˜ft = f(φt)

2. Calcul de sa transformée de Fourier : ˜ft =F(ft)

3. Dans l’espace réciproque, la discrétisation temporelle de l’équation A.6 peut s’écrire comme :

˜

φt+1φ˜t

dt = ˜ft−q2φt+1 (A.7)

On obtient finalement le champ φ à l’instant t+1 par :

˜

φt+1= φ˜t+ ˜ftdt

114 A. Annexes

4. Le champ φt+1 est obtenu par transformée de Fourier inverse.

Cet algorithme nécessite le calcul de deux transformées de Fourier par pas de temps, et ces deux étapes représentent environ 90% du temps de calcul total lorsque le pro-gramme est exécuté sur un seul processeur. Une parallélisation facile à implémenter consiste à utiliser les fonctions optimisées et pré-compilées FFTW1

multi-threads effec-tuant des transformées de Fourier sur plusieurs processeurs ayant accès au même espace mémoire. Finalement, les étapes 2 et 4 sont effectuées en parallèles alors que les étapes 1et 3 sont traitées séquentiellement, ce qui peut être représenté par le diagramme de la figure A.2. #1 #2 #1 #4 #1 #3

Etape 1 Etape 2 Etape 3

#2

#1 #4

#3

Etape 4

Figure A.2 – Diagramme représentant l’exécution d’un programme où certaines étapes de calcul (les transformées de Fourier) ont été parallélisées sur 4 processeurs.

A.3.2 Méthode 2 : parallélisation en mémoire distribuée

Une autre stratégie de parallélisation consiste à diviser le volume simulé en sous-domaines et d’attribuer chaque sous-domaine à un processeur (voir figure A.3.a). Les différents processus sont indépendants mis à part les échanges de données effectués aux endroits indiqués dans le programme. En particulier, les différents processus n’ont pas besoin d’accéder à un même espace mémoire, c’est pourquoi on parle de mémoire distribuée. #2 #1 #4 #3 (a) (b)

Figure A.3 – (a) Division en sous-domaines effectuée pour l’implémentation MPI ; chaque sous-domaine est pris en charge par un processeur (b) Diagramme représentant les échanges entre processus lors de l’exécution du programme parallélisé avec MPI

Le calcul de la transformée de Fourier d’un champ nécessite de connaître le champ sur tout le volume considéré. Ainsi l’utilisation de la stratégie d’intégration dans l’es-pace de Fourier nécessiterai l’échange de l’ensemble du champ φ entre les différents processus, ce qui serait très coûteux en temps comparé au gain que procure l’intégration semi-implicite. On réalise donc une intégration de l’équation A.6 dans l’espace direct. Le terme de gradient est calculé en différences finies entre le point d’intérêt et ses premiers voisins, ce qui nécessite d’accéder aux points des autres sous-domaines au niveau des

A.3. Calcul parallèle : comparaison entre MPI et FFTW 115

interfaces. Ainsi, à chaque pas de temps, les interfaces de chaque sous-domaine sont échangées entre les processus. Ceci est réalisé au moyen de la librairie MPI (Message Passing Interface) qui permet de synchroniser les échanges entre les différents proces-sus. La figure A.3.b représente un diagramme de l’exécution d’un programme ainsi parallélisé. L’intégration en temps est réalisée avec un schéma d’Euler explicite, ce qui nécessite l’utilisation d’un pas de temps réduit comparé à l’intégration semi-implicite.

A.3.3 Comparaison entre les deux stratégies

Afin de comparer ces deux approches, on effectue des simulations sur un système de dimensions 256×256×256dx3. Les codes sont exécutés sur des nœuds Intel X5650 constitués de deux processeurs de 6 cœurs de calcul chacun. Chaque processeur possède un banc-mémoire commun à tous les cœurs qui le constitue.

Étant donné que les pas de temps utilisés dans les deux approches diffèrent d’un facteur 5, on choisit de comparer les ressources nécessaires pour atteindre un même temps physique ˜t = 9500. Le temps d’exécution normalisé est représenté sur la figure A.4.

Figure A.4 – Temps d’excécution en fonction du nombre de cœurs alloué à chaque calcul : utilisation de l’intégration dans l’espace de Fourier faisant appel aux fonctions FFTW multi-threads (points rouges) et de l’intégration dans l’espace direct en divisant l’espace en sous-domaines (carrés bleus).

On remarque tout d’abord que, dans le cas où les codes sont exécutés sur un seul processeur, l’intégration dans l’espace de Fourrier (méthode 1) est environ 25% plus rapide que la technique utilisant MPI (méthode 2). Lorsque davantage de processeurs sont alloués à l’exécution du programme, la méthode 2 rattrape rapidement son retard et devient plus rapide que la méthode 1 pour un nombre de processeur N≥4. On peut remarquer que pour N > 6, le temps de calcul de la méthode 1 croît avec le nombre de processeurs. Ceci est directement relié à l’architecture des nœuds de calcul. Lorsque N>6, le calcul est effectué par les deux processeurs du nœud, ce qui oblige un transfert de données d’un processeur à l’autre, ce qui ralenti l’exécution du programme.

En revanche, la méthode 2 ne souffre pas d’un tel inconvénient car les différentes instances sont indépendantes les unes des autres et n’accèdent pas au même espace mé-moire. Ainsi, le temps de calcul décroit toujours avec N (pourvu que N soit supérieur au nombre de points d’intégration du maillage). On peut remarquer que la décrois-sance du temps de calcul en fonction du nombre de processeur n’est pas en 1/N. En d’autres termes, on ne divise pas le temps de calcul par 2 en prenant deux fois plus de processeurs. En effet, l’augmentation du nombre de processus conduit à une augmen-tation des échanges entre ces derniers, ce qui constitue une portion non négligeable du

116 A. Annexes

temps d’exécution. Une simple régression linéaire montre que le temps de calcul évolue comme 1/N0.8.

On peut souligner que le choix de la stratégie de parallélisation dépend de l’étude que l’on souhaite réaliser. Par exemple, si l’on souhaite lancer un grand nombre de fois un même programme qui s’exécute rapidement, la méthode 1 semble la plus adaptée car elle est plus rapide sur un processeur. En revanche, si on souhaite lancer quelques si-mulations de dimensions très larges, l’utilisation de la méthode 2 avec un grand nombre de processeurs permet d’aboutir à des résultats beaucoup plus rapidement.

Documents relatifs