• Aucun résultat trouvé

Résolution de systèmes linéaires et non linéaires creux sur grappes de GPUs

N/A
N/A
Protected

Academic year: 2021

Partager "Résolution de systèmes linéaires et non linéaires creux sur grappes de GPUs"

Copied!
147
0
0

Texte intégral

(1)

HAL Id: tel-00947627

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

Submitted on 17 Feb 2014

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.

sur grappes de GPUs

Lilia Ziane Khodja

To cite this version:

Lilia Ziane Khodja. Résolution de systèmes linéaires et non linéaires creux sur grappes de GPUs. Autre [cs.OH]. Université de Franche-Comté, 2013. Français. �NNT : 2013BESA2006�. �tel-00947627�

(2)

é c o l e d o c t o r a l e s c i e n c e s p o u r l ’ i n g é n i e u r e t m i c r o t e c h n i q u e s

U N I V E R S I T É D E F R A N C H E - C O M T É

R ´esolution de syst `emes lin ´eaires et

non lin ´eaires creux sur grappes de

GPUs

(3)
(4)

é c o l e d o c t o r a l e s c i e n c e s p o u r l ’ i n g é n i e u r e t m i c r o t e c h n i q u e s

U N I V E R S I T É D E F R A N C H E - C O M T É

TH `

ESE pr ´esent ´ee par

Lilia

Z

IANE

K

HODJA

pour obtenir le

Grade de Docteur de

l’Universit ´e de Franche-Comt ´e

Sp ´ecialit ´e :Informatique

R ´esolution de syst `emes lin ´eaires et non lin ´eaires

creux sur grappes de GPUs

Soutenue le 07 juin 2013 devant le Jury :

Jens GUSTEDT Rapporteur Directeur de recherche `a l’INRIA Nancy - Grand Est Fr ´ed ´ericMAGOULES` Rapporteur Professeur `a l’ ´Ecole Centrale Paris

Pierre-CyrilleHEAM Examinateur Professeur `a l’Universit ´e de Franche-Comt ´e

PierreSPITERI´ Examinateur Professeur `a l’IRIT-ENSEEIHT Toulouse MingCHAU Examinateur Ing ´enieur-Chercheur `a ASA Toulouse Rapha ¨elCOUTURIER Directeur Professeur `a l’Universit ´e de Franche-Comt ´e

JacquesBAHI Co-Directeur Professeur `a l’Universit ´e de Franche-Comt ´e

(5)
(6)

Table des mati `eres 8

Liste des figures 11

Liste des tableaux 14

Liste des algorithmes 15

Remerciements 17

Introduction 21

1 Architectures de calcul parall `ele 25

1.1 Calcul parall `ele . . . 26

1.1.1 Classification des architectures parall `eles . . . 26

1.1.1.1 Instruction unique, donn ´ee unique (SISD) . . . 27

1.1.1.2 Instructions multiples, donn ´ee unique (MISD) . . . 27

1.1.1.3 Instruction unique, donn ´ees multiples (SIMD) . . . 27

1.1.1.4 Instructions multiples, donn ´ees multiples (MIMD) . . . 27

1.1.2 M ´emoires des architectures parall `eles . . . 27

1.1.2.1 M ´emoire partag ´ee . . . 28

1.1.2.2 M ´emoire distribu ´ee . . . 28

1.1.3 Plateformes de calcul parall `ele distribu ´ees . . . 29

1.1.3.1 Grappes . . . 29

1.1.3.2 Grilles . . . 29

1.1.4 Environnement de programmation parall `ele MPI . . . 30

1.2 Unit ´e de traitement graphique GPU . . . 31

1.2.1 Architecture mat ´erielle GPU . . . 32

1.2.2 Programmation multithread ´ee CUDA . . . 36

1.2.3 Instructions d’optimisation des performances GPU . . . 38

(7)

1.2.3.2 Utilisation des m ´emoires GPU . . . 40

1.2.4 Plateformes de calcul parall `ele multi-GPUs . . . 41

1.3 Conclusion . . . 42

2 R ´esolution de syst `emes lin ´eaires creux 45 2.1 M ´ethodes de r ´esolution . . . 45

2.1.1 M ´ethodes directes . . . 46

2.1.2 M ´ethodes it ´eratives . . . 47

2.1.2.1 M ´ethodes stationnaires . . . 48

2.1.2.2 M ´ethodes non stationnaires . . . 49

2.1.2.3 M ´ethodes multigrilles . . . 50

2.2 Formats de stockage des matrices creuses . . . 52

2.2.1 COO . . . 53

2.2.2 CSR vs. CSC . . . 53

2.2.3 ELLPACK/ITPACK . . . 55

2.2.4 HYB . . . 56

2.3 Parall ´elisation des m ´ethodes it ´eratives . . . 58

2.3.1 M ´ethodes it ´eratives SISC . . . 58

2.3.2 M ´ethodes it ´eratives SIAC . . . 59

2.3.3 M ´ethodes it ´eratives AIAC . . . 60

2.4 Conclusion . . . 60

3 Mise en œuvre de solveurs lin ´eaires creux sur des grappes GPU 63 3.1 M ´ethodes it ´eratives de Krylov . . . 63

3.1.1 Gradient conjugu ´e . . . 64

3.1.2 G ´en ´eralisation de la m ´ethode de minimisation du r ´esidu . . . 65

3.2 Solveurs lin ´eaires creux sur un GPU . . . 68

3.2.1 Mise en œuvre sur un GPU . . . 68

3.2.2 Exp ´erimentations sur un CPU ´equip ´e d’un GPU . . . 71

3.3 Solveurs lin ´eaires creux sur une grappe GPU . . . 74

3.3.1 Mise en œuvre parall `ele sur une grappe GPU . . . 75

3.3.1.1 Partitionnement de donn ´ees . . . 75

3.3.1.2 Calcul des d ´ependances de donn ´ees . . . 76

3.3.1.3 R ´esolution parall `ele . . . 77

3.3.2 Exp ´erimentations sur une grappe GPU . . . 80

(8)

3.3.3.1 Format de stockage compress ´e des vecteurs creux partag ´es 85

3.3.3.2 Partitionnement hypergraphe . . . 89

3.3.4 Exp ´erimentations sur une grappe GPU h ´et ´erog `ene . . . 95

3.4 Conclusion . . . 98

4 Mise œuvre de solveurs non lin ´eaires creux des probl `emes de l’obstacle sur des grappes GPU 101 4.1 Probl `eme de l’obstacle . . . 102

4.1.1 Mod ´elisation . . . 102

4.1.2 Discr ´etisation . . . 102

4.2 M ´ethodes it ´eratives parall `eles . . . 103

4.2.1 Pr ´eliminaires . . . 104

4.2.2 M ´ethode parall `ele de Richardson projet ´ee . . . 105

4.2.3 M ´ethode parall `ele de relaxation par blocs projet ´ee . . . 106

4.2.4 Convergence des m ´ethodes . . . 106

4.3 Mise en œuvre parall `ele sur une grappe GPU . . . 107

4.3.1 Mise en œuvre sur un GPU . . . 107

4.3.2 Parall ´elisation . . . 113

4.4 Exp ´erimentations sur une grappe GPU . . . 116

4.5 Utilisation de la m ´ethode de num ´erotation rouge-noir . . . 119

4.5.1 Mise œuvre sur une grappe GPU . . . 119

4.5.2 Exp ´erimentations . . . 122

4.6 Conclusion . . . 123

5 M ´ethodes parall `eles `a deux niveaux sur GPUs 125 5.1 M ´ethodes de multi-d ´ecomposition . . . 125

5.2 M ´ethode `a deux niveaux avec GMRES . . . 127

5.2.1 Formalisme math ´ematique . . . 127

5.2.2 Mise en œuvre parall `ele . . . 128

5.2.3 Exp ´erimentations . . . 130

5.3 Conclusion . . . 132

(9)

Publications 137

(10)

1.1 Exemple d’architecture parall `ele `a m ´emoire partag ´ee . . . 28

1.2 Exemple d’architecture parall `ele `a m ´emoire distribu ´ee . . . 28

1.3 Exemple de grappe de calcul . . . 29

1.4 Exemple de grille de calcul . . . 30

1.5 Exemples de routines de communications collectives MPI . . . 32

1.6 Historique des architectures mat ´erielles GPU . . . 32

1.7 Exemple de CPU ´equip ´e d’un GPU . . . 33

1.8 Comparaison du nombre de cœurs dans un CPU et dans un GPU . . . 33

1.9 Hi ´erarchie de m ´emoires GPU . . . 33

1.10 Performance th ´eorique en Gflops/s des GPUs Tesla de diff ´erentes archi-tectures . . . 35

1.11 Bande passante m ´emoire th ´eorique en Go/s des GPUs Tesla de diff ´erentes architectures . . . 35

1.12 Rapport performance th ´eorique en double pr ´ecision et consommation d’ ´energie en Gflops/Watt . . . 36

1.13 Exemple d’ex ´ecution des blocs de threads `a deux dimensions sur un GPU `a 3 multiprocesseurs ayant chacun 8 cœurs . . . 37

1.14 Exemple d’ex ´ecution d’un warp par un multiprocesseur `a 8 cœurs . . . 38

1.15 Exemples d’acc `es m ´emoire coalescent et non coalescent `a la m ´emoire globale par un warp. Un mot m ´emoire de 4 octets par thread `a partir de l’adresse 128 . . . 41

2.1 Format de stockage COO . . . 53

2.2 Format de stockage CSR et CSC . . . 54

2.3 Format de stockage ELL . . . 56

2.4 Format de stockage HYB . . . 57

2.5 Exemple de sch ´ema d’ex ´ecution d’un solveur it ´eratif parall `ele SISC avec deux processeurs . . . 59

2.6 Exemple de sch ´ema d’ex ´ecution d’un solveur it ´eratif parall `ele SIAC avec deux processeurs . . . 59

2.7 Exemple de sch ´ema d’ex ´ecution d’un solveur it ´eratif parall `ele AIAC avec deux processeurs . . . 60

(11)

3.1 Exemple de programme CUDA pour le calcul d’un produit scalaire-vecteur . 69 3.2 Routines CUBLAS utilis ´ees pour la mise en œuvre sur un GPU . . . 71 3.3 Structures des matrices creuses choisies dans la collection de l’universit ´e

de Floride . . . 72 3.4 Exemple de partitionnement de la matrice creuse A, le vecteur solution x

et le vecteur second membre b en quatre portions . . . 75 3.5 Code de la fonction des ´echanges de donn ´ees entre nœuds voisins dans

la grappe GPU . . . 80 3.6 Sch ´ema g ´en ´eral de la grappe GPU de tests . . . 81 3.7 Exemple de g ´en ´eration de matrices creuses `a structures bandes par

quatre nœuds de calcul . . . 83 3.8 Exemple d’ ´echange de donn ´ees entre un nœud 1 et ses trois voisins 0, 2 et 3 86 3.9 Code de la nouvelle fonction des ´echanges de donn ´ees entre nœuds

voi-sins dans une grappe GPU . . . 87 3.10 R ´eorganisation des colonnes d’une sous-matrice creuse locale . . . 88 3.11 Exemple de g ´en ´eration de matrices creuses ayant cinq bandes par quatre

nœuds de calcul . . . 90 3.12 Exemple de partitionnement hypergraphe d’une matrice creuse d ´ecoup ´ee

entre trois nœuds de calcul . . . 92 3.13 Passage `a l’ ´echelle des algorithmes parall `eles CG et GMRES sur une

grappe GPU pour la r ´esolution des syst `emes lin ´eaires creux . . . 97 4.1 D ´ecomposition d’un sous-probl `eme en nz portions . . . 109 4.2 Squelettes des codes d’un kernel GPU et d’une Fonction CPU . . . 110 4.3 Coefficients de la matrice de discr ´etisation A dans un domaine

tridimen-sionnel . . . 110 4.4 Kernels GPU du solveur Richardson projet ´e . . . 112 4.5 Calcul d’un ´el ´ement de vecteur par la m ´ethode Richardson projet ´ee . . . . 113 4.6 Kernels GPU du solveur de relaxation par blocs projet ´e . . . 114 4.7 Calcul d’un ´el ´ement de vecteur par la m ´ethode de relaxation par blocs

projet ´ee . . . 115 4.8 Partitionnement de donn ´ees d’un probl `eme de l’obstacle tridimensionnel

en N = 3 × 4 sous-probl `emes . . . 115 4.9 Num ´erotation rouge-noir pour le calcul des ´el ´ements de vecteur dans un

domaine tridimensionnel . . . 120 4.10 Kernels GPU modifi ´es du solveur Richardson projet ´ee . . . 121 4.11 Passage `a l’ ´echelle des algorithmes parall `eles synchrone et asynchrone

de la m ´ethode Richardson rouge-noir projet ´ee . . . 123 5.1 Exemple de multi-d ´ecomposition sans recouvrement entre trois processeurs.126

(12)
(13)
(14)

3.1 Principales caract ´eristiques des matrices choisies de la collection de l’uni-versit ´e de Floride . . . 73 3.2 Performances du solveur CG sur un cœur CPU vs. sur un GPU . . . 73 3.3 Performances du solveur GMRES sur un cœur CPU vs. sur un GPU . . . . 73 3.4 Performances du solveur parall `ele CG sur une grappe de 24 cœurs CPU

vs. sur une grappe de 12 GPUs . . . 81 3.5 Performances du solveur parall `ele GMRES sur une grappe de 24 cœurs

CPU vs. sur une grappe de 12 GPUs . . . 82 3.6 Principales caract ´eristiques des matrices creuses g ´en ´er ´ees `a structure

bande . . . 84 3.7 Performances du solveur parall `ele CG pour la r ´esolution des syst `emes

lin ´eaires creux `a matrices bandes sur une grappe de 24 cœurs CPU vs. sur une grappe de 12 GPUs . . . 84 3.8 Performances du solveur parall `ele GMRES pour la r ´esolution des

syst `emes lin ´eaires creux `a matrices bandes sur une grappe de 24 cœurs CPU vs. sur une grappe de 12 GPUs . . . 84 3.9 Performances du solveur parall `ele CG utilisant le format de stockage

com-press ´e des vecteurs creux pour la r ´esolution des syst `emes lin ´eaires creux `a matrices bandes sur une grappe de 24 cœurs CPU vs. sur une grappe de 12 GPUs . . . 88 3.10 Performances du solveur parall `ele GMRES utilisant un format de stockage

compress ´e des vecteurs creux pour la r ´esolution des syst `emes lin ´eaires creux `a matrices bandes sur une grappe de 24 cœurs CPU vs. sur une grappe de 12 GPUs . . . 89 3.11 Principales caract ´eristiques des matrices creuses de tests ayant cinq bandes 90 3.12 Performances du solveur parall `ele CG utilisant un format de stockage

com-press ´e des vecteurs creux pour la r ´esolution des syst `emes lin ´eaires creux associ ´es `a des matrices `a cinq bandes sur une grappe de 24 cœurs CPU vs. sur une grappe de 12 GPUs . . . 90 3.13 Performances du solveur parall `ele GMRES utilisant un format de stockage

compress ´e des vecteurs creux pour la r ´esolution des syst `emes lin ´eaires creux associ ´es `a des matrices `a cinq bandes sur une grappe de 24 cœurs CPU vs. sur une grappe de 12 GPUs . . . 91

(15)

3.14 Performances du solveur parall `ele CG utilisant un partitionnement hyper-graphe et un format de stockage compress ´e des vecteurs creux pour la r ´esolution des syst `emes lin ´eaires creux associ ´es `a des matrices `a cinq bandes sur une grappe de 24 cœurs CPU vs. sur une grappe de 12 GPUs 93 3.15 Performances du solveur parall `ele GMRES utilisant un partitionnement

hy-pergraphe et un format de stockage compress ´e des vecteurs creux pour la r ´esolution des syst `emes lin ´eaires creux associ ´es `a des matrices `a cinq bandes sur une grappe de 24 cœurs CPU vs. sur une grappe de 12 GPUs 94 3.16 Volume total de communications entre 12 nœuds de calcul sans et avec

utilisation de la m ´ethode de partitionnement hypergraphe . . . 94 3.17 Performances du solveur parall `ele CG utilisant un format de stockage

com-press ´e des vecteurs creux pour la r ´esolution des syst `emes lin ´eaires creux associ ´es `a des matrices `a structure bande sur une grappe de 32 cœurs CPU vs. sur une grappe de 14 GPUs . . . 96 3.18 Performances du solveur parall `ele GMRES utilisant un format de stockage

compress ´e des vecteurs creux pour la r ´esolution des syst `emes lin ´eaires creux associ ´es `a des matrices `a structure bande sur une grappe de 32 cœurs CPU vs. sur une grappe de 14 GPUs . . . 96 3.19 Performances du solveur parall `ele CG utilisant un partitionnement

hyper-graphe et un format de stockage compress ´e des vecteurs creux pour la r ´esolution des syst `emes lin ´eaires creux associ ´es `a des matrices `a cinq bandes sur une grappe de 32 cœurs CPU vs. sur une grappe de 14 GPUs 96 3.20 Performances du solveur parall `ele GMRES utilisant un partitionnement

hy-pergraphe et un format de stockage compress ´e des vecteurs creux pour la r ´esolution des syst `emes lin ´eaires creux associ ´es `a des matrices `a cinq bandes sur une grappe de 32 cœurs CPU vs. sur une grappe de 14 GPUs 97 3.21 Caract ´eristiques principales de la matrice de tests utilis ´ee pour ´etudier le

passage `a l’ ´echelle des algorithmes parall `eles CG et GMRES . . . 97 4.1 Temps d’ex ´ecution en secondes des algorithmes parall `eles des m ´ethodes

Richardson projet ´ee et de relaxation par blocs projet ´ee sur une grappe de 24cœurs CPU . . . 117 4.2 Temps d’ex ´ecution en secondes des algorithmes parall `eles des m ´ethodes

Richardson projet ´ee et de relaxation par blocs projet ´ee sur une grappe de 12GPUs . . . 117 4.3 Ratios entre le temps d’ex ´ecution sur un grappe de 24 cœurs CPU et le

temps d’ex ´ecution sur une grappe de 12 GPUs . . . 118 4.4 Temps d’ex ´ecution en secondes du solveur parall `ele Richardson projet ´ee

utilisant la num ´erotation rouge-noir sur une grappe de 12 GPUs . . . 122 5.1 Performances des algorithmes synchrone et asynchrone de la m ´ethode

`a deux niveaux avec GMRES sur diff ´erentes architectures de grappes de GPUs . . . 131

(16)

1 Algorithme g ´en ´eral d’un solveur it ´eratif stationnaire . . . 48

2 Algorithme g ´en ´eral d’une m ´ethode bigrille . . . 52

3 Multiplication matrice-vecteur avec le format COO . . . 54

4 Multiplication matrice-vecteur avec le format CSR . . . 55

5 Multiplication matrice-vecteur avec le format CSC . . . 55

6 Multiplication matrice-vecteur avec le format ELL . . . 56

7 Multiplication matrice-vecteur avec le format HYB . . . 57

8 Algorithme du gradient conjugu ´e pr ´econditionn ´e . . . 65

9 Algorithme du GMRES pr ´econditionn ´e . . . 67

10 Algorithme parall `ele du gradient conjugu ´e pr ´econditionn ´e . . . 78

11 Algorithme parall `ele du GMRES pr ´econditionn ´e . . . 79

12 Algorithme g ´en ´eral pour la r ´esolution des syst `emes non lin ´eaires du probl `eme de l’obstacle . . . 107

13 Algorithme global de la fonction Resoudre . . . 108

14 Algorithme de la m ´ethode de multi-d ´ecomposition . . . 126

(17)
(18)

A l’issue de ce travail, je tiens `a exprimer toute ma gratitude `a l’ensemble des per-sonnes qui ont contribu ´e, chacune `a sa mani `ere, `a l’accomplissement de cette th `ese.

Je tiens `a exprimer mes plus vifs remerciements `a mes Directeurs Rapha ¨el Cou-turier et Jacques Bahi. Les mots me manquent pour exprimer ma gratitude. Leurs comp ´etences, leurs rigueurs scientifiques et leurs clairvoyances m’ont beaucoup appris. Je les remercie pour leurs encadrements et conseils avis ´es qu’ils ont su me prodiguer tout au long de ces trois ann ´ees et aussi pour leurs qualit ´es humaines chaleureuses, et surtout pour la confiance qu’ils m’ont accord ´ee.

Je remercie vivement Pierre Spit ´eri, Professeur `a l’IRIT-ENSEEIHT, et Ming Chau, Ing ´enieur-Chercheur `a ASA de Toulouse, pour leur collaboration dans mes travaux de recherche. Je souhaite n ´eanmoins remercier plus particuli `erement Pierre pour son ind ´efectible soutien et encouragements aussi bien sur le plan humain que scientifique.

J’adresse ´egalement mes sinc `eres remerciements `a Jens Gustetd, Directeur de Re-cherche Inria Lorraine, et Fr ´ed ´eric Magoul `es, Professeur `a l’ ´Ecole Centrale de Paris, pour m’avoir fait l’honneur d’accepter d’ ˆetre rapporteurs de cette th `ese. Je voudrais aussi re-mercier Pierre-Cyrille Heam, Professeur `a l’Universit ´e de Franche-Comt ´e, qui m’a fait l’honneur de pr ´esider le jury de cette th `ese.

J’adresse mes vifs remerciements `a la R ´egion de Franche-Comt ´e qui a financ ´e cette th `ese.

Ma reconnaissance et mes remerciements vont aux membres de l’ ´equipe AND (Algo-rithmique Num ´erique et Distribu ´ee) pour le climat sympathique et chaleureux dans lequel il m’ont permis de travailler. Merci donc `a Bassam Alkindy, Claude Charr, Jean-Franc¸ois Couchot, Karine Deschinkel, Huu Quan Do, St ´ephane Domas, Nicolas Friot, Arnaud Giersch, Christophe Guyeux, Mourad Hakem, Ali Kadhum Idrees, David Laiya-mani, Abdallah Makhoul, Ahmed Mostefaoui, Gilles Perrot et Michel Salomon. Je voudrais aussi exprimer mes remerciements et amiti ´es `a Fabrice Ambert, Jean-Luc Anthoine, In-grid Couturier, B ´eatrice Domenge, Kamel Mazouzi et Patricia Py pour leur bonne humeur et leur disponibilit ´e.

Avant de terminer, je tiens `a remercier notamment mes chers amis : Marie-Antoinette et David Jamin, C ´ecile et Alain Mignot, S ´ebastien Miqu ´ee et Maria Delia Valera Castro qui ont partag ´e mes espoirs et mes inqui ´etudes, qui m’ont r ´econfort ´ee dans les moments difficiles et avec qui j’ai partag ´e d’inoubliables moments de d ´etente. Je vous remercie tous chaleureusement.

Enfin, les mots les plus simples ´etant les plus forts, j’adresse toute mon affection `a ma famille et, en particulier, `a mes parents pour leurs soutien et encouragements au cours de ces longues ann ´ees d’ ´etudes. Malgr ´e les milliers de kilom `etres qui nous s ´eparent, leur amour, leur tendresse et leur confiance me portent et me guident tous les jours. Merci, Maman, Papa, pour avoir fait de moi ce que je suis aujourd’hui.

(19)
(20)

help of its mahout, will come to the idea of generating the sequence x0, x1= g(x0), x2 = g(x1), etc. I will not be far from thinking, me too, at the possibility of making the computers to “think”.

Jean Dieudonn ´e

L’esprit qui invente est toujours m ´econtent de ses progr `es, parce qu’il voit au-del `a.

Jean Le Rond d’Alembert

Un chercheur doit avoir conscience du peu de ce qu’il a trouv ´e ; mais il a droit d’estimer que ce peu est im-mense.

(21)
(22)

L

ES syst `emes d’ ´equations lin ´eaires ou non lin ´eaires creux de tr `es grandes tailles apparaissent souvent au cœur des simulations num ´eriques scientifiques ou indus-trielles. Ils permettent de mod ´eliser de nombreux probl `emes complexes dans diff ´erents domaines, tels que la biologie, la finance, la physique ou la climatologie. Cependant, la r ´esolution de ce type de syst `emes est un processus tr `es co ˆuteux en termes de temps d’ex ´ecution et de consommation d’espace m ´emoire. En effet, les syst `emes lin ´eaires ou non lin ´eaires trait ´es par ces applications sont de tr `es grandes tailles et poss `edent beau-coup de coefficients nuls, et cet aspect creux engendre des acc `es irr ´eguliers `a la m ´emoire pour la lecture des coefficients non nuls.

Il existe dans le jargon de l’analyse num ´erique diff ´erentes m ´ethodes de r ´esolution qui peuvent ˆetre class ´ees en deux grandes familles : directes et it ´eratives. Cependant, le choix d’une m ´ethode est g ´en ´eralement guid ´e par les propri ´et ´es du syst `eme `a r ´esoudre, la pr ´ecision de calcul et la vitesse de r ´esolution souhait ´ees. Les m ´ethodes directes ont sou-vent ´et ´e pr ´ef ´er ´ees aux m ´ethodes it ´eratives, en raison de leur robustesse et de leur com-portement pr ´evisible. Cependant, depuis les ann ´ees quatre vingt, les m ´ethodes it ´eratives ont rapidement gagn ´e en popularit ´e dans de nombreux domaines du calcul scientifique. Ceci est d ˆu en grande partie `a la complexit ´e accrue et `a la taille croissante de la nouvelle g ´en ´eration de syst `emes d’ ´equations creux pour lesquels les m ´ethodes directes sont sou-vent inefficaces. De plus, les m ´ethodes it ´eratives sont beaucoup plus faciles `a mettre en œuvre et supportent mieux le passage `a l’ ´echelle sur les ordinateurs parall `eles que les m ´ethodes directes.

Aujourd’hui, le calcul parall `ele est devenu un enjeu majeur pour la r ´esolution de syst `emes lin ´eaires et non lin ´eaires creux de tr `es grandes tailles. Ceci gr ˆace `a la puis-sance de calcul et `a la capacit ´e de stockage des ordinateurs parall `eles actuels, ainsi qu’ `a la disponibilit ´e de diff ´erents langages et environnements de programmation parall `ele tel que le standard de communication MPI. Il existe diff ´erents types d’architectures de calculateurs parall `eles, `a commencer par les processeurs multicœurs jusqu’ `a l’intercon-nexion de plusieurs ordinateurs physiquement adjacents ou g ´eographiquement distants par un r ´eseau de communication. Au cours des derni `eres ann ´ees, les nouvelles architec-tures comportant des acc ´el ´erateurs mat ´eriels (GPU, FPGA, Xeon Phi, etc) sont devenues tr `es attractives pour le calcul parall `ele haute performance. Plus particuli `erement, celles ´equip ´ees de processeurs graphiques GPUs qui sont dot ´es d’une architecture mat ´erielle massivement parall `ele. En effet, l’ ´evolution de la technologie GPGPU (General-Purpose computing on Graphics Processing Units) a permis d’exploiter la puissance de calcul des GPUs pour le traitement des t ˆaches intensives. Cependant, les calculateurs parall `eles ´equip ´es de GPUs pr ´esentent de nouvelles difficult ´es de programmation et d’adaptation des algorithmes de r ´esolution `a leurs architectures.

Dans cette th `ese, nous nous int ´eressons `a la conception d’algorithmes parall `eles pour les grappes de calcul ´equip ´ees de processeurs graphiques GPUs. Pour cela, nous utili-sons une programmation parall `ele h ´et ´erog `ene GPGPU CUDA/MPI. Cette th `ese est

(23)

orga-nis ´ee comme suit.

Dans le Chapitre 1, nous pr ´esentons les diff ´erentes architectures parall `eles de

pro-cesseurs classiques, ainsi que celles des nouveaux calculateurs parall `eles ´equip ´es de GPUs. De plus, nous d ´ecrivons le standard de communication MPI et l’environnement de programmation CUDA pour les GPUs.

Dans le Chapitre 2, nous pr ´esentons les diff ´erentes m ´ethodes num ´eriques de

r ´esolution, les formats de stockage des matrices creuses et la parall ´elisation des m ´ethodes it ´eratives sur des calculateurs parall `eles.

Les trois chapitres suivants pr ´esentent nos contributions `a la mise en œuvre des algorithmes parall `eles, synchrones ou asynchrones, des m ´ethodes it ´eratives pour la r ´esolution de syst `emes lin ´eaires ou non lin ´eaires creux de tr `es grandes tailles sur des grappes de GPUs.

Dans leChapitre 3, nous proposons des mises en œuvre des algorithmes it ´eratifs

pa-rall `eles pour la r ´esolution de syst `emes lin ´eaires creux sur une grappe GPU. Nous utilisons les m ´ethodes it ´eratives de Krylov suivantes : le gradient conjugu ´e (CG) qui donne de bons r ´esultats de r ´esolution pour les syst `emes lin ´eaires sym ´etriques et la g ´en ´eralisation de la m ´ethode de minimisation du r ´esidu (GMRES) qui est plus adapt ´ee aux syst `emes lin ´eaires asym ´etriques. La mise en œuvre des deux m ´ethodes sur une grappe GPU impose la pa-rall ´elisation de leurs algorithmes et la gestion des interactions entre les diff ´erents nœuds de calcul de la grappe. En fait, toutes les op ´erations parall `eles sont ex ´ecut ´ees par les GPUs et la synchronisation des calculs locaux est assur ´ee par les CPUs via les routines de communications MPI. L’op ´eration la plus importante des m ´ethodes CG et GMRES est la multiplication parall `ele matrice creuse-vecteur. Elle n ´ecessite un temps de calcul im-portant et des communications de donn ´ees entre les nœuds GPUs pour la construction du vecteur global requis pour la multiplication. Toutefois, il est indispensable de minimiser le nombre de communications qui s’av `erent tr `es co ˆuteuses sur une grappe GPU. Pour minimiser les co ˆuts de communication, nous proposons d’utiliser un format de stockage compress ´e pour les vecteurs de donn ´ees partag ´ees et un partitionnement hypergraphe pour r ´eduire le nombre de d ´ependances de donn ´ees entre les nœuds GPUs de la grappe. LeChapitre 4 pr ´esente nos travaux sur la r ´esolution de syst `emes non lin ´eaires creux

issus de la discr ´etisation spatiale des probl `emes de l’obstacle. Ce type de probl `emes intervient, par exemple, dans les math ´ematiques financi `eres ( ´evaluation des options am ´ericaines) ou dans la simulation des ph ´enom `enes physiques (m ´ecanique des fluides). Pour la r ´esolution de ces syst `emes, nous utilisons les m ´ethodes it ´eratives : Richard-son et relaxation par blocs projet ´ees. La m ´ethode RichardRichard-son projet ´ee est bas ´ee sur les it ´erations de la m ´ethode Jacobi par points, tandis que celle de relaxation par blocs pro-jet ´ee est bas ´ee sur les it ´erations de la m ´ethode Gauss-Seidel par blocs. Par le biais de ces diff ´erentes m ´ethodes, nous voulons ´etudier le comportement de deux algorithmes it ´eratifs, plus ou moins, oppos ´es sur une grappe GPU. Pour chacune de ces m ´ethodes, nous d ´eveloppons deux algorithmes parall `eles, synchrone et asynchrone, adapt ´es aux grappes GPUs. Notre objectif est d’ ´etudier le passage `a l’ ´echelle des deux versions pa-rall `eles (synchrone et asynchrone) sur une grappe de GPUs. Afin d’am ´eliorer les per-formances de r ´esolution des probl `emes de l’obstacle, nous proposons de combiner les approches de r ´esolution des deux m ´ethodes Richardson et relaxation par blocs projet ´ees. Nous appliquons une technique de num ´erotation rouge-noir aux algorithmes parall `eles de la m ´ethode Richardson projet ´ee. En effet, cette technique est une variante de la m ´ethode Gauss-Seidel moins stricte (plus facile `a parall ´eliser) qui permet d’acc ´el ´erer la

(24)

conver-gence (effectuer moins d’it ´erations) sur la grappe GPU.

Dans leChapitre 5, nous nous int ´eressons aux grappes g ´eographiquement distantes

pour la r ´esolution de syst `emes lin ´eaires creux de tr `es grandes tailles. Dans ce contexte, nous utilisons des m ´ethodes de multi-d ´ecomposition `a deux niveaux. En se basant sur ces m ´ethodes, nous pouvons construire des algorithmes parall `eles `a gros grains permet-tant de r ´eduire les ´echanges de donn ´ees entre les nœuds de calcul. Ceci est un avantage pour les architectures distribu ´ees compos ´ees de nœuds de calcul g ´eographiquement dis-tants et interconnect ´es par un r ´eseau de communication `a forte latence. Nous proposons des mises en œuvre synchrone et asynchrone pour une m ´ethode de multi-d ´ecomposition `a deux niveaux utilisant la m ´ethode it ´erative parall `ele GMRES adapt ´ee aux grappes GPUs. Nous utilisons une m ´ethode de multi-d ´ecomposition qui consiste `a d ´ecouper le syst `eme lin ´eaire creux en sous-syst `emes de plus petites tailles disjoints et sans recou-vrement. Notre objectif est de combiner la performance des it ´erations synchrones dans un contexte local pour la r ´esolution des sous-syst `emes lin ´eaires et la souplesse des it ´erations asynchrones entre les grappes GPUs pour r ´esoudre la globalit ´e du syst `eme lin ´eaire creux.

Enfin, nous concluons et donnons les perspectives aux travaux de recherche men ´es dans cette th `ese.

(25)
(26)

1

A

RCHITECTURES DE CALCUL

PARALL

ELE

`

A

U cours de ces derni `eres ann ´ees, le calcul haute performance (HPC) est devenu un enjeu majeur dans diff ´erents domaines de recherche, par exemple l’imagerie et les diagnostics m ´edicaux, les math ´ematiques financi `eres ou l’exploration p ´etroli `ere. Il fait r ´ef ´erence aux calculs intensifs des applications n ´ecessitant des quantit ´es ´enormes en ressources de calcul (puissance de calcul, d ´ebit m ´emoire, espace de stockage, etc), pour une r ´esolution efficace et rapide de diff ´erents probl `emes scientifiques ou industriels. Ainsi, ceci se traduit par l’ex ´ecution de ces applications sur des architectures parall `eles, faisant coop ´erer plusieurs calculateurs et fonctionnant au-dessus de 1015 op ´erations `a

virgule flottante par seconde (ou un p ´etaflops).

Plusieurs architectures parall `eles ont ´et ´e conc¸ues pour la r ´esolution des probl `emes scientifiques, commerciaux ou d’ing ´enierie complexes, reconnus gourmands en res-sources de calcul. Il y a, globalement, deux types d’architectures parall `eles. Le premier concerne les multiprocesseurs qui permettent de rassembler plusieurs processeurs dans une m ˆeme machine. Le deuxi `eme type concerne les plateformes distribu ´ees qui per-mettent de faire coop ´erer plusieurs ordinateurs de type PC via un r ´eseau de communica-tion. Cependant, depuis quelques ann ´ees, les plateformes distribu ´ees connaissent une forte utilisation par rapport aux multiprocesseurs. Ceci est d ˆu au fait que ces derniers sont plus chers et souvent difficilement extensibles.

Au cours de la derni `ere d ´ecennie, l’ ´evolution de la technologie GPGPU (General-Purpose computing on Graphics Processing Units) a permis d’exploiter la puissance de calcul des processeurs graphiques GPUs pour le traitement des t ˆaches massivement parall `eles. Initialement conc¸us pour des applications graphiques, les GPUs sont aujour-d’hui capables d’ex ´ecuter des algorithmes parall `eles beaucoup plus rapidement que les processeurs classiques CPUs. Ceci a incit ´e de nombreux scientifiques et industriels `a int ´egrer des GPUs dans leurs plateformes de calcul parall `ele qui leur permettent, ainsi, d’adresser de nouveaux probl `emes de plus en plus complexes.

Ce chapitre est organis ´e en deux principales sections. La section 1.1 d ´ecrit les diff ´erentes architectures parall `eles de processeurs classiques. Nous donnons deux clas-sifications des architectures parall `eles : une classification selon Flynn et une autre selon l’organisation de la m ´emoire. Ensuite, nous pr ´esentons deux types d’architectures dis-tribu ´ees et nous donnons les principaux points cl ´es de la programmation parall `ele avec l’environnement MPI. La section 1.2 est consacr ´ee `a la description des unit ´es de calcul graphiques. Dans cette section, nous d ´ecrivons l’architecture mat ´erielle des GPUs ainsi que, leur environnement de programmation GPGPU CUDA d ´evelopp ´e par la soci ´et ´e

(27)

nVI-DIA. Enfin, nous pr ´esentons les architectures parall `eles multi-GPUs.

1.1/

C

ALCUL PARALLELE

`

Avant de d ´efinir le principe d’un calcul parall `ele, nous avons jug ´e utile de d ´efinir, tout d’abord, celui de son oppos ´e, `a savoir le calcul s ´equentiel et ce, pour mieux cerner la diff ´erence entre eux. Un calcul s ´equentiel consiste `a ex ´ecuter un programme, instruction par instruction, par un seul processeur (unit ´e de calcul) et de fac¸on `a ce qu’une seule instruction soit ex ´ecut ´ee `a la fois. En revanche, un calcul parall `ele est d ´efini comme l’ex ´ecution d’un ou plusieurs programmes, simultan ´ement, par plusieurs processeurs. Nous avons, en g ´en ´eral, deux mani `eres de r ´ealiser un calcul parall `ele. La premi `ere consiste `a d ´ecouper le programme en plusieurs t ˆaches de calcul puis, ex ´ecuter toutes ces t ˆaches en parall `ele par diff ´erents processeurs. La seconde n ´ecessite le partitionne-ment des donn ´ees du probl `eme `a traiter, de mani `ere `a ce que chaque partie de donn ´ees soit attribu ´ee `a un processeur diff ´erent. Ensuite, tous les processeurs ex ´ecutent en pa-rall `ele les instructions du m ˆeme programme mais en op ´erant sur des donn ´ees diff ´erentes. Cette derni `ere m ´ethode, appel ´ee la parall ´elisation de donn ´ees, est celle retenue dans nos travaux.

En outre, les calculs parall `eles n ´ecessitent aussi une gestion des d ´ependances de donn ´ees entre les diff ´erents processeurs. Les calculs locaux de deux processeurs sont dits d ´ependants lorsque l’ex ´ecution de l’un affecte le r ´esultat de l’autre. Une d ´ependance de donn ´ees implique une utilisation de la valeur d’une m ˆeme variable par les calculs locaux de deux ou plusieurs processeurs. Les d ´ependances de donn ´ees peuvent ˆetre g ´er ´ees par la synchronisation des lectures/ ´ecritures dans une m ˆeme m ´emoire (syst `emes `a m ´emoire partag ´ee) ou par la communication de donn ´ees entre processeurs via des messages (syst `emes `a m ´emoire distribu ´ee).

Le calcul parall `ele a pour objectif d’exploiter la grande quantit ´e de ressources (pro-cesseurs, m ´emoires, espaces de stockage, etc) qu’offrent les calculateurs parall `eles ; ceci, dans le but de r ´eduire le temps d’ex ´ecution des applications n ´ecessitant un long traitement et/ou pour pouvoir ex ´ecuter celles portant sur des volumes de donn ´ees tr `es importants. Tout cela nous permet d’aborder de nouveaux probl `emes, de plus en plus, complexes et de tailles toujours croissantes.

1.1.1/ CLASSIFICATION DES ARCHITECTURES PARALLELES`

Un calculateur parall `ele peut ˆetre : un processeur multicœurs poss ´edant au moins deux unit ´es de calcul physiques grav ´ees sur la m ˆeme puce ou un supercalculateur qui permet de rassembler les composantes de plusieurs ordinateurs (processeurs et m ´emoires) dans une seule machine ou une plateforme distribu ´ee compos ´ee de plusieurs machines ind ´ependantes, homog `enes ou h ´et ´erog `enes, reli ´ees entre elles par un r ´eseau de communication.

Il existe dans la litt ´erature plusieurs classifications portant sur les architectures de cal-culateurs parall `eles et bas ´ees sur diff ´erents crit `eres de classification [37, 46, 48, 67]. Dans cette section, nous pr ´esentons la classification la plus largement utilis ´ee dans le domaine du calcul parall `ele, `a savoir : la taxonomie de Flynn [37]. Elle est bas ´ee sur deux crit `eres : le nombre d’instructions et le nombre de donn ´ees qui peuvent ˆetre

(28)

trait ´ees, simultan ´ement, par les diff ´erents processeurs du calculateur parall `ele. Les quatre cat ´egories possibles de la taxonomie de Flynn sont d ´ecrites ci-apr `es.

1.1.1.1/ INSTRUCTION UNIQUE,DONNEE UNIQUE´ (SISD)

La classe SISD (Single Instruction, Single Data) repr ´esente l’ensemble des teurs s ´equentiels `a une seule unit ´e de calcul (ou monoprocesseur). Ce sont les calcula-teurs qui ne sont capables de traiter qu’une seule instruction sur une seule donn ´ee, par cycle d’horloge. Bien ´evidemment, cette cat ´egorie n’est pas une architecture parall `ele.

1.1.1.2/ INSTRUCTIONS MULTIPLES,DONNEE UNIQUE´ (MISD)

La classe MISD (Multiple Instruction, Single Data) correspond aux calculateurs pa-rall `eles pouvant ex ´ecuter plusieurs instructions, simultan ´ement, sur la m ˆeme donn ´ee. Peu de calculateurs MISD ont exist ´e en pratique, vu le nombre r ´eduit des applications qui peuvent ˆetre mises en œuvre sur ce type d’architecture. Un exemple de calculateur parall `ele exp ´erimental MISD a ´et ´e d ´evelopp ´e `a l’universit ´e de Carnegie Mellon [13].

1.1.1.3/ INSTRUCTION UNIQUE,DONNEES MULTIPLES´ (SIMD)

La classe SIMD (Single Instruction, Multiple Data) correspond aux processeurs vec-toriels et, plus g ´en ´eralement, aux calculateurs compos ´es d’un grand nombre d’unit ´es de calcul. ´A chaque cycle d’horloge, tous les processeurs d’un calculateur SIMD ex ´ecutent, simultan ´ement, la m ˆeme instruction mais op ´erant sur des donn ´ees diff ´erentes. Cette ar-chitecture parall `ele est bien adapt ´ee aux traitements des probl `emes `a structure r ´eguli `ere o `u la m ˆeme instruction est appliqu ´ee `a un ensemble de donn ´ees (ex ´ecution des op ´erations sur des vecteurs ou des tableaux).

1.1.1.4/ INSTRUCTIONS MULTIPLES,DONNEES MULTIPLES´ (MIMD)

La classe MIMD (Multiple Instruction, Multiple Data) repr ´esente la cat ´egorie la plus g ´en ´erale dans cette taxonomie. Les calculateurs parall `eles MIMD poss `edent plusieurs processeurs interconnect ´es entre eux, tels que chaque processeur soit capable de suivre son propre chemin d’ex ´ecution. En effet, `a chaque cycle d’horloge, les proces-seurs peuvent ex ´ecuter, simultan ´ement, des instructions diff ´erentes sur des donn ´ees diff ´erentes.

1.1.2/ M ´EMOIRES DES ARCHITECTURES PARALLELES`

Nous pouvons distinguer, en g ´en ´eral, deux mod `eles de gestion de la m ´emoire des cal-culateurs parall `eles : la m ´emoire partag ´ee et la m ´emoire distribu ´ee. Ces deux mod `eles de m ´emoire permettent de d ´efinir les modalit ´es d’acc `es aux donn ´ees des autres proces-seurs dans un calcul parall `ele.

(29)

1.1.2.1/ M ´EMOIRE PARTAGEE´

Dans ce type d’architecture, les processeurs du calculateur parall `ele ont un acc `es di-rect au m ˆeme espace m ´emoire physique via des liens de communication performants, avec un temps d’acc `es rapide et ´equitable. En effet, les processeurs peuvent op ´erer ind ´ependamment mais toutes les donn ´ees du calcul parall `ele sont plac ´ees dans une m ´emoire commune et ce, de fac¸on `a ce que les changements ´etablis dans la m ´emoire par un processeur soient imm ´ediatement visibles par les autres processeurs. Dans ce cas, les ´echanges de donn ´ees entre processeurs sont effectu ´es via la synchronisation des lectures/ ´ecritures dans la m ´emoire partag ´ee. La figure 1.1 montre un exemple d’ar-chitecture parall `ele `a m ´emoire partag ´ee.

...

Mémoire

Processeur Processeur Processeur Processeur

Bus d’interconnexion

FIGURE1.1 – Exemple d’architecture parall `ele `a m ´emoire partag ´ee

1.1.2.2/ M ´EMOIRE DISTRIBUEE´

Nous pouvons trouver ce type de m ´emoire, plus particuli `erement, sur les plateformes de calcul parall `ele `a ressources distribu ´ees, par exemple les grappes et les grilles de calcul (voir section 1.1.3). Dans ce cas, chaque processeur de la plateforme parall `ele poss `ede sa propre m ´emoire locale dans laquelle les changements ne sont pas visibles depuis les autres processeurs. Par cons ´equent, l’acc `es aux donn ´ees des m ´emoires dis-tantes (m ´emoires des processeurs voisins) est assur ´e par des envois de messages entre processeurs via un r ´eseau de communication. La figure 1.2 illustre un exemple d’archi-tecture parall `ele `a m ´emoire distribu ´ee.

...

Processeur Processeur Processeur Processeur

Mémoire Mémoire Mémoire Mémoire

Réseau de communication

(30)

1.1.3/ PLATEFORMES DE CALCUL PARALLELE DISTRIBU` EES´

Depuis les ann ´ees quatre-vingt-dix, les plateformes distribu ´ees connaissent un essor tr `es important dans le domaine du calcul haute performance. Ceci est rendu possible gr ˆace `a l’ ´evolution des processeurs classiques et des r ´eseaux de communication. En effet, une plateforme distribu ´ee est constitu ´ee, g ´en ´eralement, de calculateurs standards peu on ´ereux (typiquement, des ordinateurs de bureau) reli ´es entre eux par un r ´eseau de communication. De plus, sa configuration mat ´erielle peut ˆetre facilement mise `a jour car l’ajout ou le renouvellement de quelques calculateurs sont faciles `a r ´ealiser et peu co ˆuteux. Enfin, elle peut fournir des performances ´equivalentes ou sup ´erieures `a celles d’un supercalculateur pour un co ˆut inf ´erieur. Nous pouvons classifier les plateformes dis-tribu ´ees en deux cat ´egories : les grappes et les grilles de calcul.

1.1.3.1/ GRAPPES

Une grappe de calcul, appel ´ee commun ´ement cluster en anglais, est constitu ´ee de deux ou plusieurs calculateurs, plus ou moins, homog `enes interconnect ´es par un r ´eseau local, souvent, `a haut d ´ebit (par exemple, un r ´eseau InfiniBand). Chaque calculateur fai-sant partie d’une grappe est appel ´e nœud de calcul et il poss `ede une ou plusieurs unit ´es de calcul et une m ´emoire locale. Tous les nœuds de calcul d’une grappe travaillent en-semble comme un seul calculateur parall `ele. En g ´en ´eral, une grappe de calcul dispose d’un nœud, dit frontal, qui a pour r ˆole la gestion des ressources et la distribution des cal-culs sur les nœuds. La figure 1.3 montre un exemple de grappe de calcul compos ´ee de six nœuds, ayant chacun quatre unit ´es de calcul.

Proc Proc Proc Proc Mémoire Proc Proc Proc Proc Mémoire Proc Proc Proc Proc Mémoire Proc Proc Proc Proc Mémoire Proc Proc Proc Proc Mémoire Proc Proc Proc Proc Mémoire Réseau local

Noeud 0 Noeud 1 Noeud 2 Noeud 3 Noeud 4 Noeud 5

FIGURE1.3 – Exemple de grappe de calcul

1.1.3.2/ GRILLES

Une grille de calcul a une architecture plus distribu ´ee que celle d’une grappe de cal-cul. Elle est compos ´ee d’un grand nombre de calculateurs autonomes, h ´et ´erog `enes, g ´eographiquement distants et interconnect ´es par des r ´eseaux de communication h ´et ´erog `enes. Le principal objectif d’une grille est d’exploiter les ressources de calcul (processeurs, m ´emoire, espace disque, etc) de milliers de calculateurs, quelques soient leurs placements g ´eographiques, pour r ´esoudre des probl `emes de calcul n ´ecessitant des temps d’ex ´ecution et/ou des espaces de stockage ph ´enom ´enaux en environnements

(31)

classiques. Ceci est devenu possible gr ˆace `a l’ ´evolution des r ´eseaux longue distance (par exemple, r ´eseau Ethernet), qui permettent d’acc ´eder efficacement aux ressources distantes. Les calculateurs constituant une grille de calcul peuvent ˆetre de diff ´erents types d’architectures mat ´erielles et logicielles : monoprocesseurs, supercalculateurs, grappes de calcul, etc. Par exemple, la figure 1.4 illustre une grille de calcul compos ´ee de trois sites de grappes de calcul g ´eographiquement distants et communiquant entre eux via le r ´eseau Internet. A la diff ´erence des grappes de calcul, les sites d’une grille de calcul ne sont pas sous une administration commune et, ainsi, la gestion des ressources et des t ˆaches de calcul est effectu ´ee d’une fac¸on distribu ´ee.

Grappe de calcul Grappe de calcul Site 0 Site 1 Site 2 Grappe de calcul Réseau Internet

FIGURE1.4 – Exemple de grille de calcul

1.1.4/ ENVIRONNEMENT DE PROGRAMMATION PARALLELE` MPI

MPI (Message Passing Interface) est un standard d ´efinissant un ensemble de routines pour le calcul parall `ele par ´echange de messages [45] dont la premi `ere version est ap-parue en 1993. Il est le fruit d’une collaboration entre des universitaires et des industriels de diff ´erents domaines scientifiques [38]. Le principal objectif vis ´e par le standard MPI est de pouvoir d ´evelopper des applications parall `eles efficaces et portables qui peuvent ˆetre mises en œuvre et ex ´ecut ´ees sur n’importe quelle architecture de calcul parall `ele. De ce fait, les fonctions MPI peuvent fournir de bonnes performances aussi bien sur des multiprocesseurs `a m ´emoire partag ´ee (supercalculateurs) que sur des plateformes de calculateurs distants et `a m ´emoire distribu ´ee (grappes et grilles de calcul).

Les biblioth `eques classiques MPI, telles que OpenMPI [42] et MPICH [56], fournissent des routines MPI qui peuvent ˆetre utilis ´ees depuis un programme ´ecrit en C, en Fortran ou en C++. Par ailleurs, il existe aussi des biblioth `eques MPI conc¸ues pour d’autres lan-gages de programmation, par exemple Java [20], OCaml [53] et Python [63]. Une appli-cation MPI est un ensemble de processus ind ´ependants ex ´ecutant en parall `ele le m ˆeme

(32)

code de programme sur leurs propres donn ´ees et communicant entre eux via des ap-pels aux routines de la biblioth `eque MPI. En g ´en ´eral, un programme MPI commence par un appel de la fonction MPI_Init() pour initialiser l’environnement MPI n ´ecessaire pour l’ex ´ecution de l’application et il se termine par un appel de la fonction MPI_Finalize() pour d ´esactiver cet environnement. De plus, MPI d ´efinit des groupes de processus nomm ´es communicateurs, tels que deux processus ne puissent communiquer entre eux que s’ils appartiennent au m ˆeme communicateur. Initialement, un communicateur global MPI_COMM_WORLD est utilis ´e pour r ´eunir tous les processus et il peut ˆetre subdivis ´e en plusieurs communicateurs plus petits avec la fonction MPI_Comm_split(). Enfin, chaque processus impliqu ´e dans l’ex ´ecution d’un programme MPI est identifi ´e par un rang au sein de son groupe qui peut ˆetre d ´etermin ´e par la fonction MPI_Comm_rank().

Dans un programme parall `ele MPI, un processus dispose de ses propres donn ´ees sans acc `es direct aux donn ´ees des autres processus. De ce fait, MPI utilise des ´echanges explicites de donn ´ees entre processus par passage de messages. Il contient plusieurs routines de communication entre processus que nous pouvons classer en deux cat ´egories : les routines de communications point- `a-point et les routines de communi-cations collectives. Les premi `eres consistent en diff ´erents types d’op ´erations d’envoi et de r ´eception de messages entre deux, et seulement deux, processus au sein du m ˆeme communicateur. Il existe deux types de communications point- `a-point : bloquantes et non bloquantes. Une communication d’envoi bloquante signifie que le processus ´emetteur est bloqu ´e tant que les donn ´ees `a envoyer ne sont pas toutes transmises (par exemple, MPI_Send()). De la m ˆeme fac¸on, une communication de r ´eception bloquante signifie que le processus r ´ecepteur reste bloqu ´e tant que les donn ´ees `a recevoir ne sont pas toutes accessibles (par exemple, MPI_Recv()). Par contre, les communications non blo-quantes permettent au processus ´emetteur ou r ´ecepteur de poursuivre l’ex ´ecution de son code sans que la communication d’envoi ou de r ´eception soit r ´eellement effectu ´ee. Nous avons, par exemple, les routines MPI_Isend() et MPI_Irecv() pour les op ´erations d’envoi et de r ´eception non bloquantes, respectivement. Les routines de communication non bloquantes ont pour but de r ´eduire les temps d’attente dus aux envois et r ´eceptions de messages.

Les communications collectives sont des communications bloquantes impliquant l’en-semble des processus appartenant au m ˆeme communicateur. MPI propose plusieurs routines de communication collectives qui peuvent ˆetre class ´ees, g ´en ´eralement, en trois cat ´egories selon leurs fonctionnalit ´es : synchronisation (par exemple, MPI_Barrier() et MPI_Wait()), ´echanges de donn ´ees (par exemple, MPI_Alltoallv()) et op ´erations de r ´eduction sur les donn ´ees (par exemple, MPI_Allreduce()). La figure 1.5 montre un exemple des ´echanges de donn ´ees (figure (a)) et un exemple d’op ´erations de r ´eduction (figure (b)), tel que, le calcul de la somme des donn ´ees de tous les processus. En plus des routines de communication, MPI propose aussi des routines de gestion de l’environ-nement d’ex ´ecution MPI, des structures de donn ´ees et des topologies de processus (par exemple, grille de processus).

1.2/

U

NITE DE TRAITEMENT GRAPHIQUE

´

GPU

L’architecture et l’environnement de programmation GPU utilis ´es dans ce docu-ment sont ceux bas ´es sur la plateforme CUDA (Compute Unified Device Architecture) d ´evelopp ´ee par l’un des plus grands fournisseurs de GPUs : nVIDIA [28].

(33)

Processus 0 Processus 1 Processus 2 Processus 0 Processus 1 Processus 2

(a) Echanges de donn ´ees (MPI_Alltoallv()) (b) Op ´eration de r ´eduction (MPI_Allreduce()) FIGURE1.5 – Exemples de routines de communications collectives MPI

1.2.1/ ARCHITECTURE MATERIELLE´ GPU

Les processeurs graphiques GPUs ont ´et ´e, initialement, conc¸us pour le traitement des applications graphiques et de la visualisation 3D. Nous pouvons citer, par exemple, les produits GeForce et Quadro, deux gammes de GPUs propos ´ees par nVIDIA, qui sont destin ´es, respectivement, au graphisme grand public et `a la visualisation professionnelle. Depuis quelques ann ´ees, les GPUs sont devenus des outils tr `es attrayants pour le cal-cul haute performance (HPC). La gamme de produits Tesla a ´et ´e conc¸ue par nVIDIA pour offrir des capacit ´es de calcul parall `ele ´elev ´ees et assister les processeurs dans les calculs intensifs des applications scientifiques et/ou industrielles. La figure 1.6 montre les diff ´erentes architectures mat ´erielles GPU d ´evelopp ´ees par nVIDIA ainsi que celles `a d ´evelopper dans un futur proche.

Fermi Kepler Maxwell Einstein

2010 2012 2014 2016 G80 2008 GT200 2007 Tesla Année

FIGURE1.6 – Historique des architectures mat ´erielles GPU

Un GPU est un processeur graphique reli ´e `a un processeur traditionnel (CPU) via un PCI-Express (voir figure 1.7). Il est souvent consid ´er ´e comme un acc ´el ´erateur d’op ´erations arithm ´etiques intensives d’une application ex ´ecut ´ee sur un CPU. Il puise sa puissance de calcul de son architecture mat ´erielle et logicielle massivement parall `ele. En effet, `a la diff ´erence d’une architecture CPU, un GPU est compos ´e de centaines (voire de milliers) de processeurs (SP), appel ´es commun ´ement cœurs, organis ´es en plusieurs blocs de processeurs appel ´es multiprocesseurs (SM ou SMX). La figure 1.8 montre une comparaison entre l’architecture mat ´erielle d’un CPU et celle d’un GPU Fermi. Les pro-cesseurs d’un GPU sont regroup ´es par 8 (Tesla), 32 (Fermi) ou 192 (Kepler) dans un multiprocesseur, selon le type de son architecture mat ´erielle. De la m ˆeme mani `ere, les multiprocesseurs sont eux-m ˆemes regroup ´es par 2 (G80) ou 3 (GT200) dans un TPC (Texture Processing Cluster) pour l’architecture Tesla et par 4 (Fermi) ou 2 (Kepler) dans un GPC (Graphics Processing Cluster) pour les nouvelles architectures.

En plus de la hi ´erarchie de processeurs, un GPU est dot ´e d’une hi ´erarchie de m ´emoires de diff ´erentes tailles et de diff ´erentes bandes passantes m ´emoires. Nous dis-tinguons, au total, six m ´emoires diff ´erentes (voir figure 1.9) :

(34)

(a) Carte graphique GPU (b) Un GPU reli ´e `a un CPU FIGURE1.7 – Exemple de CPU ´equip ´e d’un GPU

RAM Coeur 0 Coeur 1 Coeur 2 Coeur 3 Coeur 4 Coeur 5 Coeur 6 Coeur 7

.

..

..

.

..

..

RAM Multiprocesseur 0 32 coeurs 32 coeurs Multiprocesseur 2 32 coeurs Multiprocesseur 3 32 coeurs Multiprocesseur 4 32 coeurs Multiprocesseur 5 32 coeurs Multiprocesseur 14 32 coeurs Multiprocesseur 15 32 coeurs Multiprocesseur 1

(a) Un CPU `a 8 cœurs (b) Un GPU Fermi `a 512 cœurs

FIGURE1.8 – Comparaison du nombre de cœurs dans un CPU et dans un GPU

Multiprocesseur m

Multiprocesseur 1

Multiprocesseur 0

Processeur 0 Processeur 1 Processeur n Registres Registres Registres

partagee Mémoire constantecache Mémoire Mémoire texturecache

Mémoire globale (locale, constante et texture)

Multiprocesseur m Multiprocesseur 1

Multiprocesseur 0

Registres Registres Registres

Processeur 0 Processeur 1 Processeur n

partagée Mémoire Mémoire cache L1 constantecache Mémoire Mémoire texturecache cache L2 Mémoire

Mémoire globale (locale, constante et texture)

(a) Architecture Tesla (b) Architecture Fermi ou Kepler FIGURE1.9 – Hi ´erarchie de m ´emoires GPU

– Registres : chaque multiprocesseur a 8K `a 65K registres `a 32-bit, r ´epartis entre tous ses processeurs. Ce sont des m ´emoires rapides, accessibles en lecture/ ´ecriture et avec une faible latence (environ 1 cycle).

(35)

– M ´emoire partag ´ee : de 16 `a 48 Ko de m ´emoire par multiprocesseur. C’est une petite m ´emoire extr ˆemement rapide. Elle est dot ´ee d’une large bande passante m ´emoire (plus d’un To/s) et d’une faible latence (environ 1 `a 2 cycles). Elle est accessible en lecture/ ´ecriture par tous les processeurs du m ˆeme multiprocesseur. – M ´emoire globale : chaque GPU est ´equip ´e de sa propre RAM (GDDR3 ou GDDR5)

de 1 `a 6 Go. C’est une m ´emoire accessible en lecture/ ´ecriture et partag ´ee entre tous les multiprocesseurs au sein d’un m ˆeme GPU. Elle est dot ´ee d’une large bande passante m ´emoire (jusqu’ `a 288 Go/s pour la nouvelle g ´en ´eration Kepler). Cependant, elle poss `ede un temps d’acc `es plus lent par rapport aux autres m ´emoires (200 `a 600 cycles).

– M ´emoire locale : de 16 `a 512 Ko par processeur. C’est une zone m ´emoire, acces-sible en lecture/ ´ecriture, dans la m ´emoire globale. Elle est allou ´ee `a un processeur dans le cas o `u un programme, en cours d’ex ´ecution, n ´ecessite plus de registres que ceux disponibles. Bien ´evidemment, elle poss `ede les m ˆemes caract ´eristiques que la m ´emoire globale.

– M ´emoire constante : c’est un espace m ´emoire de 64 Ko qui r ´eside dans la m ´emoire globale. Il permet de sauvegarder les donn ´ees dont les valeurs restent constantes au cours de l’ex ´ecution d’un programme sur le GPU. De plus, chaque multiprocesseur poss `ede une petite m ´emoire cache constante (environ 8 Ko par multiprocesseur), accessible en lecture seule par tous ses processeurs. Cette m ´emoire cache constante permet de mettre en cache la m ´emoire constante afin d’acc ´el ´erer les acc `es m ´emoires en lecture aux donn ´ees constantes stock ´ees dans la m ´emoire constante.

– M ´emoire texture : n’importe quelle partie de la m ´emoire globale peut ˆetre d ´efinie comme une m ´emoire texture. Elle permet d’am ´eliorer le temps des acc `es irr ´eguliers `a la m ´emoire globale. Elle peut prendre en charge des tableaux de diff ´erents types de donn ´ees `a un, deux ou trois dimensions. Comme pour la m ´emoire constante, la m ´emoire texture est mise en cache dans une m ´emoire cache texture, de 6 `a 8 Ko par multiprocesseur. Cette m ´emoire cache texture est accessible en lecture seule par tous les processeurs d’un m ˆeme multiprocesseur.

Etant donn ´e que l’espace de la m ´emoire locale r ´eside dans la m ´emoire globale, les acc `es en lecture/ ´ecriture `a celle-ci ont une latence ´elev ´ee et une bande passante m ´emoire faible par rapport `a ceux effectu ´es sur la m ´emoire partag ´ee. Les nouvelles ar-chitectures (Fermi, Kepler, etc) ont 64 Ko de m ´emoire par multiprocesseur qui peut ˆetre configur ´ee de trois fac¸ons : en 16 Ko de m ´emoire partag ´ee et 48 Ko de m ´emoire cache L1, en 48 Ko de m ´emoire partag ´ee et 16 Ko de m ´emoire cache L1 ou 32 Ko de m ´emoire partag ´ee et 32 Ko de m ´emoire cache L1. De plus, elles poss `edent aussi une m ´emoire cache L2 de 768 Ko (Fermi) ou de 1538 Ko (Kepler), partag ´ee entre tous les multipro-cesseurs du GPU. Ces deux m ´emoires caches sont souvent utilis ´ees pour am ´eliorer les performances des acc `es aux m ´emoires locale et globale. La seule m ´emoire GPU acces-sible par le CPU est la m ´emoire globale. Tous les ´echanges de donn ´ees entre un CPU et son GPU sont effectu ´es via l’interface de communication PCI-Express de la RAM CPU vers la m ´emoire globale GPU et vice versa. Ainsi, le CPU peut acc ´eder en lecture/ ´ecriture aux m ´emoires globale, texture et constante.

(36)

2007 2008 1000 2000 3000 2010 2011 2012 4000 5000 (G80) C870 (GT200) C1060 (Fermi) C2070 (Fermi) M2090 (Kepler)K20 0 6000 Année

Performance théorique en GFlops/s

Simple précision Double précision

FIGURE1.10 – Performance th ´eorique en Gflops/s des GPUs Tesla de diff ´erentes archi-tectures 2007 2008 2010 2011 2012 100 150 200 250 300 50 (G80) C870 K20 (Kepler) (GT200) C1060 (Fermi) C2070 (Fermi)M2090

Bande passante mémoie théorique en Go/s

Année

FIGURE 1.11 – Bande passante m ´emoire th ´eorique en Go/s des GPUs Tesla de diff ´erentes architectures

Dans le monde du calcul haute performance, les architectures massivement parall `eles des GPUs offrent des performances et des capacit ´es de calcul tr `es int ´eressantes pour r ´esoudre de nouveaux probl `emes complexes de tailles toujours croissantes. Les deux fi-gures 1.10 et 1.11 montrent, respectivement, la puissance de calcul et la bande passante m ´emoire th ´eoriques des GPUs Tesla de diff ´erentes architectures. La puissance de calcul d’un GPU est repr ´esent ´ee par le nombre d’op ´erations `a virgule flottante ex ´ecut ´ees par seconde (flops/s). La figure 1.10 montre qu’un seul GPU peut fournir une puissance de calcul d ´epassant les 1 Tflops/s en simple pr ´ecision (1012 flops/s) et les 500 Gflops/s en

double pr ´ecision (5×1011flops/s). Par ailleurs, une bande passante m ´emoire exprim ´ee en

nombre d’octets par seconde (o/s) d ´esigne le d ´ebit de lecture/ ´ecriture des donn ´ees dans la m ´emoire globale par les processeurs du GPU. La figure 1.11 montre que les bandes passantes m ´emoires GPU sont tr `es ´elev ´ees, variant entre 177 et 288 Go/s, permettant ainsi de diminuer les attentes dues aux acc `es `a la m ´emoire et augmenter la puissance de calcul.

Un autre param `etre de performance int ´eressant des GPUs est leur efficacit ´e ´energ ´etique. Dans les derni `eres ann ´ees, l’architecture des nouveaux produits GPU a ´et ´e

(37)

Nvidia Nvidia Nvidia Nvidia 0 2 4 6 8 10 12 14 16 2008 2010 2012 2014 (GT200) Tesla Fermi Kepler Maxwell

Performance double précision par watt GFlops/Watt

Année

FIGURE 1.12 – Rapport performance th ´eorique en double pr ´ecision et consommation d’ ´energie en Gflops/Watt

optimis ´ee afin d’augmenter leurs puissances de calcul tout en r ´eduisant leurs consomma-tions d’ ´energie. La figure 1.12 illustre le rapport entre la puissance de calcul th ´eorique et la consommation ´energ ´etique des GPUs de diff ´erentes architectures. Ce rapport est ex-prim ´e en nombre d’op ´erations `a virgule flottante en double pr ´ecision ex ´ecut ´ees par Watt (flops/Watt). Nous pouvons remarquer que les GPUs des deux premi `eres g ´en ´erations Tesla et Fermi ex ´ecutent au maximum 2 Gflops/Watt alors que ceux des nouvelles g ´en ´erations Kepler et Maxwell, sortie en 2012 et pr ´evue pour 2014, pourront ex ´ecuter, respectivement, jusqu’ `a 6 Gflops/Watt et 16 Gflops/Watt en double pr ´ecision. De quoi int ´eresser les entreprises et les industries pour r ´eduire les co ˆuts de consommation

´energ ´etique de leurs applications.

1.2.2/ PROGRAMMATION MULTITHREADEE´ CUDA

CUDA est un environnement de programmation GPU d ´evelopp ´e par nVIDIA [28] dont la premi `ere version a ´et ´e publi ´ee durant l’ann ´ee 2007. Il est bas ´e sur le langage de programmation C/C++ avec quelques extensions permettant aux GPUs d’ex ´ecuter des calculs g ´en ´eraux GPGPU (applications graphiques et/ou non-graphiques), qui sont ha-bituellement ex ´ecut ´es par les CPUs. Une application ´ecrite en CUDA est un programme h ´et ´erog `ene qui s’ex ´ecute sur un processeur (CPU) ´equip ´e d’une carte graphique (GPU). En effet, dans un programme CUDA, les codes `a ex ´ecuter par le CPU sont d ´efinis s ´epar ´ement de ceux `a ex ´ecuter par le GPU. Toutes les op ´erations de calculs intensifs et faciles `a parall ´eliser sont ex ´ecut ´ees par le GPU sous formes de kernels. Un kernel est une proc ´edure ´ecrite en CUDA et d ´efinie par un ent ˆete __global__, qui est destin ´ee `a ˆetre ex ´ecut ´ee par le GPU. Par ailleurs, le CPU ex ´ecute toutes les op ´erations s ´equentielles qui ne peuvent pas ˆetre ex ´ecut ´ees en parall `ele et contr ˆole l’ex ´ecution des kernels sur le GPU ainsi que les communications de donn ´ees entre la m ´emoire CPU et la m ´emoire globale GPU.

CUDA est bas ´e sur le mod `ele de programmation parall `ele instruction unique, threads multiples SIMT (Single Instruction, Multiple Thread), tel que chaque kernel est ex ´ecut ´e en parall `ele par des milliers, voire des millions, de threads. Au niveau d’un GPU, les threads

(38)

SM 2

GPU avec 3 multiprocesseurs

SM 0 SM 1

Bloc (1,1) Bloc (2,1)

Bloc (1,0)

Bloc (0,0) Bloc (2,0)

Bloc (0,1)

Grille de blocs de threads

SP 0 SP 1 SP 2 SP 3 SP 4 SP 5 SP 6 SP 7 Multiprocesseur à 8 coeurs Thread (0,0) Thread (0,1) Thread (1,0) Thread (2,0) Thread (3,0) Thread (4,0) Thread (5,0) Thread (6,0) Thread (7,0) Thread (1,1) Thread (2,1) Thread (3,1) Thread (0,2) Thread (4,1) Thread (5,1) Thread (6,1) Thread (7,1) Thread (7,2) Thread (5,2) Thread (6,2) Thread (4,2) Thread (3,2) Thread (2,2) Thread (1,2) Thread (0,3) Thread (1,3) Thread (2,3) Thread (3,3) Thread (4,3) Thread (5,3) Thread (6,3) Thread (7,3) Temps Temps

FIGURE1.13 – Exemple d’ex ´ecution des blocs de threads `a deux dimensions sur un GPU `a 3 multiprocesseurs ayant chacun 8 cœurs

d’un m ˆeme kernel sont organis ´es en grille de plusieurs blocs de threads qui sont dis-tribu ´es, plus ou moins ´equitablement, sur l’ensemble des multiprocesseurs du GPU (voir figure 1.13). En effet, CUDA utilise une organisation hi ´erarchique des threads GPU. Au plus haut niveau, un GPU ex ´ecute une grille de blocs de threads o `u tous les threads ex ´ecutent, simultan ´ement, le m ˆeme code (kernel) mais en op ´erant sur des donn ´ees diff ´erentes. Au niveau interm ´ediaire, chaque multiprocesseur de GPU ex ´ecute un ou plu-sieurs blocs de threads. La position d’un bloc de threads dans la grille est rep ´er ´ee par ses coordonn ´ees `a une, deux ou trois dimensions. Au plus bas niveau, chaque cœur d’un multiprocesseur ex ´ecute un ou plusieurs threads appartenant au m ˆeme bloc de threads. A ce niveau, le mod `ele parall `ele SIMT est appliqu ´e de fac¸on `a ce que chaque instruction d’un kernel soit ex ´ecut ´ee, simultan ´ement, par de multiples threads ind ´ependants (mul-tiples cœurs GPU) op ´erant sur des donn ´ees diff ´erentes. De m ˆeme que pour les blocs de threads dans une grille, la position d’un thread au sein du bloc, auquel il appartient, est rep ´er ´ee par ses coordonn ´ees `a une, deux ou trois dimensions.

Les threads CUDA peuvent acc ´eder aux diff ´erentes m ´emoires GPU (d ´efinies dans la section 1.2.1) de mani `ere hi ´erarchique. Chaque thread a sa propre m ´emoire locale et ses propres registres. Ensuite, chaque bloc de threads a une m ´emoire partag ´ee visible par tous ses threads dont la dur ´ee de vie des donn ´ees est la m ˆeme que celle du bloc de threads. Enfin, tous les threads d’un kernel ont acc `es `a la m ˆeme m ´emoire globale et, ainsi, aux m ˆemes m ´emoires texture et constante. De plus, dans les nouvelles architec-tures GPU, tous les threads d’un m ˆeme bloc partagent une m ´emoire cache L1 commune et tous les blocs de threads ont acc `es `a la m ˆeme m ´emoire cache L2.

(39)

Thread 0 Thread 1 Thread 2 Thread 3 Thread 8 Thread 9 Thread 10 Thread 11 Thread 16 Thread 17 Thread 18 Thread 19 Thread 24 Thread 25 Thread 26 Thread 27

Thread 4 Thread 5 Thread 6 Thread 7 Thread 12 Thread 20 Thread 13 Thread 21 Thread 14 Thread 15 Thread 22 Thread 23 Thread 31 Thread 30 Thread 29 Thread 28

..

..

..

..

..

..

..

..

..

..

..

..

..

..

..

..

Instruction 0 Instruction 1 Temps

Thread 4 Thread 5 Thread 6 Thread 7 Thread 12 Thread 20 Thread 13 Thread 21 Thread 14 Thread 15 Thread 22 Thread 23 Thread 31 Thread 30 Thread 29 Thread 28

Thread 1 Thread 2 Thread 3 Thread 8 Thread 10 Thread 11 Thread 16 Thread 17 Thread 18 Thread 19 Thread 24 Thread 25 Thread 26 Thread 27

Thread 0 Thread 9 SP 7 SP 6 SP 5 SP 4 SP 3 SP 2 SP 1 SP 0 Multiprocesseur à 8 coeurs

FIGURE1.14 – Exemple d’ex ´ecution d’un warp par un multiprocesseur `a 8 cœurs

Au niveau d’un multiprocesseur GPU, les threads d’un m ˆeme bloc sont ex ´ecut ´es par groupe de 32 threads cons ´ecutifs, appel ´e warp. Les threads d’un m ˆeme warp sont ex ´ecut ´es ensemble, instruction par instruction, jusqu’ `a la fin du kernel (voir figure 1.14) et ils sont libres de suivre des chemins d’ex ´ecution identiques ou diff ´erents, sans aucun point de synchronisation. Au sein d’un m ˆeme bloc, les threads peuvent coop ´erer entre eux via la m ´emoire partag ´ee et synchroniser leurs ex ´ecutions en utilisant des barri `eres de synchronisation (__syncthreads() en CUDA). En revanche, dans la grille de threads d’un kernel, il n’y a aucun moyen de synchronisation entre les diff ´erents blocs de threads, si ce n’est qu’ils peuvent seulement lire/ ´ecrire dans la m ˆeme m ´emoire globale.

Le contexte d’ex ´ecution (compteurs d’instructions, registres, etc) de chaque warp ac-tif (n’ayant pas encore atteint la fin du kernel) est sauvegard ´e et maintenu sur le mul-tiprocesseur durant toute la dur ´ee de vie du warp. Cela implique que le changement de contexte d’ex ´ecution d’un warp `a un autre n’a aucune cons ´equence p ´enalisant le temps d’ex ´ecution d’un kernel. Cependant, cela signifie aussi que tous les warps actifs ex ´ecut ´es par un multiprocesseur partagent les m ˆemes ressources. Par cons ´equent, les nombres de threads par bloc et de blocs de threads par grille d’un kernel sont limit ´es par la quantit ´e de ressources disponibles sur un GPU. Un kernel ne peut pas ˆetre ex ´ecut ´e sur un GPU lorsque le nombre de threads par bloc, sp ´ecifi ´e par le CPU dans la confi-guration d’ex ´ecution du kernel, est au-dessus du nombre maximum de threads par bloc (512 threads pour Tesla et 1024 threads pour Fermi) ou n ´ecessite plus de registres et/ou d’espace m ´emoire partag ´ee que disponibles.

1.2.3/ INSTRUCTIONS D’OPTIMISATION DES PERFORMANCES GPU

Pour pouvoir exploiter les performances des GPUs, il est n ´ecessaire, tout d’abord et avant tout, de bien connaˆıtre les propri ´et ´es de l’architecture mat ´erielle et de

(40)

l’envi-ronnement de programmation des cartes graphiques GPUs utilis ´ees. Par ailleurs, une mise en œuvre efficace d’une application sur les GPUs n ´ecessite de bien d ´eterminer les t ˆaches s ´equentielles et les t ˆaches parall `eles de cette application. En effet, toutes les op ´erations qui sont faciles `a ex ´ecuter en parall `ele doivent ˆetre effectu ´ees par le GPU afin d’acc ´el ´erer l’ex ´ecution de l’application. Par contre, toutes les op ´erations s ´equentielles et les op ´erations qui n ´ecessitent des d ´ependances de donn ´ees entre threads ou `a effectuer des calculs r ´ecursifs doivent ˆetre ex ´ecut ´ees par un seul thread CUDA ou par le CPU, se-lon la taille du probl `eme `a traiter. En fait, l’attente d’un thread pour les r ´esultats de calculs des autres threads affecte consid ´erablement les performances des GPUs.

L’efficacit ´e d’un algorithme mis en œuvre sur un GPU est ´etroitement li ´ee `a la mani `ere dont les ressources GPU ont ´et ´e utilis ´ees. Pour optimiser les performances d’un algo-rithme sur un GPU, il est n ´ecessaire de maximiser l’utilisation des cœurs GPU (maximi-ser le nombre de threads ex ´ecut ´es en parall `ele) et d’optimi(maximi-ser l’utilisation des diff ´erentes m ´emoires GPU.

1.2.3.1/ UTILISATION DES CŒURS GPU

Comme nous l’avons d ´ej `a pr ´esent ´e dans la section 1.2.2, les diff ´erents blocs de threads d’un m ˆeme kernel sont ex ´ecut ´es en parall `ele par les diff ´erents multiprocesseurs d’un GPU. Afin d’optimiser l’utilisation de ces multiprocesseurs, il convient donc que le nombre de blocs de threads soit un multiple du nombre de multiprocesseurs du GPU utilis ´e. Ensuite, chaque bloc de threads est partitionn ´e en warps car un multiproces-seur utilise des warps de 32 threads pour ex ´ecuter chaque instruction d’un kernel. Pour maximiser l’utilisation du multiprocesseur, il est n ´ecessaire d’utiliser des multiples de 32 threads pour la taille d’un bloc de threads (32, 64, 128, etc), dans la limite du nombre maximum de threads par bloc.

Au niveau d’un multiprocesseur GPU, les diff ´erents warps d’un m ˆeme bloc de threads ne sont pas ex ´ecut ´es en parall `ele. Toutefois, lorsqu’un warp actif doit attendre les donn ´ees ou le r ´esultat d’une longue op ´eration (par exemple, l’acc `es `a la m ´emoire glo-bale), il sera mis dans une file d’attente et un autre warp dans la liste des warps pr ˆets (ayant toutes les donn ´ees n ´ecessaires pour leurs ex ´ecutions) sera ex ´ecut ´e. Le nombre de cycles d’horloge n ´ecessaire pour qu’un warp soit pr ˆet `a l’ex ´ecution est appel ´e la la-tence. Pour masquer les op ´erations de grande latence, plus particuli `erement les acc `es `a la m ´emoire globale, un bloc de threads doit avoir plus de 32 threads et donc, au moins deux warps.

En outre, les 32 threads d’un m ˆeme warp ex ´ecutent, simultan ´ement, la m ˆeme ins-truction d’un kernel (voir section 1.2.2). Donc, l’ex ´ecution optimale d’un kernel sur un GPU est assur ´ee lorsque tous les threads d’un m ˆeme warp suivent le m ˆeme che-min d’ex ´ecution. Dans le cas de divergence d’un warp qui se produit lors des struc-tures conditionnelles (if(conditions) ... else ...), le mod `ele parall `ele SIMT force l’ ´evaluation s ´equentielle des chemins d’ex ´ecution des deux branches conditionnelles. En effet, les threads n’entrant pas dans l’une des branches conditionnelles doivent at-tendre la fin d’ex ´ecution des autres threads qui eux, sont entr ´es dans cette branche. Par cons ´equence, le temps d’ex ´ecution d’une structure conditionnelle est la somme de ceux des chemins d’ex ´ecution des diff ´erentes branches conditionnelles.

Références

Documents relatifs

Dans cet article, nous proposons une analyse de la méthode dans laquelle on remplace les paramètres du Gradient Conjugué par des constantes et rappelons le lien avec la méthode

[r]

M´ ethodes it´

A doit être à « dominante diagonale » i.e ABS( diagonale )soit être > somme des v.abs des élements sur la ligne pour être sûr de la convergence…... Nous avons vu 2 familles

Un peu plus subtile, ne modifie pas b, donc on peut utiliser la même décomposition pour tout vecteur b, donne A-1 et les vecteurs propres.. Gauss Jordan (pivot

Définition Un système linéaire est dit échelonné lorsque le nombre de coefficients nuls en début d’équation croît d’une ligne à la suivante. On appelle alors pivot le

(i) Pas besoin de calculer de nouvelles matrices (on reste sur des matrices creuses) ; (ii) On améliore peu à peu une solution : impact des erreurs de calcul a priori

8.3 Méthodes plus adaptées aux matrices creuses Pour résoudre Ax = b pour une matrice creuse,. Utilisation de méthodes itératives pour les matrices creuses : (i) on part d’une