Accélérations algorithmiques pour la simulation numérique d’impacts de vagues. Modèles de type "roofline" pour la caractérisation des performances, application à la CFD

339 

Texte intégral

(1)

HAL Id: tel-01818089

https://tel.archives-ouvertes.fr/tel-01818089

Submitted on 18 Jun 2018

HAL is a multi-disciplinary open access

archive for the deposit and dissemination of sci-entific research documents, whether they are pub-lished or not. The documents may come from teaching and research institutions in France or abroad, or from public or private research centers.

L’archive ouverte pluridisciplinaire HAL, est destinée au dépôt et à la diffusion de documents scientifiques de niveau recherche, publiés ou non, émanant des établissements d’enseignement et de recherche français ou étrangers, des laboratoires publics ou privés.

numérique d’impacts de vagues. Modèles de type

”roofline” pour la caractérisation des performances,

application à la CFD

Ahmed Amine Mrabet

To cite this version:

Ahmed Amine Mrabet. Accélérations algorithmiques pour la simulation numérique d’impacts de

vagues. Modèles de type ”roofline” pour la caractérisation des performances, application à la

CFD. Modélisation et simulation. Université Paris Saclay (COmUE), 2018. Français. �NNT :

(2)

Thèse de doctorat

de

l’Université Paris-Saclay

préparée À

L’École Normale Supérieure de Cachan

(École Normale Supérieure Paris-Saclay)

École doctorale n

574

Mathématiques Hadamard (EDMH)

Spécialité de doctorat : Mathématiques appliquées

par

M. Ahmed Amine MRABET

Accélérations algorithmiques pour la simulation numérique

d’impacts de vagues. Modèles de type "roofline" pour la

caractérisation des performances, application à la CFD.

Thèse présentée et soutenue à Cachan–, le 15 mai 2018.

Composition du Jury :

M. vianney perchet Professeur des Universités (Président du jury) École Normale Supérieure Paris-Saclay

M. Fayssal Benkhaldoun Professeur des universités (Rapporteur) Université Paris 13

M. Christophe Calvin HdR, Ingénieur-Chercheur (Rapporteur) CEA CEN Saclay

M. Philippe Thierry Ingénieur (Directeur de thèse) Intel France

M. Jean-Michel Ghidaglia Professeur des universités (Directeur de thèse) École Normale Supérieure Paris-Saclay

M. Joris Costes Ingénieur (Examinateur) ArianeGroup

M. Daniel Bouche Directeur de Recherche (Examinateur) CEA DAM

M. laurent Brosset Ingénieur (Examinateur) Gaztransport & Technigaz

(3)
(4)

Remerciements

Je tiens à remercier en premier lieu mes deux directeurs de thèse Jean-Michel Ghidaglia et Philippe Thierry de m’avoir proposé de travailler sur des sujets passionnants et pour la qualité de leur enca-drement. Cette thèse n’aurait pas été possible sans leurs nombreux conseils et leur soutien. Je tiens à exprimer ma gratitude envers les personnes qui ont participé, de près ou de loin à ce travail.

J’adresse mes plus sincères remerciements à Fayssal Benkhaldoun et Christophe Calvin qui ont rapporté cette thèse, ainsi qu’à Joris Costes, Daniel BOUCHE, Laurent Brosset et Vianney Perchet pour leur participation au jury.

Je remercie aussi tout l’entourage professionnel auprès de qui j’ai passé ces trois années : toute l’équipe simulation des fluides réels au CMLA, l’équipe de l’entreprise EUROBIOS qui m’a hébergé pendant ma thèse, ainsi que l’équipe Energy Engineering Team chez Intel.

Au CMLA, je souhaite particulièrement remercier Mesdames Alvadomar, Brunetti, Pouchont, Mül-ler, Doucet pour leur remarquable gentillesse et leur efficacité.

Merci aussi à mes collègues de bureau avec qui j’ai échangé pendant cette thèse : Joris, David, Louis, Guillaume, Lei, Minh chien, Maxime, Jean-Philippe Jezebel, Jean-Charles, Emmanuel, Thibault, Marie, Mohammed, Matthieu.

Je remercie les membres de ma famille et mes amis qui m’ont accompagné pendant ces longues années, merci à Mathilde pour sa patience et son soutien.

(5)

Table des matières

1 Introduction générale et plan de la thèse 8

I Caractérisation et optimisation des applications sur les architectures multi

et many coeurs 10

2 Introduction au supercalculateurs 11

2.1 Les supercalculateurs : passé, présent et futur. . . 12

2.1.1 Taxonomie de Flynn . . . 12

2.1.2 Vers les processeurs multi-cœurs . . . 16

2.1.3 Accélérateurs massivement parallèles, co-processeurs . . . 23

2.2 Conclusion du chapitre . . . 32

3 Présentation des cas tests utilisés dans l’étude 33 3.1 Advection 2D . . . 34

3.1.1 Advection 2D : premier ordre en temps et en espace . . . 34

3.1.2 Implémentation . . . 36

3.1.3 advection 2D : second ordre en temps et en espace . . . 43

3.1.4 Cas tests . . . 45

3.1.5 Optimisations dans le code Advection 2D . . . 49

3.2 HPL : High-Performance LINPACK . . . 57

3.3 STREAM Triad . . . 57

4 Caractérisation et optimisation : Roofline et dynamique Roofline 58 4.1 Introduction . . . 59

4.2 Roofline scalaire . . . 61

4.2.1 Le modèle Roofline . . . 61

4.2.2 Le modèle : Cache Aware Roofline Model . . . 64

4.2.3 Comment compter les flops et les bytes. . . 69

4.2.4 Validation de EMON et SDE . . . 74

4.2.5 Validation du Roofline Scalaire . . . 76

4.2.6 Advection 2D . . . 78

4.3 Portage de code sur les coprocesseurs d’Intel . . . 87

4.3.1 Portage sur KNC (Knight Corner) . . . 87

4.3.2 Portage sur KNL (Knights Landing) . . . 92

4.4 Prototype temporel du Roofline : . . . 94

4.4.1 Roofline dynamique . . . 94

4.4.2 Roofline par blocs . . . 102

4.5 Vers une version commerciale du Roofline : Advisor . . . 105

4.5.1 Une première version avec Cache Aware Roofline . . . 105

(6)

II Couplage de codes compressibles et incompressibles pour la simulation

d’im-pacts de vagues 113

5 Introduction 114

6 Code de calcul et cas tests de l’étude 116

6.1 Codes de calcul . . . 117 6.1.1 Lois de conservation . . . 117 6.1.2 Fluides compressible . . . 119 6.1.3 Fluides incompressibles . . . 121 6.1.4 Le code FluxIC . . . 122 6.1.5 Le code Gerris . . . 129 6.1.6 Le code FSID . . . 132

6.2 Présentation des cas tests de l’étude . . . 133

6.2.1 Cas test du patch . . . 133

6.2.2 Cas test de vague . . . 135

7 Simulation d’impacts et contributions dans le code FluxIC 137 7.1 Cas test du patch, étude de convergence en maillage . . . 138

7.1.1 Introduction. . . 138

7.1.2 Code FluxIC : la version parallèle. . . 138

7.1.3 Description du supercalculateur Curie . . . 141

7.1.4 Convergence en maillage . . . 143

7.2 Lois d’états régularisées RSG . . . 156

7.2.1 Motivations . . . 156

7.2.2 Cas Isentropique . . . 158

7.2.3 Cas avec énergie . . . 159

7.2.4 Cadre général . . . 160

7.2.5 Cas test patch . . . 165

7.3 Raffinement à la reprise . . . 168

7.3.1 Cas test de référence . . . 170

7.3.2 Résultats . . . 173

7.4 FluxIC à pas d’espace variable . . . 179

7.4.1 FluxIC à pas variable . . . 179

7.4.2 Cas test du Patch . . . 185

7.4.3 Conclusion . . . 194

8 Chaînage de codes incompressible et compressible 195 8.1 Introduction . . . 196

8.2 Simulation d’un cas test de vague avec différents codes . . . 196

8.2.1 FluxIC. . . 196

8.2.2 Gerris . . . 205

8.2.3 FSID. . . 211

8.2.4 Comparaison des résultats de différents codes . . . 215

8.3 Chaînage sur un domaine de calcul complet . . . 218

8.3.1 Initialisation de FluxIC par Gerris . . . 218

8.3.2 Initialisation de FluxIC par FSID . . . 225

8.3.3 Comparaison des résultats et conclusion : . . . 230

8.4 Chaînage sur un domaine de calcul réduit . . . 231

8.4.1 Initialisation de FluxIC par Gerris . . . 231

8.4.2 Initialisation de FluxIC par FSID . . . 234

(7)

9 Un solveur bifluide avec un liquide incompressible et un gaz quasi-compressible 239

9.1 Introduction . . . 240

9.2 Équations "exactes" . . . 240

9.3 Équations incompressibles (liquide et gaz) . . . 241

9.3.1 Basilisk . . . 241

9.4 Gaz quasi-compressible et liquide incompressible . . . 245

9.4.1 État de l’art des modèles quasi compressibles . . . 245

9.4.2 Méthode proposée : solveur quasi-compressible . . . 248

9.5 Validation avec un cas test 1D avec solution exacte . . . 252

9.6 Validation avec un cas test 2D : vortex de Kirchhoff . . . 254

9.6.1 Fonctions de courant . . . 254

9.6.2 Champs de vitesse . . . 255

9.6.3 Pression . . . 256

9.6.4 Pression acoustique d’un tourbillon de Kirchhoff quasi circulaire. . . 258

9.6.5 Vitesses acoustiques . . . 260

9.6.6 Résultats numériques. . . 261

9.7 Cas test du patch . . . 264

9.7.1 Implémentation du modèle dans le code Basilisk . . . 267

9.7.2 Résultats . . . 270

9.8 Conclusion. . . 271

III Conclusion générale et perspectives 272

Bibliographie 276

IV PUBLICATIONS ET PRÉSENTATIONS DANS DES CONFÉRENCES

NATIONALES ET INTERNATIONALES 282

(8)
(9)

Introduction générale et plan de la thèse

Ce travail de thèse intitulé "Accélérations algorithmiques pour la simulation numérique d’impacts de vagues. Modèles de type "Roofline" pour la caractérisation des

perfor-mances, application à la CFD. ", traite deux sujets essentiels pour un développement efficace

d’applications de simulation numérique et plus particulièrement pour la simulation d’impacts de vagues. La première partie traite le développement d’outils de caractérisation des applications scientifiques qui sont nécessaires pour avoir une vision d’ensemble des performances actuelles d’une application don-née sur une architecture dondon-née, et pour identifier les pistes et les limites d’optimisations possibles. Celles-ci seront liées à la fois à la machine et à l’application. On s’intéresse d’autre part à la simulation d’impact de vague avec l’utilisation de codes compressible et incompressible.

Parmi les modèles les plus connus pour une caractérisation simple et efficace d’applications scien-tifiques, nous pouvons citer le modèle Roofline développé par Samuel Williams à Berkeley Lab [101]. Ce modèle très simple permet une caractérisation rapide et représentative d’applications scientifiques, mais reste cependant très quantitatif. Dans la première partie de cette thèse nous partons du modèle

Roofline classique, que nous allons améliorer, afin de comprendre le comportement de différentes

par-ties d’une application donnée sur une machine donnée et avec une très haute précision. Pour valider les modèles développés au cours de cette thèse, nous allons développer une mini-application qui servira de prototype pour l’évaluation de code d’hydrodynamique explicite utilisant la méthode des volumes finis. Il s’agit de l’équation d’advection en deux dimensions d’espace. Ce code sera ensuite porté sur les co-processeurs de Intel : les Xeon Phi.

La deuxième partie de cette thèse traitera la simulation d’impacts de vagues avec une approche incompressible/compressible,

De très nombreuses situations font intervenir l’impact de vagues sur des solides : vagues marines sur les structures côtières ou off-shore, ballottement dans les cuves de méthaniers, vagues sur les machines houlomotrices, "green water" c’est-à-dire vagues passant le bastingage et heurtant les ponts des navires ... Une situation similaire et duale consiste à étudier l’impact de solides à la surface de l’eau (slamming) comme par exemple la coque d’un navire qui vient impacter cette surface ou les flotteurs d’un aéronef (hélicoptère notamment) lors de l’amerrissage. Voir par exemple la revue de Dias et Ghidaglia pour le slamming [39] et celle de Peregrine [75] pour les impacts de vagues sur un mur.

Il s’agit d’interactions fluide-structure, toutefois dans cette thèse, on souhaite se focaliser sur la partie fluides. Le "s" à fluides est justifié ici puisque dans toutes les situations évoquées, il y a deux fluides : un liquide et un gaz, eau et air ou gaz naturel liquéfié (GNL) en équilibre thermodynamique avec du gaz naturel.

Historiquement ces questions ont été initialement étudiées analytiquement (méthodes asympto-tiques notamment) et l’effet du gaz était ignoré alors que l’écoulement liquide était supposé incom-pressible, plan et irrotationnel. A l’apparition de la simulation numérique et compte tenu de la faible puissance des ordinateurs, cette modélisation a persisté.

(10)

phy-gaz : on parle alors d’écoulement de fluides à plusieurs phases séparées par une interface (surface libre). Un autre effet doit être considéré, et c’est ce qui fait l’actualité de la thèse, il a été montré (Braeunig et al.[14]) que la compressibilité des deux fluides a un effet sur la valeur des pressions d’impact.

Cette thèse a pour objet de concevoir un outil de modélisation numérique en 2D plan et en 3D afin d’évaluer les pressions maximales d’impact de vagues sur des parois solides. La situation physique typique est la suivante. Dans un premier temps des excitations viennent perturber l’état de repos de la surface libre entre le liquide et le gaz. Ces excitations se propagent et dans certains cas (ceux que l’on étudie ici) il se forme une vague qui déferle et vient impacter la structure. La propagation dure en général un temps physique beaucoup plus long que celui de la deuxième phase et durant la première phase les effets de compressibilité sont négligeables tant dans le liquide que dans le gaz. Ces derniers étant physiquement pertinents pendant une durée relativement faible correspondant au déferlement et à l’impact.

Approcher un écoulement quasi incompressible avec un code compressible est un problème notoirement délicat (Turkel [97, 96], Guillard et al. [47, 48], Dauvergne et al. [30], Dellacherie [31], ...), nous allons donc mettre en œuvre pour cette phase un code incompressible. Lorsque la vague est "formée", nous passerons le relais à un code compressible par une méthodologie appelée chaînage de code. A priori le couplage est faible dans le sens où il n’y a pas de rétroaction du calcul compressible vers le calcul incompressible.

Nous développons aussi dans cette thèse, un nouveau solveur bi-fluide permettant de résoudre les équations de Naviers-Stokes incompressibles couplées avec un modèle quasi-compressible permettant de corriger les grandeurs physiques dans le gaz, lorsque les effets de compressibilité sont pertinents.

Le cœur du travail portera sur l’analyse physique (phénomènes pertinents à conserver dans les mo-dèles), l’analyse mathématique (lois d’état, étude de convergence en maillage, pas d’espace variable, ...) pour le modèle compressible, l’algorithmique (en particulier parallèle) afin de pouvoir faire des calculs relativement rapides avec une résolution spatiale acceptable du point de vue de la physique.

Il ne s’agira pas de développer un ou des codes incompressibles ou compressibles, mais de travailler sur le couplage (interface entre de tels codes) en gardant à l’esprit qu’une grande souplesse sera néces-saire afin de pouvoir utiliser différents codes de mécanique des fluides soit développés au laboratoire, soit disponibles en licence GPL.

Le plan de cette deuxième partie est le suivant :

— État des lieux des codes de mécanique de fluides pour écoulements compressibles et incompres-sibles utilisés dans cette étude ;

— Définition des cas test de référence ;

— Simulation d’impact et contributions dans le code de calcul compressible FluxIC ;

— Chaînage de code compressibles et incompressibles pour la simulation d’impact de vagues ; — Développement d’un nouveau solveur bi-fluide avec gaz compressible et liquide incompressible.

(11)

Caractérisation et optimisation des

applications sur les architectures multi et

many coeurs

(12)

Introduction au supercalculateurs

Contents

2.1 Les supercalculateurs : passé, présent et futur.. . . 12

2.1.1 Taxonomie de Flynn . . . 12

2.1.2 Vers les processeurs multi-cœurs . . . 16

2.1.3 Accélérateurs massivement parallèles, co-processeurs . . . 23

(13)

"Un ordinateur fait au bas mot 1 million d’opérations à la seconde, mais il n’a que ça à penser, aussi." (brèves de comptoirs, JM.Gourio)

2.1

Les supercalculateurs : passé, présent et futur.

Les supercalculateurs ont vu une progression remarquable au cours de ces dernières années, ils sont passés des ordinateurs séquentiels aux supercalculateurs performants, avec des puissances de calcul de l’ordre de quelques 1012(milliers de milliard d’opérations par seconde) d’opérations en virgule flottante

par seconde. Cependant ces machines deviennent de plus en en plus complexes, ce qui augmente la difficulté à les utiliser de façon optimale. Étudier leurs évolutions nous aide à comprendre la technologie actuelle, son utilisation, et les orientations futures de ces machines.

Figure 2.1 – Évolution des performances des machines classés dans le TOP500, en marron la première machine, en bleu la dernière machine (N=500) et en vert la somme des performances de toutes les machines du top 500 (source : https ://www.top500.org/).

2.1.1 Taxonomie de Flynn

La première classification des machines de calcul a été dressée par Flynn en 1966 [42]. Elle est connue sous le nom "Taxonomie de Flynn". Elle classifie les architectures des machines selon deux critères indépendants qui sont : les instructions et les données. Ces deux critères peuvent avoir deux états possibles Simple ou Multiple (qui peuvent être traitées séquentiellement ou simultanément par différentes unités de traitement dans un calculateur).

La première catégorie, la plus simple dans la classification de Flynn est SISD (Sigle Instruction

Single Data) (Figure 2.2), elle représente les premières machines scalaires avec un fonctionnement

sé-quentiel, avec l’exécution d’une seule instruction en modifiant un seul flux de données à la fois. Ce sont des machines qui n’exploitent aucun parallélisme et elles sont connues sous le nom "architecture de Von Neumann", associé au nom du mathématicien John Von Neumann, qui a défini les premières bases

(14)

pour la conception d’un tel ordinateur. Ces architectures ont été améliorées dans les années 60, avec l’apparition de la première machine qui utilise la mémoire virtuelle et la parallélisation d’instruction ILP (Instruction Level Parallelism), en utilisant des Pipelines permettant une exécution simultanée de plusieurs étapes d’une instruction, comme imaginé dans le domaine de l’automobile par Henry Ford dans le principe du travail à la chaîne qui découpe une tâche en plusieurs tâches élémentaires pour construire une pièce et qui peuvent être réalisées en parallèle.

Figure 2.2 – Architecture SISD

Les supercalculateurs ont vu le jour avec l’apparition de IBM 7030 à la demande du professeur Ed-ward Teller et du laboratoire Lawrence Livermore National Laboratory (LLNL) pour réaliser des calculs en mécanique des fluides en 3 dimensions. Par la suite l’entreprise CDC (Control Data Corporation) lance le CDC 6600, développé par Seymour Cray. Il est considéré comme le premier supercalculateur commercialisé en 1964, et est composé d’un processeur 60 bits et de plusieurs unités de traitement réalisant ainsi l’exécution simultanée de plusieurs instructions. Elle est nommée la machine la plus puissante au monde jusqu’à l’année 69.

Des ordinateurs capables d’exécuter plusieurs flots de données sur une seule instruction ont été développés dans les années 70, avec l’introduction des machines vectorielles. Ses architectures appelées dans la classification de Flynn SIMD (Single Instruction Multiple Data ou aussi connues sous le nom d’architectures vectorielles) sont capables d’effectuer un unique traitement (une seule instruction) sur

un ensemble de données (Figure2.3). Par exemple, les architectures actuelles de type GPU (Graphics

Processing Unit) sont basées sur cette approche.

Parmi les supercalculateurs de cette époque avec des processeurs vectoriels on peut citer CDC Star 100 le successeur de CDC 6600 avec 100 MFlops et aussi TI-ASC (Texas Instruments Advanced Scientific Computer)[99].

En 1972 Cray quitte son entreprise CDC, et créa sa propre compagnie nommée Cray Research Inc, celle-ci devient la première entreprise consacrée exclusivement aux supercalculateurs, ainsi en 1976 cray produit le premier supercalculateur nommé Cray 1, qui constituera la révolution dans l’histoire des supercalculateurs. Le premier sera livré au "Los Alamos National Laboratory", avec un processeur 64 bits et une fréquence de 83 MHZ pour atteindre une performance maximale de 166 Mflops. Cette machine combine les traitements vectorielles exploitant des unités vectoriels de 8×64 bits et constitua le début de la révolution dans les machines vectorielles qui utilisent des jeux d’instructions qui manipulent des vecteurs localisés dans des mémoires plus rapides appelées registres, et qui sont plus proches physiquement des unités de traitement (processeurs). Cette révolution permettra de réduire les temps d’Accès aux données par les processeurs et réduisant ainsi les mouvements de données vers et depuis la mémoire centrale. Les processeurs actuels utilisent aussi des registres et des unités de calcul vectorielles qui sont accessibles soit par des commandes bas niveaux (programmation assembleur) ou par des pragmas SIMD.

Ces architectures, ou plus précisément les supercalculateurs inventés par Cray Research, restent très utilisées jusqu’à la fin des années 1970, les machines de cette décennie sont monoprocesseur

(15)

Figure 2.3 – Architecture SIMD

Flyns dans sa classification a dénommé une architecture MISD (multiple Instruction, Multiple data), qui est un type d’architecture très peu utilisé. En effet on essaye d’appliquer des traitements multiples sur une donnée unique, ses applications sont très limités.

Dans le début des années 80, des machines constituées de plusieurs processeurs sont apparues. Elles permettent la réalisation parallèle de plusieurs instructions sur plusieurs flops de données, per-mettant ainsi un traitement nommé dans la classification de Flynn MIMD "Multiple Instructions Multiple data". les premières machines multi processeurs sont pour la plupart des machines constitue de plusieurs processeurs avec chacun sa propre mémoire, cette architecture est dite AMP (Asymmetric Multi-Processing). Ces processeurs ont été regroupés afin d’augmenter les puissances de calcul à bas coût, mais les systèmes d’exploitation de cette époque étaient conçus pour les processeurs séquentielle et ne géreront pas correctement le caractère parallèle de ces machines.

Figure 2.4 – Architecture MIMD

Par la suite des processeurs plus facile à programmer appelé SMP (Symmetric Multi-Processing) remplacent progressivement les systèmes à base de AMP. Les processeurs qui composaient ces archi-tectures étaient fortement connectés, ils partageaient les mêmes ressources en termes de mémoire, des entres/sorties et étaient gérés par un seul et unique système d’exploitation. L’entreprise Cray produit alors le successeur de Cray 1, le Cray X-Mp en 1982 dessiné principalement par Steve Chen, et qui deviendra le supercalculateur le plus puissant entre 1982 et 1985. Les principaux changements par rapport au Cray 1 résidaient dans le fait d’avoir de la mémoire partagée avec des processeurs vectoriels parallèles, et avec cette fois-ci deux CPUs dans une même carte. Ces deux processeurs sont symétriques et partagent la même mémoire.

(16)

Figure 2.5 – Supercalculateur Cray I

Au début des années 1990, les modèles développés dans la décennie précédente commencent à pré-senter des limites. En même temps les micro-ordinateurs, ont connu une profonde mutation : ils se sont popularisés et ont peu à peu conquis les entreprises, les laboratoires de recherche, les universités et même les foyers. Ces stations de calcul présentaient une alternative intéressante pour les centres ne disposant pas de moyens financiers pour acheter des supercalculateurs. Ils représentaient un rapport prix/performances très élevé. Ainsi un nouveau modèle apparaît en valorisant une approche de paral-lélisation par interconnexion d’un grand nombre de processeurs, initié par le projet CONDOR [65], qui utilise les temps de cycles inutilisé grâce à un réseau d’interconnexion. Ce modèle montre ses limitations liées à la disponibilité des machines et aussi à la vitesse des interconnexions, qui utilisait un réseau Ethernet basé sur le transfert de données avec des protocoles de communication de type (TCP/IP), conçues initialement pour les communications entre des lignes peu fiables et de longue distance. Des technologies de réseaux plus fiables, plus efficaces et avec un débit de quelques Go/s ont remplacé les communications avec des débits de l’ordre du Mo/s. Cette amélioration a permis suite à quelques re-cherches, les plus connus sont issues du projet BEOWULF [9], d’aboutir à l’assemblage d’une machine à la NASA (National Aeronautics and Space Administration). Cette machine est elle même constitué de plusieurs machines avec plusieurs nœuds de calculs, composés par un grand nombre d’ordinateurs standards reliés entre eux. L’amélioration des interconnexions a permis le début d’une révolution dans la conception des systèmes de calcul haute performance, et a donnée naissance à un nouveau modèle de machine parallèle appelé : grappe (cluster en anglais). Ainsi en 1993, une initiative du Sandia National Laboratories, à travers le projet ASCI (Advanced Strategic Computing Initiative) a permis d’aboutir à la machine ASCI Red, produite par Intel, composée de 4536 nœuds de calcul, chacun constitué de processeurs d’Intel Pentium Pro de 33 Mhz de fréquence et comportant une mémoire partagée par deux processeurs. Elle a permis d’obtenir pour la première fois des performances dépassant le millier de milliards d’opérations flottantes par seconde (Tflops/s). Elle est nommée d’ailleurs le Tflops, et est restée numéro 1 du au top 500 de juin 1997 à juin 2000.

(17)

Figure 2.6 – Évolution des types d’architectures au TOP 500

La figure2.6représente l’évolution des parts des architectures les plus puissantes selon le classement du top 500, depuis sa création en 1993.

On constate la disparition des machines à base de mono-processeur au début des années 1990, et aussi la disparition des machines à base de SMP (Symmetric multiprocessor) qui sont devenues très coûteuses et complexes. Une classe d’architecture appelée dans le site du top 500 "Constellations", que nous avons appelé MSMP "multiple SMP", constituée par des machines dont le nombre de processeurs dans un nœud est supérieur au nombre de noeuds dans le système. Apparue au milieu des années 2000, cette architecture disparaissait 10 ans après, car l’augmentation du nombre de processeurs dans un nœud est pénalisée par les transferts mémoire et créa un goulot d’étranglement. Le type de machines le plus répandu dans les centres de calcul actuels est le "cluster de calcul", où cette fois-ci le nombre de nœuds est supérieur au nombre de processeur dans un nœud. Cette configuration présente dans 84% des

systèmes actuels (classement 2016). Le dernier type de machines présenté dans la figure 2.6est MPP

(Massively Parallel processors). Ces machines représentent la catégorie sur mesure,car elles bénéficient d’une conception matérielle spécifique pour pouvoir tirer profit des processeurs qui les constituent, en optimisant les unités de calculs et le réseau d’interconnexion. Cette configuration permet d’atteindre des performances qui sont excellentes mais représente un coût de développement très élevé. Les clusters sont, quant à eux constitués d’un assemblage d’éléments standards (processeurs standards, mémoires standards et des réseaux d’interconnexion standards), ce qui permettra donc de réduire le coût de leur développements.

2.1.2 Vers les processeurs multi-cœurs

Parallèlement au développement de l’architecture des supercalculateurs, l’évolution des processeurs est présente, notamment par le développement du premier processeur d’Intel 4004, au début des années 1970, avec 2250 transistors à une fréquence de 100 Hz et une gravure de 10 µm, jusqu’au dernier processeur Intel Skylake avec une gravure de 14 nm, et donc plus de transistor dans la puce (passant ainsi de 2300 à 2 milliards de transistors pour le Skylake). Ce doublement suit la loi Moore initiée en 1965, qui postule un doublement à coût constant du nombre de circuits tous les 12 mois. Elle est révisée en 1975 passant à 18 mois, ce qui implique potentiellement un doublement des performances des processeurs. Pour atteindre cet objectif, les efforts des constructeurs de processeurs (appelés aussi "fondeurs") se sont concentrés sur l’amélioration des technologies qui permettent d’avoir une meilleure finesse de gravure, et par conséquent l’augmentation du nombre de transistors par unité de surface

(18)

dans chaque processeur, et aussi par l’amélioration du parallélisme d’instruction grâce aux pipelines. Depuis les années 2000 l’augmentation des transistors dans un seul processeur, a rencontré une limite physique de la technologie de gravure, qui est la dissipation de la chaleur. Une solution proposée (règle de réduction d’échelle) par Dennard [32] et révisée par Thompson [89] considère que les transistors ont une meilleure efficacité lorsqu’ils sont gravés avec une taille plus petite, qui permet donc d’être couplé à la loi Moore pour augmenter la puissance des processeurs de 40% en en doublant les transistors. Cette vision des choses a fonctionné jusqu’au début des années 2000, avant d’atteindre un seuil appelé mur de la puissance, dans lequel augmenter la fréquence des processeurs permettait d’augmenter la puissance consommée, une grande partie de la puissance est transformée en chaleur qu’il faut dissiper pour ne pas détruire le processeur. Cette dissipation de chaleur était réalisée par l’intermédiaire de ventilateurs de plus en plus grands et brillants. L’amélioration des pipelines a aussi atteint ses limites en les rendant plus complexes et en y intégrant des étapes supplémentaires pour permettre une parallélisation des instructions. La taille des pipelines augmentait entraînant un traitement plus long des instructions. Notons aussi qu’AMD avait introduit une nouvelle architecture du nom d’AMD64 qui supporte des jeux d’instructions d’entiers de 64 bits et qui est une extension de l’architecture de Intel IA32 (processeurs Intel 800386 dans les années 1985) avec l’introduction de son microprocesseur Opteron en 2003. En novembre 2005 Intel produit le processeur Itanium 1 pour l’intégration dans leurs offres serveurs. Permettant ainsi pour la première fois d’adresser une mémoire supérieure à 4 Go.

En 2004 Intel abandonnait le projet Tejas [62], avec lequel elle espérait atteindre une fréquence qui dépassait les 7 Ghz. Elle s’est en effet confrontée au problème du "wall power" (mur de la puissance). En effet Dennard avait sous estimé les courants de fuites qui ont permis d’atteindre une fréquence limitée à 3.8 Ghz avec une augmentation importante de la chaleur. Cette dernière avoisinait les 150 watts de l’enveloppe thermique TDP (Thermal Design Power) qui représente le transfert thermique à dissiper vers l’extérieur, contre moins de la moitié avec le processeur pentium 4 de la génération précédente. Une nouvelle architecture qui permettra d’améliorer les performances était nécessaire, sans trop compter sur l’augmentation de la fréquence pour augmenter les performances, ni l’utilisation du parallélisme massif d’instructions. Ainsi la solution fut adopter par Intel dans en 2005, et qui consistait à regrouper l’équivalent de plusieurs processeurs appelés "cœurs" dans un même circuit appelé "die" en anglais, permettant ainsi d’augmenter les performances sans augmenter la TDP. Cette façon de faire est équivalente à l’utilisation de plusieurs cœurs dans un nœud de calcul, à l’exception que dans un processeur dit multi-cœurs les ressources sont définis de façons différentes, pour optimiser les accès des cœurs aux données globales d’un multi-processeur avec une vitesse supérieure à celle des cœurs

dans un nœud de calcul. La figure 2.7 représente la différence entre un processeur dit mono-cœur et

un processeurs multi-cœurs. Bien évidement il s’agit dune représentation simplifiée, puisque pour une architecture multi cœurs, il existe une hiérarchie complexe composée de plusieurs niveaux de mémoire cache et plusieurs niveaux de parallélisme de pipeline entre cœurs.

Figure 2.7 – Représentation simplifiée des processeurs multi-cœur et mono-cœur

(19)

et donc les puissances de calcul sans augmenter les fréquences (Figure2.9) en réduisant ainsi la chaleur dissipée. En gardant à l’esprit que ces architectures coûtent moins chers en terme de refroidissement de processeurs et en terme de place dans un cluster.

Ainsi le nombre de transistors a continué à augmenter dans les processeurs respectant globalement la loi de Moore initiale. (Figure2.8)

Figure 2.8 – Évolution du nombre des transistors dans les processeurs d’Intel.

Figure 2.9 – Évolution de la fréquence des processeurs d’Intel

Certains détails de conception de ces architectures commencent à causer des problèmes aux fils des années. En effet par rapport à la manière dont ces processeurs sont connectés entre eux dans une

(20)

même puce, ils utilisent ce qu’on appelle un Bus FSB (Front Side Bus) connectant le processeur au Northbridge et qui était un véritable problème dans une architecture très moderne. Les architectures Multi-cœurs avaient des problèmes pour monter en charge, car ils devaient partager le FSB pour accéder à la mémoire et pour assurer la cohérence des données contenues dans leur mémoire cache respectives. Dans cette situation les transactions sur le bus peuvent provoquer une saturation.

Les solutions proposées par Intel étaient souvent d’augmenter la taille des caches ou de développer

des bus plus rapides. La figure 2.10 illustre la micro-architecture de Intel pour un système incluant 4

CPUs avec une architecture basée sur des communications à base de FSB, elle est composée d’un Hub de contrôleurs mémoire, connu sous le nom de Northbridge, et un Hub de contrôleurs, connu sous le nom de Southbridge, les deux combinés sont appelés shipset. Le bus FSB constitue l’interface pour échanger les données entre le CPU et les Northbride, si les CPUs devaient lire ou écrire des données dans la mémoire ou sur le PCie ils devraient tous passer par le seul et unique FSB dans le système.

Figure 2.10 – Communication entre les CPUs à travers le FSB

Les derniers BUS de transfert FSB introduits par intel, fonctionnaient avec une fréquence d’horloge de 400 MHz et avec une largeur de 64 bits, cette technologie offrait une bande passante totale de 10 GB/s, qui est utilisable seulement en écriture ou en lecture.

À partir de la micro-architecture appelée Nehalem sortie en novembre 2008, Intel a déplacée le contrô-leur mémoire des entrées/Sortie (I/O) et le contrôcontrô-leur PCIe du Northbridge sur le die (Processor die est une seule pièce continue de semi-conducteur où les transistors qui composent la CPU résident réel-lement). Ces modifications permettent d’augmenter les débits et de réduire la latence des lectures et écritures de données I/O et aussi sur le PCIe.

Non seulement le contrôleurs de mémoire ont été déplacés vers le CPU, mais Intel a également introduit une nouvelle architecture à mémoire partagée utilisant un nouveau bus appelés QPI (QuickPath Inter-connect) qui, cette fois-ci sert aux communications entre les processeurs (Notons que cette technologie a été intégrée bien avant dans les processeurs AMD à partir de 2003 sous le nom de HyperTransport), et qui fournit cette fois-ci jusqu’à 25 Go/s de débit total de transfert de données bidirectionnel, et donc on

passe de 10 Go/s du bus FSB à 40 Go/s avec les bus QPI. La figure2.11illustre une micro-architecture

de Intel pour un système incluant 4 CPUs avec une architecture basée sur des communications à l’aide du QPI, notons que chaque processeur peut accéder aux données depuis n’importe quelle mémoire en un seul passage par le bus QPI au maximum. Cette configuration se prête bien à la création de systèmes plus performants, pour des gains de performance maximum dans un système multiproces-seurs. les applications qui utilisent ce type de système doivent être multi-threadés (utilisant plusieurs taches parallèles), et en utilisant les mémoires les plus proches des processeurs sur lesquels tournent ces threads, pour maximiser la bande passante mémoire.

(21)

Figure 2.11 – Communication entre les CPUs à travers le QPI

Les architectures multi-cœurs avec plus d’un seul processeur par nœud de calcul, et donc composées de plusieurs mémoires par nœud, sont appelées architectures NUMA (Non-Uniform Memory Acces), ou architectures avec accès mémoire non uniforme. Ces architectures entraînent un effet NUMA pour les codes multi-threadés via des mécanismes de modèles de programmation dédiées à la mémoire parta-gée entre processeur (OpenMP par exemple). Les initialisations effectives de la mémoire des tableaux et des données utilisées par les threads se produisent lorsqu’on accède pour la première fois à ses données, et dans certains cas la mémoire peut prendre place dans le socket voisin, ce qui entraîne une mémoire asymétrique et donc des latences supplémentaires qui impliquent une baisse des performances. Plusieurs niveaux de mémoires sont mise en œuvre dans les architectures actuelles, ils permettront de gérer des quantités de données de plus en plus importante. Or les types de mémoires implémentés diffèrent par leur prix, leur taille ainsi que leur vitesse (bande passante d’accès) d’accès au données.

La figure 2.12illustre la hiérarchie des mémoires introduites dans les architectures récentes.

Figure 2.12 – Différents niveaux de mémoires dans les architectures récentes

On peut différencier deux types de mémoires :

— La mémoire dynamique : Ce type de mémoire est composé de plusieurs transistors à effet de champs MOS (Metal Oxide Semiconductor), qui permettent une intégration très importante. Dans un circuit de taille assez petite nous pouvons rassembler plusieurs millions de transistors, pour avoir une très grande capacité (de l’ordre du Go). Ces cartes mémoires ont des prix abor-dables par rapport à leur capacité. L’inconvénient de ces architectures réside dans le besoin de rafraîchissement répété, pour garder les informations en mémoire et ce qui entraîne des temps d’accès aux données très importants. La mémoire DRAM est de type Dynamique.

(22)

binaire pouvait être stockée comme charge positive ou négative sur un condensateur. Le seul inconvénient résidait dans leur fuite de charge en quelques millisecondes.

Après plusieurs mois d’expérimentation Dennard a conçu une configuration où un seul transistor à effet de champ pouvait lire la charge et la rafraîchir des milliers de fois par seconde. Un seul transistor serait alors responsable de chaque bit d’information réduisant ainsi la taille de la cel-lule entière. Le rafraîchissement de la charge sur chaque transistor est la raison pour laquelle la puce de Dennard est appelée Dynamique. À cette époque ce type de mémoire était un concept connu et utilisé dans la plupart des ordinateurs, il était réservé à l’écriture et la lecture de façon temporaire, en s’effaçant à chaque fois que l’ordinateur était atteint. Cependant au milieu des années 1960 la carte mémoire dynamique était composée de fils et d’aimants qui encombraient le composant, l’exploit révolutionnaire de Dennard fut de réduire la RAM à une cellule de mémoire avec un seul transistor. L’effet final de l’invention de Dennard était qu’une seule puce pouvait contenir un milliard ou plus de cellule RAM dans les ordinateurs modernes.

Depuis, plusieurs types de barrettes mémoire DRAM ont été développées, les plus modernes depuis les années 2000 sont les barrettes mémoire de type DDR SDRAM pour "Synchronous Dynamic Random Access Memory" et communément abrégée sous le nom DDR, qui permettent des transferts de données sur deux lignes de taille 64 bits, permettant ainsi d’effectuer deux fois de transfert mémoire qu’une simple SDRAM. Une carte mémoire ayant un bus cadencé de 133 MHz est équivalente en terme de bande passante à une mémoire de type SDRAM simple cadencé à 266 MHz, les DDR sont des mémoires 64 bits (8 octets), cela signifie qu’une barrette mémoire DDR à 133 MHz, peut fournir une bande passante de 2.128 Go/s et qui se calcule comme suit :

Bande passante (octets/s) = fréquence (Hz) × 8 (octets/ ligne) × 2 (ligne).

Plusieurs améliorations ont été effectuées pour passer de la DDR à une nouvelle génération DDR4, en passant par la DDR2 et la DRR3, fournissant ainsi des fréquences qui peuvent aller jusqu’à 1200 MHz avec une bande passant allant jusqu’à 19.20 GB/s par carte mémoire. Sachant que dans les serveurs de calcul actuels nous avons la possibilité d’utiliser plusieurs entrées de mémoire appelées canaux de mémoire, qui permettront ainsi de multiplier la bande passante par serveur en fonction des cartes mémoires installées dans celui-ci. Dans le cas par exemple d’une machine équipée de 8 cartes DDR4 de 2400 MHz de fréquence (1200 MHz x 2 lignes), la bande passante mémoire entre la DDR4 et le dernier niveau de cache peut atteindre 153 Go/s (128 Go/s atteignable avec le benchmark STREAM ). Intel a introduit récemment dans les nouveaux accélérateurs Xeon Phi un nouveau type de mémoire appelé MCDRAM (Multi-Channel DRAM) fournissant une bande passante de plus de 900 GB/s , qui est 5 fois plus grande que la bande passante de 8 cartes DDR4 de 1200 MHZ.

— Mémoire statique : ce type de mémoire n’a pas besoin de rafraîchissement, contrairement à la mémoire dynamique et donc les lectures et les écritures se font très rapidement impliquant des temps très rapides d’accès à ces mémoires. Par conséquent à une taille de gravure équivalent à une mémoire dynamique moins de données peuvent être stockés. Les mémoires Cache L1, L2, L3 et les registres sont de type statique.

Les constructeurs ont profité de la finesse de la gravure des processeurs pour intégrer de plus en plus de registres et de caches dans les microprocesseurs et ont intégré d’abord les caches qui sont les espaces mémoire très proche du processeur, mais dont le coût de fabrication est très élevés, la capacité de ces espaces mémoire dépasse rarement les quelques octets.

les registres permettent la vectorisation du code, qui est une optimisation qui permet de remplacer des opérations scalaires par des opérations vectorielles. Nous pouvons ainsi effectuer plusieurs opérations simultanément sur les registres de plateformes de calcul incluant des processeurs avec des extensions qui prennent en charge le parallélisme SIMD (Single Instruction Multiple Data). Ces instructions fonc-tionnent sur un vecteur de données en parallèle. La longueur du vecteur, et donc le nombre d’éléments accessibles en parallèles, continue à augmenter à fur et à mesure que de nouvelles technologies de

(23)

processeurs sont introduites. La Figure2.13illustre le principe de la vectorisation lors de la somme de deux vecteurs A et B.

Figure 2.13 – Illustration du calcul de deux matrice, à gauche : traitement scalaire, à droite : traitement vectoriel (SIMD)

.

L’introduction des processeurs avec la fonctionnalité SIMD, a commencée avec l’apparition des processeurs P2 d’Intel Kalmanth en 1997, avec les jeux d’instructions de type MMX (MultiMedia

Extensions) de taille 64 bits qui permettront d’effectuer deux opérations flottantes en simple précision

en une seule instruction. Ensuite vient une série d’instructions SSE avec une taille de 128 bits avec le Pentium III katmai en 1999 allant de SSE (Streaming SIMD Extensions) à SSE4.2 avec les processeurs Nehalemn en 2008. Ensuite vient l’extension avec 256 bit sur architecture Sandy Bridge en 2011 et allant jusqu’à Avx2 avec les processeurs Haswell.

Avec l’apparition des co-processeur Xeon phi et les futures processeurs Skylake les extensions sont passées à AVX 512 bits.

Ces jeux d’instructions effectuent des opérations parallèles à l’aide des registres spécifiques à chaque technologie :

— Registres XMM pour la technologie SSE de taille 128 bits- 2x double, 4x simple ; — Registres YMM pour la technologie AVX de teille 256 bits- 4X double, 8x simple ;

— Registres ZMM pour la technologie AVX-512 (pour les Xeon Phi) 512 bits, 8x double, 16x simple. Nous pouvons ainsi effectuer, par rapport à une version scalaire, 2 fois plus de calcul avec des registres XMM, 4 fois plus de calcul avec les registres YMM ainsi que 8 plus de calcul avec les registre ZMM. À noter que depuis les processeurs Haswell (avec la technologie AVX2) une nouvelle extension appelée FMA (Fused Multiply-Add) a été introduite (Sachant que cette instruction a été initialement introduite par IBM avec les processeur IBM Power 1 en 1990). Elle permet d’effectuer en une seule fois une multiplication et une addition, ce qui permettra de multiplier par deux les facteurs de gains des technologies AVX2 et AVX-512.

Sachant que nous pouvons effectuer à la fois une multiplication et une addition par cycle d’horloge

(deux FMA pour l’AVX2 et l’AVX-512), la Figure2.14 illustre le nombre d’opérations flottantes que

(24)

Figure 2.14 – Évolution des registres entre SSE4 et AVX2

Ainsi avec ces fonctionnalités nous pouvons atteindre des performances en terme d’opération en virgule flottante par seconde Flops (Floating-point operation per second) très importantes.

2.1.3 Accélérateurs massivement parallèles, co-processeurs

Après une première expérience d’Intel avec les coprocesseur Intel 8087 en 1980 qui permettaient le calcul en virgule flottante pour les machines 16 bits, les serveurs de calcul actuelle utilisent ce modèle mais sur des machine 64 bits avec les accélérateurs de calculs, appelés aussi co-processeurs. Ces nouvelles architectures sont composées de plusieurs centaines de micro-processeurs, de base fréquence réalisant ainsi une très grande quantité d’opérations flottantes par seconde avec un coût électrique très bas. Dans la suite de ce paragraphe nous allons présenter les deux types les plus utilisés dans le domaine du calcul scientifique ; les cartes graphiques et les co-processeur de Intel : les Xeon Phi. Carte graphique Nvidia : CUDA (Compute Unified Device Architecture)

Depuis son lancement en 2007, un grand nombre de sociétés et de laboratoires de recherche ont choisi de développer leur application en CUDA C (Compute Unified Device Architecture).

CUDA est l’architecture des cartes graphiques NVIDIA, qui est dédiée au calcul massivement parallèle qui, contrairement au traitement traditionnel des CPU (Central Processing Unit), consiste à exécuter en même temps des tâches différentes et qui nécessite une structure de contrôle complexe et une mémoire cache pour réduire les accès à la mémoire globale.

Les GPU sont capables d’exécuter une même tâche sur des milliers de threads simultanément (SIMD : Single instruction Multiple Data) ; ce haut degré de parallélisme conduit à une augmentation potentielle des performances.

En termes de vitesse de calcul, par exemple, une carte GPU NVidia GTX 690 (5622 Gflops) est trente fois plus rapide qu’un processeur intel Core i7-3770 (200 Gflops), mais pour s’approcher des per-formances maximales atteignables par le GPU, il faut faire des efforts d’optimisation et d’organisation de données dans la mémoire du GPU. Car les performances dépendent de la vitesse du calcul, mais aussi de la vitesse des lectures et des écritures dans les différents niveaux de mémoire GPU.

(25)

Figure 2.15 – architectures GPU et CPU

La programmation sur GPU nécessite des connaissances de l’architecture et du modèle de program-mation dédié aux cartes graphiques.

Le portage d’un code développé sur CPU, validé et écrit dans un langage classique (C ou Fortran), permet d’avoir une base d’estimation de la mémoire nécessaire sur GPU et la validation des résultats,

ainsi que le calcul du gain de temps par rapport à la version CPU (Speed-up1).

CUDA C permet de définir une fonction C appelée kernel, qui est exécutée en parallèle N fois par N

threads CUDA, contrairement à une fonction qui s’exécute N fois en séquentiel sur un CPU.

Voici la forme d’une grille de calcul CUDA en 2D :

Figure 2.16 – Grille de calcul CUDA

Lorsqu’un kernel est invoqué, il s’exécute sous forme d’une grille (grid) de blocs de threads parallèles. — Une grille (grid) est un tableau à 1, 2 ou 3 dimensions (selon les caractéristiques du GPU) de

blocs.

— Un bloc (block) est un tableau à 1, 2 ou 3 dimensions de threads qui peuvent partager des ressources (shared memory).

Il faut noter que le nombre de threads par block est limité par le constructeur ; dans le cas d’une carte GTX 770, le nombre de threads est limité à 1024 x 1024 x 64 par bloc et le nombre de threads

1. Speed-up : désigne le gain de temps d’exécution d’un programme suite à l’ajout d’unités de calcul par rapport à celui d’un programme séquentiel :

S= T seq

(26)

par grille est limité à 65535 x 65535 x 65535. La mémoire

Une carte graphique NVIDIA est constituée de multiprocesseurs SM "streaming multiprocessor " eux-mêmes composés de plusieurs processeurs SP "streaming Processor ", d’une mémoire locale et de registres. Par exemple pour une carte GTX 770 :

- La mémoire globale : la plus lente (400 à 600 cycles de latence), elle est accessible en lecture et en écriture par toute la grille ;

- La mémoire partagée : rapide mais limitée par la taille (16 Ko par multiprocesseur), elle est accessible à tout un bloc ;

- Registres : rapides mais très limités (16384 par bloc), accessibles en lecture et en écriture à un thread ; - La mémoire locale : lente (200 à 300 cycles), on l’utilise quand la taille des tableaux est supérieure à la taille des registres ;

- La mémoire constante : rapide mais limitée (64 Ko), accessible en lecture seule à tous les threads ; - La mémoire texture : rapide et accessible en lecture seule à tous les threads.

La carte graphique Testa C1060 comprend trente multiprocesseurs (SM). Chaque SM comprend 8 processeurs (SP), 16 Kb de mémoire partagée, 16 384 registres de 32 bits. Chaque SM a sa propre unité qui gère la double précision, et deux unités de simple précision qui sont partagées par les huit processeurs dans le SM. Elle dispose également d’une mémoire globale de 4 Go.

Figure 2.17 – Architecture matérielle des GPU.

OpenCL (Open Computing Language) a été initialement conçu par Apple avec une collaboration de AMD, Intel et NVIDIA, puis repris par le groupe KHRONOS pour la spécification d’une première version.

OpenCL offre l’avantage de ne pas être lié à une architecture donnée, contrairement à CUDA, qui est dédié aux cartes graphiques NVIDIA. En plus, il permet l’exécution du code sur plusieurs composants (devices) CPU, GPU. Sa spécification a été inspirée par CUDA-C, avec une compilation des Kernels lors de l’exécution.

Plate-forme OpenCL

Une application OpenCL s’articule autour des notions suivantes :

(27)

les drivers des cartes installées (NVIDIA, AMD, Intel...). En général une plate-forme par constructeur. - Device : permet d’identifier les composants programmables dans chaque plate-forme, qu’il s’agisse de GPU ou de CPU, sur lesquels nous allons exécuter notre programme.

- Contexte : constitue la partie la plus importante dans une application OpenCL qui sera implémentée directement sur l’une des plates-formes.

- Command Queue : constitue une file de commandes dans laquelle on injecte des instructions de transfert des données entre le corps de l’application et les drivers, ainsi que l’exécution des Kernels. Ces derniers s’exécutent dans l’ordre de leur insertion dans la file comme une pile FIFO (First in First Out). Il existe en effet des options qui permettent une exécution asynchrone.

- Programme : permet de récupérer les codes OpenCL qui seront exécutés sur les Devices. Il sera com-pilé à l’exécution, pour ensuite créer le Kernel qui sera injecté dans la file de commandes.

la figure2.18 représente le schéma d’une application OpenCL.

Figure 2.18 – Schéma d’une application OpenCL

Modèle de programmation Pour avoir de meilleures performances, le Kernel doit être exécuté

en parallèle sur plusieurs Work-item (thread). Chaque work-item est identifié par son indice global i,0 < i < Nglobal. Les work-items sont regroupés dans les Work-groups qui s’exécutent dans un compute unit. Les work-groups sont identifiés par leur indice k,0 < k < Ngroup, les work-items sont aussi indexés localement par un indice j,0 < j < Nlocal. Donc, l’indice global est donné par la relation :

i = k∗ Nlocal + j (2.2)

et donc le nombre total des work-item est :

N global = N group∗ Nlocal (2.3)

(28)

Figure 2.19 – Grille de calcul OpenCL

La mémoireLes work-items ont accès aux différents types de mémoire. Ces mémoires ont chacune

une utilisation spécifique

– Mémoire globale : permission de lecture et d’écriture à tous les work-items.

– Mémoire constante : région de la mémoire globale pour l’utilisation de données constantes pendant l’exécution du kernel.

– Mémoire locale : mémoire dédiée à tous les work-item d’un même work-group. – Mémoire privée : mémoire dédiée à un seul et unique work-item.

Figure 2.20 – Différents types de mémoires OpenCL Processeurs many-cœurs, KNC : Knights Corner

Afin de concurrencer les processeurs graphiques, Intel a proposée une évolution naturelle des pro-cesseurs multi-cœurs, en s’appuyant toujours sur le principe de l’utilisation de propro-cesseurs avec des fréquences d’horloge relativement peu élevée mais en grand nombre. L’avantage de l’utilisation de ces processeurs par rapport à des cartes graphiques, réside dans le fait que ces cartes sont moins consom-matrices d’énergie et qu’elles sont moins complexes en terme de programmation (basées sur X86).

(29)

Figure 2.21 – Architecture d’un coprocesseur Xeon Phi KNC

Tous les efforts pour l’optimisation et la vectorisation d’un code de calcul s’exécutant sur des architectures de calcul multi-coeurs restent valables pour les architectures many-coeurs et le portage entre les deux versions est naturel et ne nécessite pas d’effort particulier. Intel ambitionnait initialement de révolutionner le marché de la carte graphique haute gamme en travaillant sur le développement des processeurs X86 massivement multi-coeurs, de nom Larrabee, après plusieurs essais et plusieurs années de recherche Intel annulait finalement ce projet, et tente une transformation pour HPC en 2010 avec une nouvelle architecture appelée MIC "Many Integrated Core". Et a lancé officiellement sa famille de coprocesseurs appelée Xeon Phi à l’occasion de la conférence internationale super-computing en 2012 avec l’annonce du premier coprocesseurs Knights Corner.

Cette première génération de Xeon Phi Intel propose une carte qui ressemble à des cartes graphiques utilisant l’interface PCIe et disposant d’un processeur gravé en 22 nm.

les accélérateurs Intel Xeon Phi sont équipés de :

— jusqu’à 61 cœurs, avec des fréquences allant de 1.2 à 1.6GHz, reliés entre eux avec un bus en anneau bi-directionnel à hautes performances.

— 4 threads par cœur(244 threads par coprocesseur). — Une mémoire globale de 8 GB.

— Deux niveaux de mémoire cache :

— une mémoire cache L1 avec 32 KB pour le cache d’instruction et 32kb pour le cache de données.

— une mémoire cache L2 avec 512KB. — SBOX : Gen2 PCI express client logic.

(30)

Figure 2.22 – Architecture d’un coprocesseur Xeon Phi KNC

Un serveur équipé des coprocesseurs Intel Xeon Phi est considéré comme le hôte de ces coprocesseurs et chaque processeur Intel Xeon peut accueillir jusqu’à 8 coprocesseurs Xeon Phi.

Le coprocesseur contient un flash et une carte SMC (System Management and Configuration) qui détiennent le bios, le bootloader (qui permet le démarrage du coprocesseur),un firmware pour le coprocesseur. Les performances théoriques peuvent atteindre jusqu’à 1 Tflops en double précision. KNL : Knights Landing

La nouvelle version des processeurs many-core d’Intel Knights Landing a été introduite durant l’année 2016, avec des processeurs gravés en 14 nm contenant plus de 8 milliards de transistors. Elle représente la plus dense carte qu’Intel n’avait jamais réalisée. Les processeurs dans une puce KNL appartiennent à la famille des atoms appelée "Silvermont". Ils constituent ainsi des vrais processeurs et non pas des coprocesseurs qui passaient par le PCie dans le cas des Knights Corner (KNC). Cette carte est constituée d’une grille 2D de processeurs, chaque processeur ayant deux unités de traitement vectorielle cette fois-ci qui permet d’utiliser les nouveaux jeu d’instruction AVX 256 à 512 bits. Les processeurs sont liés entre eux avec une interconnexion de maille en 2D, ils sont liés également à deux contrôleurs de mémoire qui sont utilisés pour alimenter le système avec une mémoire RAM, qui peut atteindre une capacité de 384 GB et qui offre une bande passante d’environ 90Go/s avec le

benchmark STREAM. Cette carte est constituée aussi de 8 cartes mémoires de la nouvelle génération

de mémoire appelée MCDRAM (Multi-Channel DRAM) conçues spécialement pour cette gamme de coprocesseurs et qui peuvent atteindre une bande passante allant jusqu’à 900 GB/s. Ainsi le KNL peut fournir une très haute bande passante, une performance en double précision qui peut atteindre 3 Tflops en double précision et 6 Tflops en simple précision ce qui lui permet d’achever 3 fois plus performances que la version précédente avec la suppression du bus PCIe de La version KNC, qui constituait un goulot d’étrangement lors de la communication avec les processeurs.

(31)

Figure 2.23 – Architecture d’un coprocesseur Xeon Phi de la famille KNL

La figure ci-dessous illustre une carte KNL représentée par une grille de coeurs et résume les performances de cette carte :

Figure 2.24 – Architecture d’un coprocesseur Xeon Phi KNL

La bande passante représente la première cause du goulot d’étranglement de la plupart des

appli-cations scientifiques. Pour traiter cette demande en terme de bande passante, la 2ème génération des

Xeon Phi KNl contient de la mémoire MCDRAM, plus proche des cœurs. Ce type de mémoire cohabite avec une mémoire RAM classique de type DDR4.

Avec ces deux types de mémoires existant dans le KNL nous avons trois modes de fonctionnement, configurables au démarrage de la machine, qui sont : Cache mode, flat mode et hybride mode.

Le Flat mode utilise la totalité de la MCDRAM comme une mémoire adressable, tandis que le mode cache utilise la MCDRAM comme étant un cache, le mode hybride lui réalise un mélange des deux modes précédents, il utilise une portion de la MCDRAM comme une mémoire cache et une deuxième portion comme une mémoire adressable. La mémoire adressable est utilisée par le programmeur avec

(32)

une allocation explicite des variables tandis que la mémoire cache n’est pas vu par le système d’ex-ploitation (OS) et sera utilisée par le processeur entre la L2 et la platforme DDR4. Les sections qui suivent représentent les trois modes de cache :

— Le mode cache :

Quand le Knights Landing est configuré en mode cache, toute la mémoire MCDRAM est utilisée comme un niveau de mémoire cache, elle sera traitée comme le dernier niveau de cache (LLC : Last Level Cache), qui sera localisé entre la mémoire DDR4 et le niveau de cache L2.

L’avantage dans l’utilisation de cette configuration réside dans la gestion de la mémoire qui est gérée par la plat-forme et qui sera transparente pour l’application, donc il n’y a pas d’action spécifique par le développeur pour l’utilisation de la mémoire MCDRAM dans l’application. Ce type de configuration est utile pour les développeurs non familiarisés avec l’optimisation ou pour des applications difficiles à optimiser. L’inconvénient de l’utilisation de la plate-forme avec le mode cache réside dans l’augmentation potentielle de la latence d’accès à la mémoire MCDRAM.

Figure 2.25 – Illustration du mode cache du KNL

— Le mode Flat :

Quand le KNL est configuré en mode Flat, la totalité de la mémoire MCDRAM est adressable, cette mémoire partage l’espace d’adressage physique avec la DDR4 et elle sont toutes les deux "cachées" par le cache L2. En prenant en compte l’architecture NUMA (Non Uniform Memory Acces), la portion de la mémoire MCDRAM est exposée comme un noeud NUMA séparé des cœurs de processeurs, et un deuxième nœud de calcul contenant tous les cœurs et la mémoire DDR4.

L’avantage de cette configuration est que le développeur a plus de flexibilité et peut gérer et contrôler les allocations mémoire dans la MCDRAM contrairement à l’utilisation en mode Cache. Les applications optimisées et qui rentre dans le MCDRAM (<= 16 GB) peuvent être très performantes dans ce mode comparé à un mode Cache.

Toutefois, l’utilisation de la MCDRAM en mémoire adressable nécessite plus d’implication dans le développement comparé à un mode cache, l’utilisation de cette mémoire est complètement gérée par le développeur, qui doit spécifier la portion alloué sur la DDR4 et celle alloué dans la MCDRAM. ce qui rend les optimisations mémoire difficiles surtout dans le cas des applications industrielles complexes.

(33)

Figure 2.26 – Illustration du mode Flat du KNL

— Le mode hybride :

Quand le KNL est utilisé en mode hybride, une portion de la MCDRAm est utilisée comme une mémoire cache et l’autre partie comme mémoire adressable. Le ratio entre les deux est choisi dans les réglages au démarrage. La mémoire adressable se comporte comme dans le mode Flat et la mémoire cache comme le mode cache, ce mode est utile dans le cas de l’utilisation des KNL dans un cluster de calcul avec plusieurs utilisateurs et plusieurs types d’applications, et quand les applications ne sont pas toutes adaptées pour utiliser la MCDRAM comme mémoire adressable.

Figure 2.27 – Illustration du mode hybride du KNL

2.2

Conclusion du chapitre

Les clusters de calcul actuels sont composés de toutes les nouvelles architectures citées dans les paragraphes précédents à savoir les processeurs multi-cœurs avec de plus en plus de transistors et une gravure fine, des cartes graphiques de plus en plus puissantes et finalement les processeurs many-coeurs. La caractérisation et l’optimisation des applications scientifique est vivement nécessaire pour comprendre le fonctionnement et tirer profil de ces architectures complexes. Le but de la première partie de cette thèse est de travailler sur la caractérisation des applications scientifiques pour se posi-tionner par rapport aux performances maximales que nous pouvons atteindre pour un couple machine donnée/application et pour suivre l’évolution des performances au cours des optimisations successives.

(34)

Présentation des cas tests utilisés dans

l’étude

Contents

3.1 Advection 2D . . . 34

3.1.1 Advection 2D : premier ordre en temps et en espace . . . 34

3.1.2 Implémentation . . . 36

3.1.3 advection 2D : second ordre en temps et en espace . . . 43

3.1.4 Cas tests . . . 45

3.1.5 Optimisations dans le code Advection 2D . . . 49

3.2 HPL : High-Performance LINPACK . . . 57

(35)

Dans le but de tester les modèles de performances développés au cours de cette thèse et le portage sur les processeurs Xeon et Xeon Phi d’Intel, nous allons détailler dans cette partie les trois applica-tions qui seront utilisées dans la suite de ce manuscrit. Il s’agit de la mini-application Advection 2D, développée dans le cadre de ce travail, qui servira de prototype pour caractériser et évaluer les codes hydrodynamiques explicites sur architectures Xeon et Xeon Phi, l’application HPL (High performance

LINPACK)1 qui permet de calculer les performances des machines et qui est largement utilisée dans

le domaine du calcul haute performance. Elle est notamment utilisée pour classer les centres de calcul

mondiaux au top5002 et enfin la micro-application STREAM3, qui permet de calculer et valider la

bande passante mémoire des machines.

3.1

Advection 2D

La mini-application advection 2D développée dans ce travail, utilise des méthodes numériques et des équations, qui sont très proches algorithmiquement de celles utilisées par le code de calcul FluxIC [17], développé au laboratoire CMLA de l’École Normale Supérieure de Cachan par l’équipe Simulation des fluides réels, et qui va être utilisée dans la deuxième partie de cette thèse pour la simulation d’im-pacts de vagues. La mini application Advection 2D servira de prototype pour l’évaluation des codes d’hydrodynamique explicites sur les architectures composées de processeurs Xeon et Xeon Phi, elle sera résolue par la méthode des volumes finis avec flux caractéristiques.

Cette application résout l’équation d’advection en deux dimensions, qui décrit la façon dont une quan-tité est transportée dans un courant.

3.1.1 Advection 2D : premier ordre en temps et en espace

∂u

∂t + div(~cu) = 0. (3.1)

L’équation d’advection (3.1) peut être écrite sous forme d’équation conservative, comme suit :

∂tu + div(F (u)) = 0, (3.2)

où u est le vecteur des variables conservatives (dans notre cas la densité) et F (v) le vecteur des flux, qui s’écrit dans notre cas F (u) = ~cu.

Cette équation admet une solution exacte connue, qui s’écrit par exemple en dimension 1 :

u(t, x) = u0(x− ct), c ∈ R, t ≥ 0, x ∈ [0, 1], (3.3)

avec une solution initiale :

u(x, 0) = u0(x). (3.4)

Il s’agit de la propagation sans diffusion à la vitesse constante c du profil initial u0(x).

Nous allons résoudre numériquement cette équation en 2D avec des conditions aux limites périodiques de période 1 sur [0, 1m] × [0, 1m].

Schémas numérique : VFFC Volumes finis

On veut maintenant discrétiser les équations par la méthode des volumes finis.

En intégrant (3.2) sur un domaine Ω de bord Γ, on obtient :

Z Ω (∂tu + div(F (u))) dτ = d dt Z Ω udτ + Z Γ F.ν ds, (3.5) 1. http ://www.netlib.org/benchmark/hpl/ 2. https ://www.top500.org/ 3. http ://www.cs.virginia.edu/stream/

(36)

avec ν, le vecteur unitaire normal à Γ et orienté vers l’extérieur.

Le domaine est discrétisé en espace par N mailles Ωi et en temps (pas de temps ∆t). Sur la maille

i∈ [[1, N]], au temps tn= n∆t, l’équation devient :

|Ωi| Uin+1− Uin dt + Fi X f =1 |Af|φf = 0, (3.6) où Uin= 1 |Ωi| Z Ωi Undτ, (3.7)

et |Ωi| est l’aire de la maille i, Fi est le nombre de bords de la maille i et |Af| est la longueur de

la face f ∈ [[1, Fi]]. Avec φf, le flux numérique à travers la face f de la maille i dans la direction de la

normale extérieure à Ωi, nf, il est donné par :

φf = 1 |Af| Z Γf F · nfds. (3.8) L’équation (3.5) devient : un+1i,j − un i,j ∆tn + 1 ∆x∆y[(φ n

i+1/2,j− φni−1/2,j)∆y + (φni,j+1/2− φni,j−1/2)∆x] = 0. (3.9)

La méthode des volumes finis nous permet donc d’exprimer les grandeurs conservatives au temps tn+1 en fonction des grandeurs au temps tn et du flux φf.

En utilisant la méthode des volumes finis à Flux Caractéristiques VFFC développée dans [43], le flux numérique est calculé de la façon suivante :

φ(Γ, nf) =  F (Ul) + F (Ur) 2 − sign  J(UΓ, nlr)F(Ur )− F (Ul) 2  · nlr, (3.10)

où J(UΓ, nlr) est définie par :

J(UΓ, nlr) =

∂F (UΓ).nlr

∂U , (3.11)

et UΓ est égal au vecteur U sur la surface commune aux deux cellules, Cl la cellule de gauche (à

laquelle est associée Ul) et la cellule de droite Cr (à laquelle est associée Ur) et qui se calcule comme

suit :

UΓ=

V olrUr+ V ollUl

V olr+ V oll

, (3.12)

avec V olr et V oll les aires des cellules Cr et Clrespectivement, nlr le vecteur normal à Γ, dirigé de

Cl vers Cr et sign



J(UΓ, nlr)



est la matrice signe donnée par : signJ(UΓ, nlr)



= R(UΓ.nlr) diag(sign(λ(UΓ.nlr)) L(UΓ.n), (3.13)

avec λ(UΓ.nlr) les valeurs propre de J(UΓ, nlr) associés aux matrices des vecteurs propres à droite et

à gauche respectivement, R(UΓ.nlr) et L(UΓ.nlr).

Pour un flux physique F donné, dans notre cas (advection) F = ~c.u, le flux numérique est défini par :

φni+1/2,j = F (un i,j) + F (uni+1,j) 2 − sign(~c.nlr) F (uni+1,j)− F (un i,j) 2  .nlr (3.14)

(37)

Splitting directionnel

Pour calculer les grandeurs un+1

i,j en fonction des valeurs du pas de temps précédent, on utilise une

méthode qui découple l’équation (3.9) en deux directions. Nous allons introduire un temps intermédiaire

t∗ pour avoir les équations suivantes :          un∗ i,j− uni,j ∆tn + 1 ∆x h φni+1/2,j+ φni−1/2,ji= 0, un+1i,j − un∗ i,j ∆tn + 1 ∆y h φni,j+1/2+ φni,j−1/2i= 0. (3.15) Cette décomposition, nous permet de transformer notre problème 2D en deux équations 1D. Ce qui va faciliter la parallélisation et l’accès aux tableaux dans la version parallèle du code advection 2D décrite plus loin.

Stabilité du schéma Le schéma numérique présenté dans le paragraphe précédent est explicite,

d’ordre 1 en temps et en espace, pour assurer la stabilité du schéma, le pas temps est calculé en respectant la condition de stabilité CFL (Courant-Friedrichs-Lewy) suivante :

dt≤ min  V oli |Af| maxk|(λi)k|  . (3.16)

Dans notre cas |(λi)k| est la vitesse c(i)k dans la cellule k et selon la direction i.

3.1.2 Implémentation

Nous avons implémenté un solveur 2D d’advection avec la méthode VFFC décrite ci-dessus en Fortran 90 avec plusieurs niveaux de parallélisme.

Parallélisation MPI

Nous utilisons la bibliothèque MPI (Message Passing Interface) pour la décomposition du domaine de calcul, qui représentera dans le cadre de cette étude, un maillage cartésien avec un pas d’espace constant.

Le schéma développé dans le paragraphe précédent, est un schéma dit à 5 points, c’est-à-dire pour

connaître la valeur de un+1

i,j à l’instant tn, nous avons avons besoin des 4 autres points voisins du

maillage à l’instant tnaux positions suivantes :

Figure 3.1 – Schémas à 5 points

Le modèle que nous avons choisi pour cette parallélisation est un modèle SIMD (Single Instruc-tion Multiple Data). Un seul programme s’exécute sur chaque sous domaine, et donc il y a autant de processus MPI que de sous domaine. Pour chaque sous domaine, nous avons besoin de connaître les positions de ses 4 voisins pour pouvoir échanger les informations entres les voisins pendant chaque pas de temps.

À l’aide des fonctionnalités MPI de création de grilles, nous avons défini une topologie virtuelle de type cartésienne, qui fait correspondre les sous domaines de calcul à une grille de processus et permet de

Figure

Updating...

Sujets connexes :