1 %% Use the standard UP-methodology class
2 %% with French language.
4 %% You may specify the option 'twoside' or 'oneside' for
7 %% See the documentation tex-upmethodology on
8 %% http://www.arakhne.org/tex-upmethodology/
9 %% for details about the macros that are provided by the class and
10 %% to obtain the list of the packages that are already included.
12 \documentclass[french]{spimufcphdthesis}
14 %%--------------------
15 %% The TeX code is entering with UTF8
16 %% character encoding (Linux and MacOS standards)
17 \usepackage[utf8]{inputenc}
20 %% You want to use the NatBib extension
21 %\usepackage[authoryear]{natbib}
23 %%--------------------
24 %% Include the 'multibib' package to enable to
25 %% have different types of bibliographies in the
26 %% document (see at the end of this template for
27 %% an example with a personnal bibliography and
28 %% a general bibliography)
30 %% Each bibliography defined with 'multibib'
31 %% adds a chapter with the corresponding
32 %% publications (in addition to the chapter for
33 %% the standard/general bibliography).
35 %% There is no standard way to do include this type of
36 %% personnal bibliography.
37 %% We propose to use 'multibib' package to help you,
39 %\usepackage{multibib}
41 %% Define a "type" of bibliography, here the PERSONAL one,
42 %% that is supported by 'multibib'.
43 %\newcites{PERSO}{Liste de mes publications}
45 %% To cite one of your PERSONAL papers with the style
46 %% of the PERSONAL bibliography: \citePERSO{key}
47 %% To force to show one of your PERSONAL papers into
48 %% the PERSONAL bibliography, even if not cited in the
49 %% text: \nocitePERSO{key}
51 %% REMARK: When you are using 'multibib', you
52 %% must compile the PERSONAL bibliography by hand.
53 %% For example, the sequence of commands to run
54 %% when you had defined the bibliography PERSO is:
55 %% $ pdflatex my_document.tex
56 %% $ bibtex my_document.aux
58 %% $ pdflatex my_document.tex
59 %% $ pdflatex my_document.tex
60 %% $ pdflatex my_document.tex
62 %%--------------------
63 %% Add here any other packages that are needed for your document.
66 \newcommand{\MI}{\mathit{MaxIter}}
67 %\usepackage{subcaption}
70 \usepackage{algpseudocode}
71 \algnewcommand\algorithmicinput{\textbf{Input:}}
72 \algnewcommand\Input{\item[\algorithmicinput]}
73 \algnewcommand\algorithmicoutput{\textbf{Output:}}
74 \algnewcommand\Output{\item[\algorithmicoutput]}
78 %%--------------------
79 %% Set the title, subtitle, defense date, and
80 %% the registration number of the PhD thesis.
81 %% The optional parameter is the subtitle of the PhD thesis.
82 %% The first mandatory parameter is the title of the PhD thesis.
83 %% The second mandatory parameter is the date of the PhD defense.
84 %% The third mandatory parameter is the reference number given by
85 %% the University Library after the PhD defense.
86 \declarethesis[Sous-titre]{Titre}{17 septembre 2012}{XXX}
88 %%--------------------
89 %% Set the author of the PhD thesis
90 \addauthor[email]{Prénom}{Nom}
92 %%--------------------
93 %% Add a member of the jury
94 %% \addjury{Firstname}{Lastname}{Role in the jury}{Position}
95 \addjury{Incroyable}{Hulk}{Rapporteur}{Professeur à l'Université de Gotham City \\ Commentaire secondaire}
96 \addjury{Super}{Man}{Examinateur}{Professeur à l'Université de Gotham City}
97 \addjury{Bat}{Man}{Directeur de thèse}{Professeur à l'Université de Gotham City}
99 %%--------------------
100 %% Change style of the table of the jury
101 %% \Set{jurystyle}{put macros for the style}
102 %\Set{jurystyle}{\small}
104 %%--------------------
105 %% Add the laboratory where the thesis was made
106 %\addlaboratory{Laboratoire Waynes Industry}
108 %%--------------------
109 %% Clear the list of the laboratories
112 %%--------------------
113 %% Set the English abstract
114 \thesisabstract[english]{This is the abstract in English}
116 %%--------------------
117 %% Set the English keywords. They only appear if
118 %% there is an English abstract
119 \thesiskeywords[english]{Keyword 1, Keyword 2}
121 %%--------------------
122 %% Set the French abstract
123 \thesisabstract[french]{Ceci est le résumé en français}
125 %%--------------------
126 %% Set the French keywords. They only appear if
127 %% there is an French abstract
128 \thesiskeywords[french]{Algorithmes itératifs, Performance, Simulation, Simgrid, Grid Computing}
130 %%--------------------
131 %% Change the layout and the style of the text of the "primary" abstract.
132 %% If your document is written in French, the primary abstract is in French,
133 %% otherwise it is in English.
134 %\Set{primaryabstractstyle}{\tiny}
136 %%--------------------
137 %% Change the layout and the style of the text of the "secondary" abstract.
138 %% If your document is written in French, the secondary abstract is in English,
139 %% otherwise it is in French.
140 %\Set{secondaryabstractstyle}{\tiny}
142 %%--------------------
143 %% Change the layout and the style of the text of the "primary" keywords.
144 %% If your document is written in French, the primary keywords are in French,
145 %% otherwise they are in English.
146 %\Set{primarykeywordstyle}{\tiny}
148 %%--------------------
149 %% Change the layout and the style of the text of the "secondary" keywords.
150 %% If your document is written in French, the secondary keywords are in English,
151 %% otherwise they are in French.
152 %\Set{secondarykeywordstyle}{\tiny}
154 %%--------------------
155 %% Change the speciality of the PhD thesis
156 %\Set{speciality}{Informatique}
158 %%--------------------
159 %% Change the institution
160 %\Set{universityname}{Universit\'e de Franche-Comt\'e}
162 %%--------------------
163 %% Add the logos of the partners or the sponsors on the front page
164 %\addpartner[image options]{image name}
166 %%--------------------
167 %% Clear the list of the partner/sponsor logos
170 %%--------------------
171 %% Change the header and the foot of the pages.
172 %% You must include the package "fancyhdr" to
173 %% have access to these macros.
187 %%--------------------
188 % Declare several theorems
189 \declareupmtheorem{mytheorem}{My Theorem}{List of my Theorems}
191 %%--------------------
192 %% Change the message on the backcover.
193 %\Set{backcovermessage}{%
199 %%--------------------
200 %% The following line does nothing until
201 %% the class option 'nofrontmatter' is given.
204 %%--------------------
205 %% The following line permits to add a chapter for "acknowledgements"
206 %% at the beginning of the document. This chapter has not a chapter
207 %% number (using the "star-ed" version of \chapter) to prevent it to
208 %% be in the table of contents
209 \chapter*{Remerciements}
211 %%--------------------
212 %% Include a general table of contents
215 %%--------------------
216 %% The content of the PhD thesis
222 \part{PARTIE I: Contexte scientifique et revue de l'état de l'art}
224 \chapter{Cadre de travail et contexte scientifique}
226 \section{Classe des algorithmes itératifs parallèles à large échelle dans une grille de calcul}
228 Dans le cadre de ces travaux, nous nous sommes intéressés particulièrement
229 sur la performance d'une classe d'algorithmes
230 parallèles dits itératifs. De plus en plus, cette méthode itérative
231 est utilisée pour résoudre des problèmes dans différents domaines
232 scientifiques tels que la mécanique, la prévision du temps, le traitement
233 d'images ou encore l'économie financière.
234 Elle consiste à appliquer, contrairement à la méthode de résolution
235 « directe », à partir d'une valeur initiale $X_0$ une
236 transformation à un vecteur inconnu de rang n par des itérations successives
237 afin de s'approcher par approximation à la solution
238 recherchée X{*} avec une valeur résiduelle la plus réduite possible.
241 X^{k+1} = \text{f ( } X^k \text{ ), k = 0,1, \dots{} }
244 où chaque $x_k$ est un vecteur à n dimension et f une fonction de $R^n$ vers
247 La solution du problème sera donc le vecteur X{*} tel que X{*} = f
248 (X{*}), c'est-à-dire X{*} est un point fixe de f.
250 L'exécution en parallèle d'un tel algorithme
251 consiste au découpage (partitionnement) du problème en plus petits
252 morceaux (ou blocs) et d'assigner chaque bloc à une
253 unité de calcul. Chaque processeur tourne le même algorithme de façon
254 concourante jusqu'à la détection de la convergence
255 locale qui peut être obtenue soit par l'atteinte d'un
256 nombre maximum fixé d'itérations soit que la différence
257 entre les valeurs du vecteur inconnu entre deux itérations successives est devenue
258 inférieure à la valeur résiduelle convenue. Cette condition de convergence
259 locale peut être écrite comme suit :
261 (k\leq \MI) \text{ or } (\|X_l^k - X_l^{k+1}\|_{\infty}\leq\epsilon)
263 La convergence globale sera déclarée lorsque tous les processeurs
264 ont atteint leur convergence locale. De façon générale, plusieurs
265 travaux ont démontré la convergence de ces méthodes itératives pour
266 la résolution de systèmes linéaires ou non linéaires avec un taux
267 de convergence élevé {[}7, 8{]}. Lors de l'exécution
268 dans chaque bloc de calcul, l'algorithme peut demander l'échange
269 de données comme des résultats intermédiaires par exemple entre des
270 processeurs voisins avant d'entamer une nouvelle itération.
271 Les sections suivantes vont détailler les notions liées à la résolution
274 \subsection{Partitionnement du problème}
276 Comme expliqué plus haut et appliquant le principe du "diviser pour regner", le problème de résolution d'un
277 algorithme itératif parallèle commence par un découpage de la matrice $n \times n$
278 en entrée en plus petits blocs dont le nombre dépend du nombre
279 de processeurs disponibles. On parle de « décomposition de domaine
280 » en considérant les données en priorité en opposition à la « décomposition
281 fonctionnelle » où le partitionnement se base sur le calcul : diviser
282 le calcul en des tâches indépendantes assignées aux processeurs. La
283 figure \figref{decoupage} présente un exemple de découpage en domaines de la
284 matrice initiale entre deux clusters constitués chacun de 18 processeurs, soit un total de 36 processeurs.
288 \begin{minipage}[t]{5.5cm}
290 \includegraphics [ width =5.5cm]{"3D data partitionning btw 2 clusters"}
291 \caption {Découpage d'une matrice tridimensionnelle entre deux clusters formés de 18 processeurs chacun}
293 \begin{minipage}[t]{5.5cm}
295 \includegraphics [ width =5.5cm]{"1D-2D-3D Domain decomposition"}
296 \caption {Décomposition en domaines 1D, 2D et 3D}
298 %\caption{Partitionnement du problème}
301 %\mfigure[!]{width=8cm, height=8cm}{"3D data partitionning btw 2 clusters"} {Partitionnement : Découpage %d'une matrice tridimensionnelle entre deux clusters formés de 18 processeurs chacun} {decoupage}
303 %\mfigure[h]{width=8cm, height=8cm}{"1D-2D-3D Domain decomposition"} {Partitionnement : Décomposition en %domaines 1D, 2D et 3D} {Decompo}
306 %\begin{subfigure}{0.5\textwidth}
307 %\includegraphics[width=6cm, height=6cm]{"3D data partitionning btw 2 clusters"}
308 %\caption{Découpage d'une matrice tridimensionnelle entre deux clusters formés de 18 processeurs chacun}
311 %\begin{subfigure}{0.5\textwidth}
312 %\includegraphics[width=1\linewidth, height=5cm]{"1D-2D-3D Domain decomposition"}
313 %\caption{Décomposition en domaines 1D, 2D et 3D}
316 %\caption{Partitionnement du problème}
319 Chaque cluster va prendre en charge un bloc de 18 "sous-domaines". Chaque
320 processeur $P_i$ tournera l'algorithme sur le cube qui
321 lui est assigné. Les sous domaines s'échangent des
322 données par leurs points périphériques {[}9{]} au niveau du cluster mais
323 aussi entre les clusters en suivant une organisation logique d'un
324 anneau virtuel dont les noeuds sont les processeurs $P_i$.
326 Une fois partitionnée en m blocs, la relation reccurente de l'équation \eqref{eq:1} peut
329 x_{k+1} = (x_1^k, x_2^k, \dots , x_n^k), k=1,\dots n
331 ou en termes de blocs :
333 X_{k+1} = (X_1^k, X_2^k, \dots , X_n^k), k=1,\dots m
335 Donc, on peut écrire :
341 \iff ( \exists F_k ) (X_1^{k+1} ,X_2^{k+1} , \dots{}, X_m^{k+1}) = (F_1(X_k), F_2(X_k), \dots , F_m(X_k))
345 X_i^{k+1} = F_i (X^k) = Fi ( X_1^k , X_2^k , \dots{} , X_m^k)\>pour \>i=1,\dots,k
347 L'exemple donné montre un partitionnement « naturel
348 » du problème initial par un découpage uniforme avec des blocs de même taille. Il met en exergue deux facteurs importants
349 à tenir en compte lors de cette opération :
351 \item [$\bullet$] essayer de répartir
352 uniformément la charge assignée à chaque processeur : effectivement,
353 un déséquilibre de charge entre les unités de calcul peut impacter
354 négativement la performance globale du système;
355 \item[$\bullet$] réduire au maximum
356 les communications entre les processeurs : ces temps d'échange
357 coûtent aussi chers au niveau de la performance globale.
360 type de l'algorithme, on peut faire un classement en
361 trois catégories {[}21{]} selon le partitionnement ou la décomposition
362 de domaine choisie (Figure \figref{Decompo}) :
364 \item[$\bullet$] 1D où la matrice est découpée
365 suivant des briques dont deux dimensions de longueur n et la dernière plus courte que n.
366 \item [$\bullet$] 2D avec des briques dont une dimension est de longueur n et les
367 deux autres plus courtes que n;
368 \item [$\bullet$] et enfin, 3D avec des briques dont les
369 3 dimensions sont plus courtes que n.
372 \subsection{Modes d'exécution synchrone et asynchrone}
374 Lors de l'exécution des algorithmes itératifs parallèles
375 sur un environnement de type grille de calcul, le temps de communication
376 résultant des échanges de données entre les unités de calcul est aussi
377 important que le temps de calcul lui-même. En effet, un ratio montrant
378 un équilibre entre ces deux temps constitue un des objectifs dès le
379 partitionnement du problème. Le temps de communication est impacté
380 sur la façon dont les échanges sont effectués.
382 \mfigure[h]{width=8cm, height=8cm}{"Synchronous iterations model"} {Modèle de communication synchrone} {sync}
384 \mfigure[h]{width=8cm, height=8cm}{"Asynchronous iterations model"} {Modèle de communication asynchrone} {async}
387 %\begin{subfigure}{0.5\textwidth}
388 %\includegraphics[width=5cm, height=5cm, scale=3]{"Synchronous iterations model"}
389 %\caption{Modèle de communication synchrone}
392 %\begin{subfigure}{0.5\textwidth}
393 %\includegraphics[width=5cm, height=5cm, scale=3]{"Asynchronous iterations model"}
394 %\caption{Modèle de communication asynchrone}
397 %\caption{Modèles de communication}
401 D'une part, ces paquets de données peuvent être transférés
402 de façon « synchrone » : dans ce cas, une coordination de l'échange
403 est assurée par les deux parties. A la fin de chaque itération, l'émetteur,
404 une fois la poignée de main établie, envoie les données et attend
405 jusqu'à la réception d'un accusé de
406 réception par le récepteur. L'algorithme même est en
407 mode synchrone parce qu'une étape de synchronisation
408 de tous les processeurs est nécessaire avant d'entamer
409 une nouvelle itération. La figure \figref{sync} montre les actions dans
410 le temps lors d'un échange en mode synchrone entre
411 deux processeurs. Les flèches montrent la date d'envoi
412 par $P_1$ et la date de réception du paquet par $P_2$. On parle ici de mode
413 de communication « bloquante » : la nouvelle itération ne peut commencer
414 tant que tous les processus n'ont pas fini leurs communications.
416 D'autre part, l'échange de données peut
417 s'effectuer en mode « asynchrone ». Dans ce cas, l'émetteur
418 peut envoyer de l'information au destinataire à tout
419 moment et aucune synchronisation n'est nécessaire.
420 Chaque processeur travaille avec les données qu'il
421 reçoit au fil du temps. La communication est ici non bloquante. La
422 conséquence immédiate de ce mode de communication est l'absence
423 des périodes où le traitement est arrêté (CPU stalled ou idle) parce
424 qu'il doit attendre l'accusé de réception
425 du récepteur (Figure \figref{async}). En mode asynchrone, le temps entre chaque
426 itération peut varier notablement dû à la différence éventuelle de
427 la puissance de chaque processeur ou encore de la performance des
428 différents réseaux de communication utilisés. {[}7{]} montre à travers
429 des algorithmes itératifs classiques les intérêts de la mise en oeuvre
430 de communication asynchrone lors de la résolution mais aussi les éventuels
431 inconvénients. Parmi les avantages de ce mode de communication, la
432 réduction du temps de synchronisation entre processeurs peut impacter
433 positivement le temps global d'exécution surtout en
434 environnement hétérogène. De même, le chevauchement du calcul avec
435 la communication des données peut aussi améliorer la performance de
436 l'application. Enfin, un partitionnement lors de de
437 la décomposition du domaine tenant compte de l'absence
438 de synchronisation en mode asynchrone peut aussi contribuer à la performance
439 en répartissant efficacement le calcul. Les inconvénients de l'asynchronisme
440 peuvent venir de la détection de la convergence globale étant donné
441 qu'il n'y a pas de synchronisation des
442 opérations. L'arrêt doit être décidé après une forme
443 de communication globale à un certain point de l'algorithme
444 ; il peut se faire lors de la communication inévitable entre processus
445 pour annoncer la convergence locale. Un autre problème est aussi la
446 tolérance aux pannes quoique cette défaillance peut aussi concerner
447 le mode synchrone : si un des processus contribuant dans la résolution
448 du problème se plante, tout le processus itératif peut s'écrouler
449 si un mécanisme de reprise sur panne est mis en place.
451 \section{Méthodes de résolution parallèles du problème de Poisson et de
452 l'algorithme two-stage multisplitting de Krylov}
454 Afin de valider les résultats de simulation d'applications distribuées parallèles effectuée dans le cadre de nos travaux, différents algorithmes, largement utilisés dans différents domaines scientifiques, écrits en MPI/C ont été utilisés. Ils font partie de la classe des méthodes de résolution numérique itérative qui, en opposition aux méthodes directes et par approches successives,calcule par approximation la solution du problème posé avec une erreur connue d'avance après l'initialisation d'une valeur initiale. Les méthodes itératives permettent la résolution des systèmes linéaires mais aussi non linéaires. Elles se prêtent à une parallèlisation plus aisée et supportent mieux le passage à l'echelle [4].
455 Les sections suivantes vont décrire les algorithmes considérés à savoir la méthode de résolution de Jacobi et l'algorithme de Krylov avec deux variantes : le classique GMRES en mode native et la version "two-stage" d'une part et la variante multi-décomposition(multisplitting) d'autre part.
457 \subsection{Algorithme de Jacobi}
458 L'algorithme de Jacobi est une des plus simples méthodes de résolutions d'un système d'équations linéaires [3,4].
460 Soit le système d'équations linéaires suivant :
470 \> A est une matrice carrée réelle creuse inversible de taille n, \\
471 \> x le vecteur inconnu de taille n, \\
472 \> et b un vecteur constant.\\
475 Ainsi, \eqref{eq:2} peut s'écrire :
478 \left(\begin{array}{ccc}
479 a_{1,1} & \cdots & a_{1,n} \\
480 \vdots & \ddots & \vdots\\
481 a_{n,1} & \cdots & a_{n,n}
484 \left(\begin{array}{c}
490 \left(\begin{array}{c}
498 D la matrice carrée de taille n formée par la diagonale de A. On suppose qu'aucun élément $a_{i,i}$ n'est égal à 0. \\
499 L (resp. U) la matrice carrée de taille n formée par les éléments du bas (resp. haut) de A.\\
503 D=\left( \begin{array}{ccc}
504 a_{1,1} & \cdots & 0 \\
505 \vdots & \ddots & \vdots \\
509 , \hspace{0,1cm}L=\left( \begin{array}{ccc}
511 \vdots & \ddots & \vdots \\
515 et \hspace{0,2cm}U=\left( \begin{array}{ccc}
516 0 & \cdots & a_{1,n} \\
517 \vdots & \ddots & \vdots \\
522 Comme A = D + (L + U) et si $D^{-1}$ est l'inverse de la matrice diagonale D, on peut écrire :
525 Ax = b \Leftrightarrow ( D + L + U )x = b
529 \Leftrightarrow Dx = -(L+U)x + b
534 \Leftrightarrow ( x = D^{-1} \times [-(L+U)] x + D^{-1} b)
536 Cette dernière égalité est l'equation $du point fixe$. L'algorithme itératif de Jacobi Figure~\ref{algo:01} (version séquentielle) et ses variantes découle de cette équation [4]. Si $x^{(k)}$ est la valeur approchée du vecteur inconnu à l'itération $k$, on a d'après \eqref{eq:3} avec un $x^{0}$ initial donné :
539 x^{(k+1)} = D^{-1} \times [-(L+U)] x^{(k)} + D^{-1} b
543 \begin{algorithmic}[1]
544 \Input $A_{ij}$ (Matrice d'entrée), $b_{i}$ (Vecteur du membre droit), $n$ (Taille des vecteurs) et des matrices, $xOld_{i}$ (vecteur solution à l'itération précédente)
545 \Output $x_{i}$ (Vecteur solution)\medskip
547 \State Charger $A_{ij}$, $b_{i}$, $n$,
548 \State Assigner la valeur initiale $x^0$
549 \State \textbf{repeat} {jusqu'à l'obtention de la condition de convergence} \textbf{do}
550 \For {$i=0,1,2,\ldots (n-1)$}
551 \State $x_i \leftarrow 0$
552 \For {$j=0,1,2,\ldots (n-1) \hspace{0.1cm} et \hspace{0.1cm} j \neq i$}
553 \State $x_{i} \leftarrow x_{i} + A_{ij} \times xOld_{j}$
555 \For {$i=0,1,2,\ldots (n-1)$}
556 \State $xOld_{i} \leftarrow ( b_{i} - x_{i} ) \quad {/} \quad A_{ii}$
559 \State \textbf{end repeat}
563 \caption{Algorithme itératif de Jacobi}
567 La condition de convergence est déterminée au début du traitement. La méthode permet de passer à large échelle en distribuant l'exécutuion de l'algorithme sur un environnement de grille de calcul.
569 \subsection{Méthode de résolution GMRES}
573 Version « two-stage »
575 \subsection{Solveur multisplitting}
581 \section{Simulateurs d'exécution d'algorithmes parallèles MPI dans une grille de calcul}
583 \subsection{Calcul sur grille}
584 Une grille de calcul est caractérisée par "un type de système parallèle et distribué qui permet le partage, la sélection et l'aggrégation de ressources distribuées géographiquement selon leurs capacités" [25] afin de résoudre un problème complexe donné. Ainsi, une grille est composée d'un ensemble de grappes de machines interconnectées entre elles à travers un réseau de communication qui peut s'étendre sur des zones géographiques éloignées (Figure \figref{gridA}). Les capacités de calcul, les mémoires, les applications et les systèmes de stockage sont partagées par les applications parallèles et distribuées. Le calcul sur une grille est caractérisé par un environnement "hétérogène, dynamique et scalable". \\
586 \mfigure[h]{width=8cm, height=8cm}{"Grid architecture"} {Architecture d'une grille de calcul} {gridA}
588 L'hétérogénéité montre la variété des éléments composant la grille de calcul. On peut être en présence de différentes architectures de processeurs dans les machines d'une grappe ou entre les grappes. Les fréquences d'horloge de ces processeurs peuvent être aussi différentes. De même, l'architecture ou la méthode d'accès des mémoires (DRAM, stockage) utilisées dans la grille de calcul peut être aussi être aussi de types différents. Enfin, la topologie ainsi que la performance des réseaux de communications interconnectant les éléments de la grille peuvent être aussi avoir des débits complètement hétérogènes. \\
589 Le caractéristique dynamique de la grille résulte de la relative facilité de changer de configuration. On peut ainsi tailler dynamiquement l'allocation des ressources de la grille aux utilisateurs selon les besoins de leur demande respective. Cet aspect a été élargi à "l'élasticité" de l'environnement dans le cadre du "cloud computing". \\
590 Enfin, la scalabilité de la grille de calcul découle de sa conception modulaire permettant d'ajouter d'autres composants selon les besoins. Pour augmenter par exemple la capacité de calcul de la grille, il suffit d'ajouter de nouveaux clusters pour une plus grande puissance globale de la grille. \\
592 Le milieu de la recherche dispose d'une grille de calcul dédié : le Grid'5000 [26, 27] est une grille répartie géographiquement dans différentes villes de France (Figure \figref{grid5000RG} ) mettant à disposition un "banc d'essai polyvalent à grande échelle" pour les expérimentations de la recherche en informatique particulièrement le calcul parallèle sur grille, sur le cloud, le calcul à haute performance mais aussi sur le Big Data. Grid'5000 permet aux utilisateurs l'accès à des ressources importantes de calcul dans un environnement complètement configurable et controllable. Il peut aussi fournir une trace détaillée ainsi que d'autres informations de mesure sur le comportement de l'application lors de l'exécution pour une étude ultérieure.
594 \mfigure[h]{width=8cm, height=8cm}{"Grid5000 sites"} {Grid'5000 : Répartition géographique} {grid5000RG}
597 Grid'5000 est construit autour de plus de 1000 noeuds physiques de différents constructeurs composés de plus de 2000 processeurs (Intel Xeon et AMD Opteron) avec un total de plus de 10.000 coeurs. Plus de 650 différentes cartes d'interface réseau Ethernet, Infiniband et Myrinet sont interconnectés avec plus de 40 accélérateurs de type NVIDIA GPU et Intel Xeon Phi.
598 Dès sa conception, Grid'5000 a pris en compte la diversité des intêrets et des besoins des différents utilisateurs. En effet, dépendant de leur centre d'intêret peuvent se focaliser sur les protocoles réseau ou les systèmes d'exploitation particuliers ou d'autres problématiques sur la tolérance aux pannes,ces derniers peuvent configurer leur propre environnement de lancement de leurs applications. La reproductbilité des résultats a été soigneusement étudiée pour permettre une analyse utlérieure de la performance. De plus, Grid'5000 assure la scalabilité, la qualité de service (QoS) mais aussi et surtout la sécurité de l'environnement par le verouillage de la connexion vers Internet par exemple.
600 \subsection{Généralités sur la simulation}
602 La simulation est largement utilisée dans divers domaines de la recherche scientifique. Elle consiste au processus de la mise en oeuvre et "de la conduite d'expérimentations sur un modèle (une représentation simplifiée du réel) dans le but de comprendre le comportement du système modélisé sous des conditions sélectionnées ou de l'évaluation de diverses stratégies pour le fonctionnement du système sous la limite imposée par les critères de développement et d'exploitation" [29]. Particulièrement, la simulation de l'exécution d'une application parallèle distribuée étudie son comportement (résutats en sortie, temps de performance, scalabilité, ...) sur un environnement virtuel imitant au mieux le fonctionnement d'une plateforme physique réel ou d'un système en cours d'élaboration (banc d'essai) ou encore d'une hypothétique machine non encore réalisée. Ainsi, la simulation informatique se focalise sur le comportement dynamique du modèle à travers le temps. Plusieurs raisons motivent une telle simulation: à titre d'exemple, de réduire les coûts de la conception d'un système et d'éviter les erreurs, de produire dans un temps raisonnable des résultats en sortie d'un modèle ayant un temps d'exécution élevé, de répondre à des scénarions d'exécution avec des questions "what-if" (tests et évaluations), ou encore de créer des outils de simulation pour des formations ou des jeux. \\
603 Dans le cadre d'une grille de calcul, les simulateurs ou les outils de simulation permettent à l'inverse des plateformes réelles l'évaluation de la performance des expérimentations "répétables et controllables" [25] sur des configurations flexibles et scalables. En effet, les environnements réels montrent leurs limites sur leur rigidité de passage à l'echelle mais aussi sur la flexibilité de disposer un environnement de calcul particulier répondant aux besoins précis de l'application à un moment donné. Selon la classification dans [30], la simulation d'applications sur une grille de calcul rejoint la classe de simulation "virtuelle" par l'utilisation d'équipements de simulation par des personnes réelles. De façon générale, le simulateur utilise une échelle de temps "discret", c'est-à-dire le temps est découpé en intervalles qui peuvent être réguliers ou non. Dans le cas d'un système à temps discret régulier, le simulateur maintient et met à jour éventuellement un ensemble de "variables d'état" qui reflètent l'état du système physique à un instant t donné. Un "évenement" est associé à chaque instant donné à une "transition d'état". Pour des comparaisons futures, on distingue le "temps physique" comme étant le temps considéré au niveau du système physique, du "temps de simulation" et "le temps de l'horloge murale" désigne le temps de simulation du modèle. Toutefois, le "temps de simulation" est une notion abstraite utilisée par le simulateur pour évaluer le temps de simulation. Il est défini [30] comme étant "un ensemble de valeurs totalement ordonné E où chaque valeur représente un temps du système physique à modéliser et qui vérifie les conditions suivantes:" \\
605 Soient E l'ensemble des temps discrets de simulation et P l'ensemble des temps du système physique.
610 \texttt{Si } ( T_1 \in E, T_2 \in E ) \texttt{ et }( P_1 \in P, P_2 \in P ) \texttt{ et } (T_1 \textless T_2) \\
611 \Rightarrow ( (P1 \textless P2) \texttt{ et } \exists K \in \mathbb{N}, T_2 - T_1 = K \times ( P_2 - P_1 )
615 La définition précédente montre le lien linéaire étroit entre les intervalles de temps de simulation et celles des temps physiques. Ce qui permet d'estimer entre autres le temps d'exécution probable d'une application à partir du temps de simulation observé. Outre ce temps global de l'outil de simulation et les variables d'état, une liste des évenements à exécuter complète la composition du simulateur au temps discret. \\
616 Le changement des variables d'état peut s'effectuer soit à une fréquence régulière du temps de simulation (exécution rythmée par le temps) soit au début et à la fin d'un évenement donné (exécution rythmée par les évenements).
617 Dans le cas d'une simulation d'une application parallèle et distribuée où plusieurs processeurs ou coeurs interconnectés concourent à résoudre ensemble le problème posé, plusieurs autres aspects liés à l'environnement doivent être considérés : \\
619 \item [$\bullet$] L'initialisation du système;
620 \item [$\bullet$] Les échanges de données entre les processus;
621 \item [$\bullet$] La synchronisation des processus;
622 \item [$\bullet$] La détection de deadlock et la reprise;
623 \item [$\bullet$] L'arrêt et la fermeture du système.
625 Le tableau \ref{table1} donne quelques exemples de simulateurs pour des applications parallèles et distribuées sur une grille de calcul [28, 25].
630 \fontsize{8}{9}\selectfont
631 \begin{tabular}{|c|c|c|c|p{1cm}p{1cm}p{1cm}p{1cm}|}
633 %{ } & { } & { } & { } & \\
634 \textbf{OUTIL} & \textbf{DESCRIPTION} & \textbf{DEVELOPPEUR} & \textbf{APPLICATIONS CIBLE} \\ \hline
635 \multirow{ 3}{*}{SimJava} & SimJava fournit un processus de simulation & Université de & Simulation d'évenements \\
636 { } & avec une animation à travers d'entités communiquant entre elles & Edinburgh (UK) & discrets \\
637 { } & http://www.dcs.ed.ac.uk/home/hase/simjava/ & { } & { } \\ \hline
639 \multirow{ 4}{*}{Bricks} & Bricks est un outil d'évaluation de performance & Tokyo Institute of & Simulation \\
640 { } & analysant divers schémas d'ordonnancement & Technology (Japan) & de grille \\
641 { } & dans un environnement de grille de calcul & { } & { } \\
642 { } & http://matsu-www.is.titech.ac.jp/~takefusa/bricks/ & { } & { } \\ \hline
644 \multirow{ 4}{*}{Microgrid} & Microcrid permet la simulation d'une montée & University of & Simulation \\
645 { } & en charge des applications sur grille de calcul & California at & de grille \\
646 { } & en utilisant des ressources clusterisées & San Diego (USA) & { } \\
647 { } & http://www-csag.ucsd.edu/projects/grid/microgrid.html & { } & { } \\ \hline
649 \multirow{ 3}{*}{Simgrid} & Simgrid simule les applications & University of & Simulation \\
650 { } & distribuées dans un environnement distribué hétérogène & California at & de grille \\
651 { } & http://grail.sdsc.edu/projects/simgrid/ & San Diego (USA) & { } \\ \hline
653 \multirow{ 4}{*}{Gridsim} & Gridsim permet la modélisation et la simulation & Monash & Simulation \\
654 { } & d'entités impliquées dans le calcul parallèle et distribué & University & de grille \\
655 { } & par la création et le pilotage de différentes ressources & Australie & { } \\
656 { } & http://www.buyya.com/gridsim/ & { } & { } \\ \hline
659 \caption{Quelques outils de simulation pour une grille de calcul}
663 Simgrid est l'outil choisi dans le cadre de ces travaux pour étudier le comportement et évaluer la performance d'applications parallèles distribuées à grande échelle. Une section de ce chapitre sera dédiée à la description plus détaillée de cette plateforme.
665 \subsection{MPI - Message Passing Interface}
666 MPI ou "Message Passing Interface" est les spécifications d'une librairie d'interface pour le transfert de message entre les processus d'une application parallèle. A sa version MPI-3 (2015), elle est largement utilisée dans la recherche dans le domaine du calcul à haute performance avec des compilateurs C/C++ et Fortran généralement. La facilité de l'utilisation et la portabilité à travers différents systèmes hétérogènes ont guidé le développement de ces spécifications MPI standards. Ces derniers peuvent être matérialisés sur différentes plateformes cibles telles qu'une grille de calcul, des machines multiprocesseurs et multicores à mémoires partagées ou distribuées, un réseau de stations de travail interconnectés ou encore des environnements hybrides obtenus par la combinaison de ces architectures. Principalement, les standards MPI sont implémentés sur différents systèmes d'exploitation soit avec MPICH [32] ou OpenMPI [33] tous les deux des logiciels libres à haute performance et portable développés par des consortiums de chercheurs et des partenaires et collaborateurs industriels.
667 Plusieurs domaines sont couverts par les spécifications de MPI dont les plus importants sont cités ci-dessous [31,32,33].
670 \item[$\bullet$] Groupes, contexte et communicateur: Définit l'initialisation de l'environnement d'exécution du programme parallèle MPI. Un groupe de processeurs est formé et un unique contexte de communication est créé et les deux sont intégrés ensemble dans un communicateur.
672 \item[$\bullet$] La gestion de l'environnement MPI: Permet à l'utilisateur d'interagir avec l'environnement MPI créé lors du lancement du programme parallèle. Elle assure par abstraction la portabilité de l'application entre des plateformes matérielles et logicielles différentes.
674 \item[$\bullet$] La gestion des processus: Définit la création des processus participant à l'exécution de l'application mais aussi détermine la topologie et la gestiobn des groupes de processus en accord par exemple avec des architectures complexes comme les grilles de calcul.
676 \item[$\bullet$] Les types de données : Permettent de créer des structures de données complexes en mémoire à partir des types de données de base comme l'entier, le float, etc...
678 \item[$\bullet$] Les communications: Rassemblent les spécifications des protocoles d'échanges de messages entre les processus. On distingue les communications point à point, les communications collectives mais aussi les entrées / sorties parallèles.
682 Le programme MPI s'exécute sur chaque processeur une fois que l'environnement logique est créé par la routine MPI\_Init. Ce dernier est constitué d'un groupe de processus, d'un contexte et d'un communicateur (par défaut MPI\_COMM\_WORLD), voir la figure \figref{MPI}-a. Chaque processus est identifié par son rang dans le groupe associé au communicateur (MPI\_Comm\_rank). Le nombre total de processus en jeu est donné par MPI\_Comm\_size. A la fin du code, MPI\_Finalize termine l'exécution en environnement MPI. De façon générale, une erreur arrête tous les processus en jeu. Toutefois, le programmeur peut gérer et personnaliser les erreurs au niveau de chaque processus ou globalement. Une routine MPI qui se termine avec succès retourne le code MPI\_SUCCESS. \\
684 \mfigure[h]{width=8cm, height=8cm}{"MPI"} {Groupes et communicateur (a) - MPI - Opérations collectives (b)} {MPI}
686 Au niveau de la communication, le transfert de message peut se faire d'un processus vers un autre (point à point). Pour cela, les routines MPI\_SEND et MPI\_RECV et leus variantes permettent respectivement d'envoyer et de recevoir un message. L'adresse du tampon contenant le message à traiter sont passées à ces fonctions avec le type de données ainsi que le nombre d'objets. La destination dans le cas d'un envoi est spécifiée par le rang du processus d'arrivée du message dans le communicateur considéré. Une variable de statut de l'opération permet de connaitre si l'opération a réussi ou a échoué. Cet échange peut se faire de manière synchrone ou asynchrone(resp. bloquant ou non bloquant). \\
687 Contrairement à une communication point à point, une communication dite collective transfère un message à partir d'un processeur vers un ensemble de processeurs. L'exemple le plus courant est le "broadcast" ou diffusion où un processeur envoie le même message à destination d'un ensemble de processeurs. La figure \figref{MPI}-b montre les échanges entre les processus après l'appel à cette opération mais aussi d'autres types de communications collectives. Un processus avec MPI\_Scatter distribue une structure de données à d'autres processus participants tandis que MPI\_Gather rassemble des données de plusieurs processus participant en une seule structure. Enfin, les opérations de réduction appliquent une opération (somme, produit, maximum, minimum, etc ...)à un ensemble de processus et retourne le résultat vers le processus appellant.
688 La synchronisation des processus peut être obtenue avec la routine MPI\_Barrier qui, une fois lancée par un processus, bloque ce dernier jusqu'à ce que tous les processus de son groupe atteigne cette barrière comme un point de rendez-vous.
690 \subsection{Simulateur SIMGRID - SMPI}
691 SimGrid est utilisé pour la simulation et l'étude du comportement d'applications parallèles dans un contexte d'un environnement complexe, hétérogène, distribué et dynamique. Comme son nom l'indique, développé par la communauté des utilisateurs de grille de calcul, il est utilisé aussi largement sur dans les domaines des applications pair-à-pair,du calcul à haute performance et du cloud computing [5,9]. Le choix de Simgrid comme outil de simulation dans le cadre de ces travaux a été motivé par son efficacité pour la simulation d'applications parallèles à large échelle. En effet, Simgrid rassemble au mieux les caractéristiques requises pour un simulateur dans un environnement de grille de calcul telles que la robustesse, la scalabilité et la justesse des résultats accompagnées d'un temps de réponse correct et d'une tolérance aux pannes de l'exécution [34].
693 Simgrid est conçu sur une simulation basée sur les évenements ("event driven")[26, 35] à un niveau d'abstraction et de fonctionnalités répondant aux applications et aux infrastructures. Cinq composants d'abstraction constitue le fonctionnement de Simgrid :
697 \item[$\bullet$]Un "agent" est une entité qui assure l'ordonnancement de l'application et exécute le code sur une "location";
699 \item[$\bullet$]Une "location" est une hôte de l'environnement de simulation sur laquelle l'agent s'exécute. Outre les données propres à la location, des boîtes aux lettres sont conçues pour permettre les échanges de données avec d'autres agents;
701 \item[$\bullet$]Une "tâche" est une activité de l'application simulée. Elle se décline sous forme d'un calcul (temps de calcul nécessaire) ou d'un transfert de données (volume de données à échanger;
703 \item[$\bullet$]Un "chemin" décrit la liaison entre les locations. Il est utilisé par les agents lors d'un transfert de données à calculer le temps de transfert en tenant compte du routage à appliquer pour une telle liaison.
705 \item[$\bullet$]La communication entre agents se fait à travers un "channel". Cette abstraction modélise la communication à travers un port entre des agents dans les locations.
709 Simgrid offre pour l'utilisateur plusieurs types d'interfaces de programmation [5,9]: MSG qui simule les "processes séquentiels conccurents", SimDAG qui est utilisé pour simuler des tâches parallèles modélisées en graphe acyclique direct et SMPI qui simule et exécute les applications écrites en MPI sans ou avec des modifications mineures. Outre le langage C natif, Simgrid accepte des applications écrites en C++, Java, Lua ou encore Ruby.
711 De point de vue pratique, la figure \figref{simgrid1} présente la structure et les éléments de la plateforme de simulation Simgrid. Elle est composée des trois parties différentes suivantes :
715 \item[$\bullet$] Le scénario de la simulation qui constitue les "modèles de ressources" du système. Evidemment, il comprend le code de l'application à exécuter dans le simulateur avec ses différents paramètres d'entrée mais aussi son modèle de déploiement. Un autre composant important de ce scénario aussi est le fichier, généralement au format XML, modélisant les détails de la topologie et l'architecture de l'environnement d'exécution. Il détermine par exemple pour le cas d'une grille de calcul, le nombre et les caractéristiques des clusters contribuant à cet environnement. Pour chaque cluster, les spécifications des serveurs (nombre de cores ou de processeurs, puissance en Flops, taux de disponibilité, ...)sont définies ainsi que les propriétés des réseaux de liaison entre ces différents composants de la grille (topologie du réseau, débit et latence, table de routage, ...).
717 \item[$\bullet$] Le simulateur proprement dit.
719 \item[$\bullet$] Les fichiers de sortie comprenant les résultats de la simulation de l'application ainsi que d'autres fichiers de monitoring de l'exécution comme un fichier de logging et de statistiques. Simgrid peut générer aussi des données pouvant être utilisées pour représenter visuellement le déroulement et la trace de la simulation dans le temps.
723 \mfigure[h]{width=8cm, height=8cm}{"Simgrid - In a nutshell"} {SIMGRID : Les éléments de la plateforme de simulation} {simgrid1}
725 Les applications sous-tendant les expérimentations effectuées dans le cadre de ces travaux ont été ecrites en C et utilise les librairies MPI. Simgrid dispose de l'interface SMPI (Simulated MPI) qui peut exécuter un code MPI parallèles sans aucune ou à la limite très peu de modifications. A titre d'exemple, les variables globales doivent être transférées dans un contexte local dans l'application SMPI. Simgrid/SMPI assure l'implémentation de plus de 80\% des routines de la librairie MPI 2.0. Le code est exécuté réellement dans le simulateur dans l'environnement virtuel spécifié sauf que les communications sont interceptées et le temps de transfert calculé en tenant compte du partage des ressources existantes (par exemple le partage de la bande passante entre processus concurrents sur les réseaux de liaison).La scalabilité de Simgrid peut être obtenu par appel à des routines SMPI qui utilisent des structures de données partagées entre les processus parallèles réduisant ainsi la quantité de mémoire utilisée et permettant une montée en charge non négligeable. Toutefois, dans ce cas, comme tous les processus utilisent la même structure de données, la véracité des résultats obtenus n'est pas importante.
728 \section{Conclusion partielle}
731 \chapter{Etat de l'art et travaux de recherche associés}
733 \section{Concepts et définitions}
734 Dans cette section, des concepts et des définitions relatifs à nos
735 travaux sont passés en revue.
737 \subsection{Performance de l'application parallèle et scalabilité}
739 La performance d'une application dans un environnement
740 distribué peut être définie comme « la capacité de réduire le temps
741 pour résoudre le problème quand les ressources de calcul augmentent
742 » {[}20{]}. L'objectif est de minimiser le
743 temps d'exécution globale de l'application
744 en ajoutant des ressources supplémentaires (processeurs, mémoire,
745 \dots ). D'où la notion de « scalabilité » ou "montée
746 en charge" ou encore "passage à l'echelle" dont l'objectif principal est d'accroitre
747 la performance quand la complexité ou la taille du problème augmentent.
748 Comme nous allons voir tout au long de ce chapitre, deux catégories
749 de facteurs concourent à la difficulté de la prédiction des applications
750 parallèles en considérant leur performance après la montée en charge
751 des ressources : d'une part, on peut énumérer les facteurs
752 liés à l'écosystème d'exécution tels
753 que le nombre de processeurs, la taille de la mémoire et de sous-système
754 de stockage, la latence et la bande passante des réseaux de communication
755 ; d'autre part, les facteurs liés au code lui-même
756 impactent aussi la performance de l'application affectant
757 ainsi la prédiction : il s'agit par exemple de la fréquence
758 de la communication et de la synchronisation, la faible parallélisation
759 mais aussi le mauvais ordonnancement des tâches (équilibrage de charge)
762 Afin de quantifier la performance d'un code, plusieurs
763 métriques ont été définies mais le temps d'exécution
764 global nécessaire pour atteindre la fin du programme reste le plus
765 simple. On peut écrire :
769 T_{exec} = T_{calc} + T_{comm} + T_{surcharge}
772 \indent\indent$T_{exec}$ : Temps d'exécution global \\
773 \indent\indent$T_{calc}$ : Temps de calcul \\
774 \indent\indent$T_{comm}$ : Temps de communication \\
775 \indent\indent$T_{surcharge}$ : Temps de surcharge.
778 Le temps de calcul représente le temps pris par le code pour effectuer
779 des calculs tandis que le temps de communication enregistre le temps
780 des échanges de données ou d'instructions entre les
781 processeurs. Le temps de surcharge comprend le temps pris lors des
782 initialisations telles que la création des threads au début du programme
783 mais aussi le temps de fermeture de l'application à
784 la fin. En général, le temps de surcharge est négligeable par rapport
785 aux temps de calcul et de communication.
787 Des métriques liées directement à la performance du processeur sont
788 bien connues telles que le MIPS (Millions d'instructions
789 par seconde), FLOPS (Floating Point Operations per second), SPECint
790 ou encore SPECfp qui sont des benchmarks pour évaluer la performance
791 du processeur sur des opérations arithmétiques respectivement sur
792 des entiers ou des nombres réels. Par ailleurs, plusieurs métriques
793 rapportées à la performance de l'application parallèle
794 ont été définies mais nous allons retenir les trois les plus utilisées,
795 à savoir le « speedup », « l'efficacité » du code et
798 Le speedup est le rapport entre le temps utilisé pour l'exécution
799 séquentielle du code et le temps pour son exécution en parallèle.
800 Ce rapport peut être obtenu aussi comme le ratio entre le temps d'exécution
801 du code sur un processeur et le temps d'exécution avec
802 n processeurs. Ainsi, il mesure le gain escompté en résolvant le problème
803 en parallèle au lieu d'un lancement en séquentiel.
806 S(n) = T_{Exec\_Seq} / T_{Exec\_Par}(n)
809 \indent\indent S(n) : speedup pour n processeurs \\
810 \indent\indent n : nombre de processeurs \\
811 \indent\indent $T_{Exec\_Seq}$ le temps d'exécution en mode séquentiel \\
812 \indent\indent $T_{Exec\_Par}$ le temps d'exécution en en parallèle.
814 L'efficacité E(n) représente la performance de chaque unité
815 de calcul. Elle s'obtient en divisant le speedup par
816 le nombre de processeurs n. On peut aussi l'écrire
817 comme le rapport entre le temps d'exécution séquentielle
818 et le temps d'exécution parallèle multiplié par le
819 nombre de processeurs n.
823 = T_{Exec\_Seq} / ( n \times T_{Exec\_Par}(n) )
826 La loi de Amdahl donne une limite du speedup maximum qu'on
827 peut obtenir avec un nombre de processeurs n donné. Elle stipule que
828 si f compris entre 0 et 1 est la fraction du temps de la partie séquentielle
833 S(n) \leqslant \dfrac{1}{f+ \dfrac{1-f}{n}}
836 Pour un système parallèle « idéal », le speedup est égal à n et l'efficacité
837 à 1. Dans la pratique, le speedup est toujours inférieur à n avec
838 une limite haute dûe à la loi de Amdahl et l'efficacité
839 a une valeur entre 0 et 1. On peut démontrer que l'efficacité
840 est une fnction décroissante du nombre de processeurs n tandis qu'elle
841 est une fonction croissante de la taille du problème.
843 Dans le cadre de nos travaux, nous avions introduit une métrique utilisée
844 lors de la comparaison de différentes variantes d'algorithmes
845 résolvant le même problème exécutés en différents mode de communication
846 (synchrone ou asynchrone). Ainsi, le « gain relatif » entre l'exécution
847 de deux variantes de code résolvant un problème donné est le ratio
848 entre le temps d'exécution global du premier algorithme
849 et le temps d'exécution global du deuxième algorithme
850 selon le mode retenu pour chaque code.
854 G_{relatif} = T_{Exec\_Algo\_1} / T_{Exec\_Algo\_2} \times {100}
858 \subsection{Taux d'erreur lors de la prédiction}
860 Lors de l'exercice de prédiction sur la performance
861 d'une application parallèle, un modèle est construit
862 à partir des observations passées des
863 variables considérées (données empiriques observées)afin de pouvoir prédire les résultats (données calculées) pour des nouvelles valeurs de ces variables. L'objectif
864 lors de cette modélisation est de minimiser l'écart
865 entre les valeurs calculées théoriques et les valeurs réelles observées.
867 Dans le cadre de la classe des algorithmes numériques itératifs consacrée
868 à ces travaux, un autre taux d'erreur $\epsilon$ est déterminé
869 d'avance et qui sert à détecter la convergence locale
870 de l'algorithme {[}9{]}. A chaque itération, la différence
871 entre la valeur approchée calculée, solution du problème, et celle obtenue
872 à l'itération précédente est calculeé : si elle est
873 inférieure au taux d'erreur accepté, l'algorithme
874 s'arrête en ayant atteint la convergence sinon, on
875 repart pour une nouvelle itération.
877 A l'itération k, la convergence est atteinte quand
880 (\|X_l^k - X_l^{k+1}\|_{\infty}\leq\epsilon)
883 \subsection{Weak contre strong scaling}
885 Un des objectifs de nos travaux consistent à exécuter les algorithmes
886 choisis en simulant leur exécution sur des plateformes de plus en
887 plus larges avec un nombre de processeurs et de cores de plus en plus
888 grand. Deux modes existent pour cette montée en charge donnant des résultats différents
889 : le « weak » et le « strong » scaling.
891 La différence entre ces deux modes repose sur la variation de la taille
892 du problème lors de la montée en charge (scaling). Pour le « weak
893 » scaling, on essaie d'observer le comportement du
894 programme en gardant le même nombre d'éléments à traiter
895 par processeur ou coeur. Dans ce cas, les ressources
896 de calcul additionnelles
897 va augmenter proportionnellement à la taille du problème en entrée. Ainsi, la problématique ici est de résoudre un problème de plus grande taille. Par ailleurs, le « strong » scaling
898 essaie de résoudre un problème donné plus vite. Ainsi, dans ce cas,
899 la taille du problème en entrée reste constante même si on adjoint
900 une capacité plus grande aux unités de calcul.
902 \mfigure[h]{width=8cm, height=8cm}{"Weak vs Strong scaling"} {Weak vs Strong scaling: Temps d'exécution et Speedup} {scaling}
905 La figure \figref{scaling} montre que le temps d'exécution décroit (resp. reste constant) quand le nombre de processeurs augmente en strong mode (resp. en weak mode). De même, le speedup croit avec le nombre de processeur en strong mode tandis qu'il reste constant en weak mode.
907 \section{Problématique sur la prédiction à large échelle de la performance des applications}
909 La prédiction de la performance des applications parallèles à large
910 échelle constitue ces dernières années une des préoccupations majeures
911 des scientifiques et des utilisateurs des systèmes de calcul à haute
912 performance. En effet, en considérant le coût de lancement nécessaire
913 mais aussi le temps d'exécution imparti pour une telle
914 application, il est toujours d'intérêt de disposer
915 d'un outil ou d'un moyen afin de connaître
916 le comportement de l'application en montant en charge. Pour cela, il s'agit
917 d'estimer le temps total d'exécution $T_{exec}$ dans ces conditions. De plus,
918 dans le cadre d'un calcul sur la grille,l'objectif est de
919 déterminer la configuration idéale, en termes de blocs et
920 de nombre de noeuds (processeurs, coeurs) par bloc, pour obtenir le
921 meilleur coût mais aussi le temps optimal d'exécution
924 Dans ce chapitre, dans un premier temps, les problématiques et difficultés
925 inhérentes à cet exercice de prédiction de la performance des applications
926 parallèles sont abordées. Ensuite, nous allons passer en revue les
927 solutions possibles apportées à ces problèmes.
929 De prime abord, on peut diviser en deux grands groupes, selon leurs
930 objectifs, les travaux relatifs à la prédiction de la performance
931 en environnement parallèle et de calcul à haute performance.
933 D'une part, la prédiction peut viser l'objectif
934 de la conception, le développement et la mise au point de systèmes
935 qui n'existent pas encore physiquement. Cette catégorie
936 regroupe entre autres la conception de nouvelles architectures de
937 matériels (CPU, Mémoire, Stockage) {[}\dots {]} mais aussi par exemple,
938 la mise en oeuvre d'une nouvelle infrastructure de réseaux
939 de communication {[}\dots {]}. Plusieurs utilisations peuvent être
940 exploitées pour ce type de prédiction. En effet, outre le calibrage
941 de systèmes pour une exécution optimale, il permet le débogage et
942 la mise au point des applications avec un ensemble de contraintes,
943 que ce soit matérielles ou logicielles {[}..{]}. Notons tout de suite
944 que cette dernière application sur le réseau a fait l'objet
945 de nombreux travaux ces dernières années, permettant de déterminer
946 ou d'estimer d'avance la performance
947 et l'efficacité de la solution future projetée et éventuellement
948 de corriger et d'améliorer les imperfections.
950 D'autre part, la prédiction de la performance d'une
951 application parallèle se porte sur la détermination du temps d'exécution
952 de la dite application en montant en charge sur une large échelle.
953 Encore une fois, dans ce cas aussi, on ne dispose pas de l'environnement
954 d'exécution cible mais on essaie de déterminer quel
955 serait le temps total, donc le coût imputé au lancement de l'application
956 sous diverses conditions. Ces dernières sont déterminées par plusieurs
957 facteurs dont les principaux sont les paramètres d'entrée
958 de l'application tels que la taille du problème à résoudre
959 mais aussi les caractéristiques et la puissance globale intrinsèque
960 de la grille de calcul de lancement : nombre de blocs, de processeurs
961 / coeurs, les paramètres de la capacité du réseau de communication
962 inter et intra-noeuds de la grille, \dots{} Ainsi, une telle prédiction
963 permet de conduire une analyse « what-if » du comportement de l'application
964 si par exemple, on va multiplier par 10 ou 100 la taille du problème
965 en entrée, mais aussi si on double la capacité de l'environnement
966 cible en ajoutant d'autres blocs à la grille ou en
967 apportant plus de processeurs dans chaque bloc. Les travaux rapportés
968 dans cette thèse se focalisent plutôt sur cette seconde catégorie
969 de prédiction de la performance d'applications spécifiquement
970 écrites en MPI dans un environnement de grille de calcul.
972 \subsection{Facteurs liés à l'écosystème}
974 La prédiction de la performance des applications parallèles approchant
975 le plus possible de la réalité avec un taux d'erreur
976 minimal dépend de plusieurs facteurs pouvant avoir des impacts
977 décisifs sur les résultats. En effet, à titre d'exemple,
978 la modification de la topologie ou des paramètres de l'infrastructure
979 du réseau de communication tels que la latence ou la taille de la
980 bande passante aura inévitablement des conséquences sur la performance
981 globale de l'application parallèle. En donnant un autre
982 exemple, il est clair que la montée en charge en augmentant la taille
983 du problème avec une plus grande capacité de calcul proposant un plus
984 grand nombre de processeurs ou de coeurs modifiera la performance
985 de l'application. Ainsi, de façon générale, plusieurs
986 problématiques se posent quant au lancement d'une application
987 parallèle dans une grille de calcul mais aussi, plusieurs facteurs
988 influencent directement le comportement et la performance du système.
989 Nombreux travaux ont déjà proposé des modèles de prédiction à large
990 échelle sur la performance du code parallèle avec un taux d'efficacité
991 plus ou moins acceptable. Certains de ces modèles seront détaillés
992 dans le paragraphe 2.4.
994 Les scientifiques et les utilisateurs désirant lancer l'exécution
995 d'un programme en environnement parallèle ont tous
996 été confrontés à la même problématique de mise à disponibilité de
997 l'environnement d'exécution. En effet,
998 la réservation des ressources nécessaires pour lancer le système n'est
999 pas toujours immédiate mais en plus, le coût peut ne pas être négligeable
1000 dans un contexte de rareté des machines super puissantes pourtant
1001 très sollicitées par différents acteurs {[}\dots {]}. Cette problématique
1002 peut être parfois accentuée par la non disponibilité de l'infrastructure
1003 cible parce que justement, les résultats obtenus par le lancement
1004 de l'application qui pourra déterminer les caractéristiques
1005 techniques de l'environnement cible. Ainsi, cette contrainte
1006 majeure doit être levée durant tout le cycle de vie de développement
1007 de l'application. En effet, les coûteux développements
1008 et écritures du code de l'application, les opérations
1009 répétitives lors de sa mise au point ainsi que les tests itératifs
1010 de lancement requièrent un environnement réel disposant de la capacité
1011 nécessaire à ces opérations, ce qui n'est pas évident.
1012 Un autre facteur lié à cette problématique a toujours été aussi l'estimation
1013 à l'avance de cette capacité de calcul nécessaire afin
1014 d'avoir un environnement le plus adéquat afin d'éviter
1015 le gaspillage en cas de surestimation ou l'échec d'exécution
1016 en cas de sous-estimation. Cette estimation concerne les ressources
1017 primaires requises telles que le processeur, la taille mémoire DRAM
1018 et cache ainsi que le sous-système de stockage pour la capacité de
1019 calcul d'une part mais aussi les paramètres du réseau
1020 de communication (local ou distant) pour le temps de communication
1021 et d'échange de messages d'autre part.
1022 L'architecture inhérente à la grille de calcul composée
1023 d'entités reliées par des réseaux distants ajoute une
1024 autre considération pour la communication entre les processus parallèles
1025 sur le caractère hétérogène de l'infrastructure que
1026 ce soit la puissance de calcul des serveurs (différents types de processeurs)
1027 que le type des liaisons existants entre les blocs de la grille (réseaux
1028 hétérogènes). En effet, les environnements complexes de type grille
1029 de calcul actuels sont composés généralement de machines physiques
1030 dotées de processeurs multi-coeurs de différentes architectures (niveau
1031 de cache, latence entre processeurs, \dots ). De plus, en analysant
1032 la structure du réseau de communication dans la grille, on peut distinguer
1033 $(1)$ d'abord, les échanges internes au niveau d'un
1034 élément d'un bloc (entre les coeurs d'un
1035 processeur et entre les processeurs d'un même serveur
1036 physique), (2) ensuite, les échanges « intra-blocs » caractérisant
1037 le trafic entre les différents éléments d'un bloc et
1038 (3) enfin, les échanges « inter-blocs » définissant la communication
1039 entre les blocs de la grille. Tant au niveau de leur topologie qu'en
1040 termes d'efficacité, ces trois niveaux de communication
1041 peuvent présenter des caractéristiques complètement différentes et
1042 hétérogènes. Ainsi, les deux premiers réseaux sont implémentés généralement
1043 dans un contexte de réseau local avec un temps de latence très court
1044 et une bande passante large. Tandis que le réseau de liaison entre
1045 les blocs de la grille peuvent être de type distant (lignes spécialisées
1046 distantes, canaux satellites de communication, réseau de type Internet,
1047 \dots ) donc d'une efficacité moindre en termes de
1048 latence et de bande passante mais aussi sujet à des perturbations
1049 diverses (Figure \figref{cpumulti}). Ces aspects liés à l'architecture
1050 de grille de calcul rendent la prédiction de la performance des applications
1051 parallèles plus difficiles. En effet, une surcharge élevée due à des
1052 perturbations sur le réseau inter-blocs de la grille peut fausser
1053 complètement les résultats de la prédiction du temps de communication
1054 global de l'application.
1057 \subsubsection{Facteur architecture des processeurs}
1059 Un autre facteur ayant un impact sur le temps d'exécution
1060 global est d'une part, le modèle d'architecture
1061 des processeurs de calcul et d'autre part, la puissance
1062 intrinsèque de ces derniers.
1064 La course à la puissance nécessaire aux applications de calcul de
1065 haute performance ne cesse de s'accélérer de plus en
1066 plus vite exigeant une capacité de calcul de plus en plus grande.
1067 C. Willard {[}12{]} résume ce phénomène en disant que lorsqu'un
1068 problème - la conception d'un pont par exemple -
1069 est résolu, la solution trouvée n'est plus utile parce
1070 qu'on ne va pas refaire la conception. On passe généralement
1071 à un problème plus complexe - la conception d'un
1072 autre ouvrage plus complexe par exemple. La conséquence de cette course
1073 (actuellement du pentascale vers l'exascale) a suscité
1074 le développement des architectures de processeurs multi-coeurs dont
1075 l'accroissement de la puissance a dépassé la traditionnelle
1076 loi de Moore (renvoi). De plus, des co-processeurs spécialisés et
1077 autres accélérateurs (GPU : Graphic Processing Units {[}{]}) ont été
1078 adjoints aux processeurs multi-coeurs pour améliorer le temps de calcul.
1079 Une autre architecture variante du multi-coeurs est le MIC (Many Integrated
1080 Core) {[}Intel Xeon Phi{]}. Ce type d'unité de calcul
1081 joue au départ le rôle de co-processeur pour les applications à haute
1082 intensité de calcul. Ainsi, plusieurs coeurs ont été pressés au niveau
1083 du processeur (« socket ») emmenant un parallélisme au niveau de la
1084 puce. La Figure~\ref{fig:4} donne un aperçu de l'architecture
1085 d'un processeur multi-coeurs.
1087 \mfigure[h]{width=8cm, height=8cm}{"Architecture des CPU multi-coeurs"} {Architecture des CPU multicoeurs} {cpumulti}
1089 La performance d'une
1090 telle entité de calcul repose sur la vitesse d'accès
1091 des coeurs aux données en mémoire. En effet, elle est dotée d'un
1092 bus rapide et une hiérarchie de cache mémoire beaucoup plus rapide
1093 d'accès que la RAM. En termes d'architecture,
1094 la classification de Flynn (1972) {[}{]} a créé quatre catégories
1095 de machines parallèles selon les flots de données et les flots d'instructions: SISD (Single instruction, single data), SIMD (Single instruction,
1096 multiple data), MISD et MIMD (Multiple instruction, multiple data).
1097 Cette dernière classe regroupant les machines parallèles généralistes
1098 actuelles se décline en trois sous-catégories :
1100 \mfigure[h]{width=8cm, height=8cm}{"MIMD Distributed Memory"} {Modèle MIMD Distribué} {MIMDDM}
1102 \mfigure[h]{width=8cm, height=8cm}{"MIMD Shared memory - SMP"} {Modèle MIMD partagé} {MIMDSM}
1104 \mfigure[h]{width=8cm, height=8cm}{"MIMD Hybride"} {Modèle MIMD hybride} {MIMDHY}
1108 \item [$\bullet$] - Machine MIMD à mémoire partagée (Figure \figref{MIMDSM}) : Les unités de calcul
1109 accède à la mémoire partagée via un réseau d'interconnection
1110 (généralement, de type GigabitEthernet (renvoi) ou Infiniband (renvoi)).
1111 Il existe trois types d'implémentation : le crossbar,
1112 le Omega-Network et le Central Databus.
1114 \item [$\bullet$] Machine MIMD à mémoire distribuée (Figure \figref{MIMDDM}) : Chaque unité de
1115 calcul est doté de son espace mémoire propre. Un réseau d'interconnexion
1116 intègre l'ensemble assurant la communication entre
1117 ces unités. Il existe trois types de machines MIMD à mémoire distribuée: les hypercubes, les fat trees et les autres.
1119 \item [$\bullet$] Machine MIMD hybride (Figure \figref{MIMDHY}) : Dans ce cas, le système est la
1120 combinaison des deux modèles précédents : un ensemble de processeurs
1121 partage un espace mémoire et ces groupes sont interconnectés par un
1126 A titre d'exemple de machines parallèles, le site Top500.org
1127 {[}14{]} classe suivant différents critères les plus performantes.
1128 Ainsi, la figure \figref {power} montre l'évolution de la puissance
1129 de calcul mondiale dont le top actuel développe un pic de performance
1130 théorique proche de 50 PetaFlops (33 Linpack PetaFlops (renvoi)) avec
1131 3.120.000 coeurs ( 16 noeuds avec des processeurs de 2x12 coeurs par
1132 noeud) et plus de 1.240.000 Gb de mémoire (64 Gb par noeud) avec des
1133 accélérateurs 3 $\times$ Intel Xeon Phi par noeud. Il s'agit
1134 de la machine Tianhe-2 (MilkyWay-2) de la National Super Computer
1135 Center à Guangzhou en Chine {[}15{]}. A la tendance actuelle, l'atteinte
1136 de l'exaflops n'est pas loin.
1138 \mfigure[h]{width=8cm, height=8cm}{"Evolution de la puissance de calcul mondiale"} {Evolution de la puissance de calcul mondiale} {power}
1140 Pour arriver à de telles puissances, diverses architectures de processeurs
1141 ont vu le jour ces dernières années. Outre l'Intel
1142 Xeon Phi cité plus haut, les processeurs basés sur les circuits intégrés
1143 FPGA (Field Programmable Gate Array) montrent une flexibilité efficace
1144 pour s'adapter par configuration au type d'applications
1145 à traiter {[}14{]}. En effet, cette architecture permet la programmation
1146 de la « matrice de blocs logiques » interconnectée par des liaisons
1147 toutes aussi programmables. Cette possibilité de programmation des
1148 circuits et des interconnexions entraine aussi la réduction de la
1149 consommation d'énergie. Par ailleurs, les unités GPU
1150 (Graphics Processing Unit) sont initialement des co-processeurs produits
1151 par AMD et NVIDIA pour des applications à fort rendu graphique, libérant
1152 ainsi la charge au processeur. Par la suite, elles ont été complètement
1153 programmables et se sont montrées très efficaces pour les algorithmes
1157 \subsubsection{Facteur : Mémoire et stockage}
1159 Les différentes architectures de processeurs parallèles vues plus
1160 haut se trouvent toutes confrontées au problème de chargement de données
1161 à traiter en mémoire. Ainsi, elles se sont dotées de contrôleurs de
1162 mémoire incorporés mais aussi divers niveaux de caches pour faire
1163 face à cette différence de vitesse de traitement entre les processeurs
1164 et les mémoires dynamiques. Par exemple, les machines SIMD utilisent
1165 des registres de communication internes pour communiquer avec les
1166 autres CPUs. Pour les machines de type MIMD où différentes tâches
1167 sont exécutées par chaque processeur à un instant donné entraînant
1168 ainsi une synchronisation obligatoire pour des échanges de données
1169 entre processeurs, ces derniers peuvent exploiter la mémoire partagée
1170 pour effectuer ces transferts ou prévoir des bus dédiés à cette fin
1173 Par ailleurs, les mémoires, non intégrées au processeur, et les sous-systèmes
1174 de stockage constituent aussi un facteur important ayant un impact
1175 sur le temps d'exécution de l'application
1176 parallèle. En effet, les mémoires externes sont utilisées soit pour
1177 échanger des données entre les CPU, soit pour accéder à la zone mémoire
1178 pour lire, écrire ou mettre à jour des données. Dans ce domaine, en
1179 considérant les architectures parallèles MIMD, on peut classer en
1180 deux grandes catégories selon les modèles de mémoire {[}17{]}: (1)
1181 les multiprocesseurs et (2) les multicomputers (Fig \dots ). La première
1182 catégorie regroupe les machines à mémoire partagée (« shared memory
1183 ») qui se subdivisent en trois classes selon le mode d'accès
1184 des CPU aux mémoires : (1) UMA ou « Uniform Memory Access » où tous
1185 les CPU accèdent une page mémoire physique de façon « uniforme »,
1186 avec le même temps d'accès tolérant ainsi la mise à
1187 l'échelle. Dans ce cas, les CPU sont tous connectés
1188 aux mémoires via un bus ((Figure \figref{UMA}). Un système d'adressage
1189 global est appliqué à l'ensemble des mémoires physiques.
1190 (2) NUMA ou « Non Uniform Memory Access » où les groupes de CPU accèdent
1191 à des mémoires locales à travers des buses et les groupes sont interconnectés
1192 par un réseau de communication ((Figure \figref{NUMA}). Dans ce cas, le temps
1193 d'accès des CPU aux pages mémoires varie selon que
1194 ces dernières sont locales ou distantes. L'espace d'adressage
1195 des mémoires se fait au niveau de chaque groupe de CPU. (3) L'architecture
1196 COMA (« Cache Only Memory Access ») est un hybride avec un modèle
1197 de programmation de mémoire partagée mais une implémentation physique
1198 de mémoire distribué ((Figure \figref{COMA}). Dans ce cas, chaque noeud détient
1199 une partie du système de l'espace d'adressage.
1200 Le partitionnement des données étant dynamique, la structure COMA
1201 n'associe pas la même adresse à une page physique de
1202 la mémoire. Les mémoires locales dans ce cas de figure jouent finalement
1203 un rôle de cache au processeur.
1205 \mfigure[h]{width=8cm, height=8cm}{"UMA architecture"} {Mémoire MIMD: Architecture UMA} {UMA}
1207 \mfigure[h]{width=8cm, height=8cm}{"NUMA architecture"} {Mémoire MIMD: Architecture NUMA} {NUMA}
1209 \mfigure[h]{width=8cm, height=8cm}{"COMA architecture"} {Mémoire MIMD: Architecture COMA} {COMA}
1211 Malgré que dans le cadre de nos travaux, nous n'avions
1212 pas eu une contrainte particulière en termes de système de stockage,
1213 une brève revue des problématiques liées à ce sous-système en environnement
1214 de calcul parallèle est présentée parce qu'il peut
1215 influencer à large echelle sur la prédiction de la performance de
1216 l'application. Les systèmes traditionnels ont opté
1217 pour des architectures NFS (Network File System) ou de type NAS (Network
1218 Attached Storage) ou encore de type SAN (Storage Access Network).
1219 Malgré que les systèmes de stockage NFS et NAS sont relativement faciles
1220 à mettre en oeuvre, l'inconvénient majeur est qu'ils
1221 présentent un point de défaillance unique (SPOF) et ont des difficultés
1222 de monter en échelle. Pour le système SAN, les données sont stockées
1223 dans des baies de stockage accessibles par les unités de calcul à
1224 travers un réseau basé sur des canaux de fibres et des adapteurs de
1225 haut débit (HBA) ; ce qui rend le coût de l'implémentation rapidement
1226 excessif dès que le nombre de noeuds augmente. Dans un environnement
1227 d'applications parallèles, le réseau de communication
1228 doit avoir une très haute performance pour répondre aux besoins d'échange
1229 mais aussi d'accès aux données. En plus, il doit
1230 avoir la flexibilité et la capacité de monter en échelle suivant la
1231 demande du système. Ces caractéristiques requis sont accentués par
1232 la variabilité des besoins en entrées/sorties des applications HPC: dans le même lot d'applications exécutées, certaines
1233 accèdent à des données de manière séquentielle tandis que d'autres
1234 demandent des entrées/sorties aléatoires fortement sensibles. Les
1235 solutions apportées dénommées « système de fichiers parallèle » reposent
1236 sur la conception d'une architecture répondant à ces
1237 prérequis. Dans ce type de système de fichiers, les blocs de données
1238 sont répartis par morceaux dans différents serveurs et dans différentes
1239 locations du système de stockage. On peut ainsi accroitre le débit
1240 de stockage et d'extraction au fur et à mesure que
1241 le nombre de serveurs ou de baies de stockage augmentent.L'architecture sera réalisée par:
1244 \item [$\bullet$] l'introduction d'une couche de « noeuds
1245 de services de fichiers » entre les noeuds de calcul et les baies de
1246 stockage des données. Ces noeuds sont reliés en clusters via un réseau
1247 rapide de type Infiniband.
1249 \item [$\bullet$] L'ajout des «serveurs de metadata » (MDS : MetaData
1250 Server) qui gèrent les métadonnées accessibles à partir des « baies
1251 de stockage des métadonnées » (MDA) avant d'extraire
1252 les données proprement dites sur les baies de stockage en arrière-plan.
1255 Les métriques utilisées pour caractériser une telle architecture sont
1256 le nombre nominal d'entrées/sorties par seconde (IOPS)
1257 d'une part et le débit de la bande passante du réseau
1258 reliant les différents composants (Gb/s) d'autre part.
1259 Plusieurs solutions globalement efficaces ont été avancées respectant
1260 cette architecture. On peut citer les « systèmes de fichiers ouverts
1261 » tels que pNFS (Parallel NFS), GFS, XFS, PVFS (Clemson University),
1262 MogileFS {[}\dots {]} mais Lustre {[}\dots {]} présenté dans la figure
1263 \dots{} est largement utilisé en environnement de calcul parallèle
1264 : au moins, la moitié des clusters « top 10 » utilise ce modèle et
1265 plusieurs laboratoires l'ont aussi adopté (Pacific
1266 Northwest National Lab (PNNL), Lawrence Livermore National Lab (LLNL)
1267 mais aussi Los Alamos National Lab (LANL). Lustre utilise les OST
1268 («Object Storage Targets ») dans les serveurs de fichiers (en opposition
1269 au « Block Storage Device ») pour assurer la cohérence et la résilience
1270 du système de fichiers. A titre indicatif, le cluster de PNNL {[}19{]}
1271 avec 1800 processeurs Itanium délivrant jusqu'à 11
1272 TFlops utilise Lustre avec une capacité de stockage de 53 Toctets
1273 avec une bande passante de 3.2 Gbits/s. Chaque noeud du cluster peut
1274 accéder au serveur parallèle Lustre avec un débit de 650 Mb/s.
1276 La mise en oeuvre des systèmes de fichiers parallèles pour les calculs
1277 à haute performance s'approche des technologies utilisées
1278 en entreprise pour exploiter les applications à données intensives
1279 traitant de très grandes masses de données. En effet, les « sciences
1280 de données », « big data », « analytics » (business intelligence,
1281 Datamart, Data Mining) demandent des accès très rapides à des grands
1282 volumes de données variées, structurées ou non structurées, pour en
1283 extraire une information utile. Pour cela, le principe « d'apporter
1284 le calcul auprès des données » (« Bring the compute to the data »)
1285 est appliqué en lieu et place du traditionnel « extraire et charger
1286 en mémoire les données du système de stockage pour traitement par
1287 l'unité de calcul ». Hadoop {[}\dots {]}, une plateforme
1288 de traitement de « big data » la plus utilisée, combine dans la même
1289 machine physique les « noeuds de calcul » et les « noeuds de données
1290 ». Cet ensemble d'outils ayant une architecture fortement
1291 distribuée utilise le mécanisme de transfert des données du système
1292 de stockage « globalement partagé et persistent » ayant une large
1293 capacité vers le système de fichier local avant traitement.
1296 \subsubsection{Facteur : Réseaux de communication}
1298 Dans un contexte d'exécution parallèle et distribuée
1299 des applications, la communication entre les processus de calcul pour
1300 échange de données ou d'instructions est critique et
1301 peut constituer un goulot d'étranglement pour le temps
1302 d'exécution et la montée en charge de l'applicaiton.
1303 En effet, la performance globale quantifiée par le temps d'exécution
1304 de l'application dépend fortement de la nature et de
1305 la typologie des réseaux de communication. Il a été mis en exergue
1306 dans les paragraphes précédents l'importance du trafic
1307 de données entre chaque unité de calcul et les différentes couches
1308 de mémoire vive utilisées par le système. Dans un environnement de
1309 grilles de calcul, de clusters ou de P2P, d'autres
1310 types de réseaux de communication influencent cette performance.
1312 %Ethernet, Infiniband (56 à 100 Gb/s), Omni-path {[}15{]}
1314 %Facteurs influençant le temps de communication : Type de comm (point
1315 %to point, collective comme broadcast, scatter, gather, reduce)
1317 \subsection{Facteurs liés au code de l'application}
1319 Outre ces problématiques liées directement à l'environnement
1320 de lancement, plusieurs autres facteurs liés au code de l'application
1321 lors de son exécution peuvent influencer le comportement du système
1322 rendant aussi la prédiction de la performance complexe et difficile.
1323 Ces facteurs liés au comportement du code lors de son exécution en
1324 parallèle vont influencer la performance globale en impactant le temps
1325 de calcul et le temps de communication des données entre les unités
1328 \subsubsection{Facteur : Taille du problème}
1330 Parmi les facteurs impactant le temps de calcul, la taille du problème
1331 peut avoir une grande influence sur le temps de calcul surtout en
1332 strong scaling. En effet, dans ce mode de scalabilité, la
1333 taille du problème étant fixe alors qu'on augmente
1334 la puissance de calcul par l'ajout de processeurs et
1335 coeurs supplémentaires, le temps de calcul va varier en fonction de
1336 ces changements. En mode weak scaling où la taille du problème
1337 augmente dans la même proportion que l'accroissement
1338 du nombre de processeurs / coeurs, le temps de calcul global attendu
1339 reste théoriquement plus ou moins constant. La taille du problème
1340 qui ne cesse d'augmenter pour le besoin des applications
1341 parallèles constitue un élément impactant le temps total d'exécution
1344 \subsubsection{Performance de la parallélisation}
1346 Dans cette section, la notion de "performance de la parallélisation" est intrduite pour caractériser la performance d'un code une fois executé en mode parallèle. C. Rosas et Al. {[}\dots {]}
1347 définit cette mesure ($\eta$Parallel) comme étant le produit des trois facteurs fondamentaux "normalisés" suivants dont chaque facteur est quantifié par une valeur entre 0 et 1 :
1351 \eta Parallel =LB \times Ser \times Trf
1356 \item [$\bullet$] L'efficacité de la « répartition des charges » LB ("Load Balancing") est définie comme étant « la perte d'efficacité potentielle» sur le temps de calcul de chaque processus. Elle est mesurée comme
1357 étant le rapport entre le temps de calcul moyen par processeur et
1358 le temps de calcul maximum enregistré sur l'ensemble
1359 des processeurs participants:
1363 LB = {[} \sum \limits_{k=1}^p eff_k) / p {]} / max(eff_k)
1365 où : p est le nombre de processeurs et $eff_k$ ("Efficiency") le temps de calcul utilisé par le processeur k.
1367 \item [$\bullet$] L'efficacité de la « sérialisation » : Elle représente
1368 l'inefficacité causée par les « dépendances dans le
1369 code » qui se traduit par la nécessité d'échanger des
1370 données entre les processeurs. Ces dernières peuvent impacter de façon
1371 importante la performance du code parallèle. Ce facteur est mesuré comme étant
1372 le temps maximum enregistré pour tous les processeurs présents lors de l'exécution
1373 du code en faisant abstraction du temps des échanges: on considère comme si on est en présence d'une architecture à « communication instantanée » c'est-à-dire un réseau avec une bande
1374 passante infinie et une latence égale à 0. Dans ce cas, ideal ($eff_i$) est l'efficacité du processeurs i sans le temps de communication.
1378 Ser = max ( ideal( eff_i ) )
1381 \item [$\bullet$] L'efficacité du « transfert » de données : La montée
1382 en charge de la taille du problème impactera la taille des données
1383 à échanger entre les processus. Ce facteur est défini comme étant
1384 la perte de performance globale due aux transferts des données. En
1385 prenant en compte le temps de communication, il est mesuré comme le
1386 ratio entre le maximum entre les temps relatifs d'exécution
1387 des processus concurrents (rapport entre le temps d'exécution $T_i$
1388 d'un processus et le temps total réel d'exécution T
1389 du code) et l'efficacité de la sérialisation Ser :
1393 Trf = max( T_i/T ) / Ser
1398 Les auteurs ont montré que cette mesure de la performance de la parallélisation
1399 est indépendante du temps absolu total d'exécution.
1400 Pour les algorithmes itératifs, cette métrique ne dépend pas du nombre
1401 d'itérations avant l'arrêt de l'algorithme
1402 : le temps d'exécution d'une itération
1405 Cette quantification de la performance de la parallèlisation du code
1406 repose sur les trois paramètres suivants appelés aussi « inhibiteurs
1407 de la performance » qui décrivent selon {[}12{]} la "sensibilité"{}
1408 du code : (1) la sensibilité à la fréquence CPU, (2) la sensibilité
1409 à la bande passante mémoire et enfin (3) le temps consacré aux communications
1410 et les entrées / sorties. Selon l'algorithme considéré
1411 ou l'aspect scientifique du code, l'application
1412 peut être influencée par ces paramètres. L'analyse
1413 du code par le profiling et l'optimisation pourront
1414 aider à cette sensibilité du code et à améliorer la performance de
1417 Dans le cadre de ces travaux, à plus large échelle, c'est-à-dire
1418 en augmentant la taille du problème en entrée comme la capacité de
1419 calcul disponible, les facteurs suivants vont influencer de plus en
1420 plus le temps d'exécution de l'application
1421 impactant ainsi la performance de la parallélisation du code. Selon
1422 {[}18{]}, même si la surcharge engendrée par la parallélisation du
1423 code (« surcharge due à la parallélisation ») ainsi que celle naturellement
1424 subie par le système comme dans une exécution séquentielle (« surcharge
1425 système ») peuvent ne pas être négligeables, on constate
1426 comme précédemment que les facteurs liés à « l'oisivité
1427 » des processeurs ainsi que la communication entre les différentes
1428 couches mémoires (DRAM, cache, « mémoire d'attraction
1429 » (renvoi) ) peuvent peser lourdement à grande échelle sur la performance
1430 globale de l'application. La surcharge due à la parallélisation
1431 provient de l'initialisation par processeur pour une
1432 exécution parallèle (qui n'existe pas lors d'une
1433 exécution séquentielle). Le partitionnement des tâches mais aussi les tâches
1434 de vérrouillage et de déverrouillage lors d'une entrée
1435 et de sortie d'une section critique du code contribue
1436 à l'importance de ce facteur. La surcharge système
1437 comme les défauts de pages, l'interruption horloge,
1438 le mécanisme de fork/join, \dots{} peut être accentuée par rapport
1439 à une exécution séquentielle surtout pour les programmes à haut degré
1440 de parallélisme parce que ces actions sont inhérentes à un processeur
1441 et l'augmentation du nombre de processeurs lors d'une
1442 exécution parallèle peut engendrer une surcharge système non négligeable.
1443 Toutefois, comme avancé plus haut, ces surcharges peuvent ne pas être
1444 significatives comparées au temps perdu suite à l'oisivité
1445 (idle) des blocs de calcul. Cette dernière est surtout due à une parallélisation
1446 insuffisante ou encore par une répartition des charges non optimale.
1447 Enfin, le facteur communication nécessaire pour le thread courant
1448 de chercher des données qui ne sont pas localisées dans ses mémoires
1449 caches locales peut affecter dramatiquement la performance de la parallélisation
1450 du programme. En effet, pendant cette recherche, l'unité
1451 de calcul reste bloqué (stalled).
1454 %\section*{Solutions apportées}
1457 \section{Techniques d'analyse de performance des applications parallèles}
1458 \subsection{Généralités et objectifs}
1459 L'analyse de la performance des applications parallèles est largement utilisée et même recommandée lors de l'écriture et la mise au point du programme. En effet, pour déterminer et estimer le coût de l'execution du code, il est d'usage de procéder à l'analyse de la performance dans le but d'optimiser le programme parallèle afin de trouver la meilleure performance en termes de coûts (réduction du temps d'exécution, efficacité de l'utilisation des ressources, ...). \\
1460 Cette opération consiste surtout à détecter les "régions" et "hotspots" qui correspondent aux parties du code les plus consommatrices de ressources (CPU, mémoire) en particulier celles qui consomment le plus de temps de calcul ou de communication. Elle permet aussi de localiser les éventuels goulots d'étranglement lors de l'exécution du code. Les résultats de cette analyse permet de guider le développeur sur ses actions pour améliorer le code par la réécrire de certaines parties du code par exemple ou de procéder à un meilleur découpage du problème pour une meilleure répartition des charges et l'utilisation des mémoires ou encore par la modification de l'algorithme pour permettre une parallélisation plus poussée.
1461 Plusieurs outils existent avec différentes approches pour effectuer cette analyse.
1462 La section suivante montre que le modèle de performance établi lors de cette analyse permet aussi d'anticiper sur la prédiction de la performance de l'application parallèle avec la montée en charge [21]. En effet, l'analyse de la performance d'un code peut être utilisée pour prédire le comportement du programme soit d'une part sur un environnement de machines déterminé (benchmarking) soit d'autre part, avec une taille de problème plus importante.
1464 \subsection{Approches et méthodologie}
1465 Dans le domaine du calcul parallèle, l'analyse du code d'une application suit les trois étapes suivantes [21,22]:
1467 \item [$\bullet$] L'acquisition et la collecte des données
1468 \item [$\bullet$] L'enregistrement des données collectées
1469 \item [$\bullet$] La représentation des résultats de l'analyse
1471 Les deux derniers points sont regroupés sous le nom générique de "profiling" ou de "tracing" selon le modèle adopté de l'acquistion des données. La figure \figref{anaperf} montre ces trois couches de l'analyse de performance et décrit les différentes techniques utilisées pour cette analyse. Les flèches tracées sur la figure montrent les combinaisons possibles entre les techniques présentées. D'ailleurs, dans la pratique, d'autres combinaisons peuvent être expérimentées pour atteindre les objectifs fixés.
1473 \mfigure[h]{width=8cm, height=8cm}{"Performance Analysis techniques"} {Classification des techniques d'analyse de la performance} {anaperf}
1475 Cette approche à trois étapes commence par la collecte des données sur la performance du code qui consiste à deux techniques les plus utilisées à savoir le "sampling" (ou "l'échantillonage") et "l'instrumentation basée sur les évenements".
1477 \item [$\bullet$] Le "sampling" ou "l'echantillonage" capture les données décrivant l'état du code lors de l'exécution du programme à chaque instant défini par la fréquence de l'echantillonage. IL est réalisé généralement avec la mise en place d'un timer qui déclenche la collecte des données selon une période définie. Ces dernières se rapportent sur les statistiques relatives aux appels de fonctions ("call-path" des fonctions) mais aussi sur les compteurs matériels [22]. Ainsi, il est d'usage de collecter le temps d'exécution d'un fonction ou combien de fois la fonction a été appellée ou encore de façon plus détaillée, combien de fois une ligne de code est exécutée. Evidemment, l'efficacité de la méthode dépend du taux d'échantillonnage: les informations entre deux points de collecte ne sont pas disponibles pour l'analyse ultérieure. Par contre, la surcharge engrendrée par la technique peut être contrôlée par l'utilisateur par un choix adéquet de la fréquence de l'echantillonage. \\
1478 L'alternative pour collecter les données de la performance d'une application parallèle se porte sur l'instrumentation basée sur les évenements. D'abord, de façon générale, l'instrumentation du code consiste à ajouter manuellement ou automatiquement des instructions supplémentaires à des endroits choisis afin de rapporter à chaque passage des informations spécifiques. A titre d'exemple, on peut positionner un timer au début d'une portion du code et d'arrêter ce timer à la sortie de cette région. On peut ainsi collecter le temps total d'execution consommé par l'application pour exécuter cette partie du programme. Cette technique est largement utilisée par exemple pour détermijner le temps de communication nécessaire lors d'un appel d'une instruction MPI de transfert ou collective (MPI\_send, MPI\_receive ou autre MPI\_Barrier). Cette modification directe qui nécessite une récompilation du code est aussi appellée "instrumentation au niveau de la source". D'autres techniques utilisant des outils existent telles que les "libraries wrapping" ou la "réécriture du code binaire" [22]. Ces dernières n'ont pas besoin d'une recompilation du code.
1480 \item [$\bullet$] La deuxième étape du processus de la collecte des données en vue d'une future analyse consiste à enregister soit en mémoire soit sur un support de stockage externe les données obtenues lors de l'étape précédente. Deux techniques peuvent être exploitées à cette fin. D'abord, le "logging" ou le "tracing" permet d'ajouter le facteur temps sur les données collectées. Ainsi, avant le stockage, chaque entrée de données est estampillée d'une date de l'évenement (au format date - heure). Cette opération peut ajouter un temps de surcharge non négligeable lors de l'exécution.\\
1481 Afin de réduire cette dernière mais aussi pour optimiser la taille du fichier de trace obtenu, la technique de "summarization" consiste à agréger les données après la collecte et de ne stocker que le minimum d'informations utiles. Ce dernier est généralement appellé le "profile" de l'application [21,22]. Certains détails peuvent être perdus avec cette méthode mais il s'agit ici de faire une balance entre la taille la granularité de l'information et la taille des données stockées.
1483 \item [$\bullet$] La troisième et dernière étape de l'analyse de la performance concerne la visualisation des données collectées en vue de l'analyse proporement dite et des décisions à prendre pour améliorer et optimiser l'exécution de l'application. Dans la même ligne de l'étape précédente, soient les données sont visualisées "au fil du temps" en suivant l'exécution du code sur les différentes machines de l'environnement parallèle, soient elles sont représentées par un groupement selon un facteur compréhensible par l'analyste (par fonction par exemple), on est en présence d'une technique générant un "timelines" ou un "profile" de l'application respectivement.
1487 Noter que l'approche présentée dans cette section présente les techniques en vue d'optimiser le code de l'application pour un meilleur temps d'exécution en l'occurrence. Ainsi, elle ne prend pas en compte la performance lors de la scalabilité de l'application pour une prédiction du comportement du code lors du passage à l'echelle. Cette partie sera traitée au paragraphe ...
1488 Plusieurs outils d'analyse de la performance parallèle utilisant une ou des combinaisons de ces différentes techniques tels que Gprof, PerfExpert, IPM, TAU, PAPI, HPCToolkit, SCala [...] sont largement utilisés. La prochaine section donne plus de détails sur certains de ces produits.
1491 \subsection{Quelques outils d'analyse de performance}
1492 Quelques outils d'analyse de performance sont passés en revue dans cette section. Ils mettent en exergue les différentes approches pour aborder ce problème crucial de performance pour les applications parallèles et distribuées.
1496 \item [$\bullet$] IPM
1498 \item [$\bullet$] TAU a été conçu à l'Université d'Oregon comme un outil open source d'évaluation de performance [24]. Il intègre le profiling et le tracing constituant une platerme complète couvrant les trois étapes de l'analyse d'une applicatio parallèle. L'instrumentation du code peut être effectuée d'une façon complètement automatique avec un package fourni ("PDT - Program Database Toolkit - for routines")collectant toutes les informations sur les régions et hotspots du code, l'utilisation mémoire, les boucles, les entrées/sorties,...Selon le paramètrage de lancement, TAU peut collecter des informations les plus fines telles que le temps passé à chaque instruction dans une boucle ou le temps passé dans les communications à une étape du programme particulièrement dans les instructions collectives MPI par exemple. Toutes ces données peuvent par la suite être visualisées sous forme graphique (Paraprof 3D browser) pour une analyse fine afin d'optimiser la performance.
1500 \item [$\bullet$] SCALA ou SCAlabity Analyzer est orienté particulèrement dans l'analyse de la performance des applications sur sa scalabilité lors de la montée en charge. Outre la prédiction de la performance, SCALA utilise les fonctionnalités avancées actuelles pour la mise au point (debugging) de la dite performance et d'une éventuelle restructuration du code parallèle d'une part mais aussi d'estimer l'impact des variations sur l'environnement matériel d'exécution.
1504 \section{Méthodes de prédiction de la performance des applications parallèles}
1508 \section{Conclusion partielle}
1511 \chapter{Motivations}
1513 Malgré les grandes avancées dues aux performances des nouveaux processeurs, mémoires mais aussi des réseaux de communication, le milieu académique comme le domaine industriel sont toujours confrontés à des défis et challenges de plus en plus ambitieux. Ce fait est surtout accentué par des besoins de plus en plus variés et importants de calcul scientifique nécessitant de plus en plus de moyens mais aussi de méthodes plus efficientes et performantes. Ces besoins requièrent le traitement de données de plus en plus volumineuses mais aussi l'écriture d'algorithmes donnant des résultats probants dans un laps de temps correct. Le défi actuel serait donc l'exploitation de la puissance de calcul des matériels actuels dans un environnement de calcul optimisé pour traiter un volume de données de plus en plus important. \\
1514 Dans le cadre de nos travaux, l'objectif final est d'aider les utilisateurs finals (scientifiques, chercheurs, industriels, étudiants, ...) en calcul à haute performance à rentabiliser au maximum l'accès aux infrastructures de calcul physiques existantes, étant donné le côut et la difficulté (même des fois l'impossibilité) d'accès à ces dernières. En effet, la demande d'utilisation de ces infrastructures dépasse largement l'offre établie, entraînant des longues listes d'attente avant de pouvoir y accéder pour une durée très limitées. \\
1515 Pour atteindre ces objectifs, nous proposons d'utiliser des outils de simulation pour exécuter les applications pour étudier leurs comportements à large échelle mais aussi pour pouvoir déterminer les conditions optimales pour obtenir des résultats optimaux. Le simulateur permet d'étudier le comportement des algorithmes sous différentes conditions et sur des plateformes variées et paramétrables. Plusieurs modes d'exécution peuvent être essayés lors de l'expérimentation. De plus, la flexibilité de l'outil permet l'estimation de la performance des algorithmes lors du passage à l'échelle.\\
1516 Les questionnements suivants résument les motivations des travaux consignés dans cette thèse.
1518 \item [$\bullet$] a. Quelles solutions pratiques peut-on apporter pour réduire le coût de l’exécution d’applications parallèles et distribuées dans un environnement de grille de calcul durant tout son cycle de vie de développement ?
1519 \item [$\bullet$] b. Quel est le comportement de l’algorithme distribué à large échelle dans cette architecture de grille de clusters en particulier lors de son exécution en mode asynchrone ?
1520 \item [$\bullet$] c. Dans ce contexte, quels sont les facteurs importants identifiés permettant d’avoir un gain de temps d’exécution en mode asynchrone comparativement au mode synchrone ? A quel niveau peut-on estimer le gain obtenu en comparant l'exécution en mode asynchrone par rapport au mode classique synchrone.
1521 \item [$\bullet$] d. Quel est le taux d'erreur de validation obtenue en comparant les résultats du lancement de l'application entre une exécution simulée et une execution sur un environnement réél équivalent.
1524 La partie suivante va exposer la méthodologie adoptée et les travaux de contributions pour apporter des réponses à ces questions.
1527 \part{PARTIE II - Travaux de contributions, résultats et perspectives}
1529 \chapter{Comparaison par simulation à large échelle de la performance de deux algorithmes itératifs parallèles en mode asynchrone}
1531 \section{Protocoles et expérimentations}
1535 \section{Conclusion partielle}
1537 \chapter{Simulation avec SIMGRID de l\textquoteright exécution des solveurs linéaires en mode synchrone et asynchrone sur un environnement multi-coeurs simulés}
1539 \section{Protocoles et expérimentations}
1543 \section{Conclusion partielle}
1545 \chapter{Modèle de prédiction de la performance à large échelle d'un algorithme itératif parallèle}
1547 \section{Approche et méthodologie}
1549 \section{Expérimentations et résultats}
1551 \section{Conclusion partielle}
1553 \chapter{Conclusion générale et perspectives}
1555 \section{Conclusion générale}
1557 \section{Travaux futurs et perspectives}
1561 %%--------------------
1562 %% Start the end of the thesis
1565 %%--------------------
1568 %% PERSONAL BIBLIOGRAPHY (use 'multibib')
1570 %% Change the style of the PERSONAL bibliography
1571 %\bibliographystylePERSO{phdthesisapa}
1573 %% Add the chapter with the PERSONAL bibliogaphy.
1574 %% The name of the BibTeX file may be the same as
1575 %% the one for the general bibliography.
1576 %\bibliographyPERSO{biblio.bib}
1578 %% Below, include a chapter for the GENERAL bibliography.
1579 %% It is assumed that the standard BibTeX tool/approach
1582 %% GENERAL BIBLIOGRAPHY
1584 %% To cite one of your PERSONAL papers with the style
1585 %% of the PERSONAL bibliography: \cite{key}
1587 %% To force to show one of your PERSONAL papers into
1588 %% the PERSONAL bibliography, even if not cited in the
1589 %% text: \nocite{key}
1591 %% The following line set the style of
1592 %% the GENERAL bibliogaphy.
1593 %% The "phdthesisapa" is a "apalike" style with the following
1595 %% a) The titles are output with the color of the institution.
1596 %% b) The name of the PhD thesis' author is underlined.
1597 \bibliographystyle{phdthesisapa}
1598 %% The following line may be used in place of the previous
1599 %% line if you prefer "numeric" citations.
1600 %\bibliographystyle{phdthesisnum}
1602 %% Link the GENERAL bibliogaphy to a BibTeX file.
1603 \bibliography{biblio.bib}
1605 \part*{BIBLIOGRAPHIE ET REFERENCES}
1608 {[}3{]} J. M. Bahi, S. Contassot-Vivier, R. Couturier - Parallel Iterative Algorithms: from Sequential to Grid Computing - \textit{CRC PRESS - Boca Raton London New York Washington, D.C.}
1610 {[}4{]} R. Couturier - Résolution de systèmes linéaires à très large échelle : méthodes classiques versus méthodes à large échelle - \textit{2014 - FEMTO-ST, Université de Franche-Comté}
1612 {[}5{]} C. E. Ramamonjisoa, L. Z. Khodjav, D. Laiymani, A. Giersch and R. Couturier. - Grid-enabled simulation of large-scale linear iterative solvers - \textit{2014 Femto-ST Institute - DISC Department - Université de Franche-Comté, IUT de Belfort-Montbéliard}
1614 {[}6{]} J.M. Bahi, S. Contassot-Vivier, R. Couturier. Interest of the asynchronism in parallel iterative algorithms on meta-clusters. \textit{LIFC - Université de Belford-Montbéliard}.
1616 {[}7{]} T.P. Collignon and M.B. van Gijzen. Fast iterative solution of large sparse linear systems on geographically separated clusters. \textit{The International Journal of High Performance Computing Applications} 25(4) 440\textendash 450.
1618 {[}8{]} D. Bertsekas and J. Tsitsiklis. Parallel and Distributed Computation, Numerical
1619 Methods. \textit{Prentice Hall Englewood Cliffs N. J., 1989}.
1621 {[}9{]} C. E. Ramamonjisoa, L. Z. Khodjav, D. Laiymani, A. Giersch and R. Couturier. Simulation of Asynchronous Iterative Algorithms Using SimGrid. \textit{2014 Femto-ST Institute - DISC Department - Université de Franche-Comté, IUT de Belfort-Montbéliard}
1623 {[}10{]} M. J. Voss and R. Eigemann. Reducing Parallel Overheads Through Dynamic
1624 Serialization. \textit{Purdue University School of Electrical and Computer Engineering}.
1626 {[}11{]} K. J. Barker, K. Davis, A. Hoisie, D. J. Kerbyson, M. Lang, S. Pakin and J. C. Sancho. Using performance modeling to design large-scale systems. \textit{Los Alamos National Laboratory(LANL), New Mexico}.
1628 {[}12{]} M. Dubois and X. Vigouroux. Unleash your HPC performance with Bull.
1629 \textit{Maximizing computing performance while reducing power consumption}. http://www.hpctoday.fr/published/regional/operations/docs/W-HPCperformance-en1.pdf
1631 {[}14{]} Site du top500. http://www.top500.org
1633 {[}15{]} C. Harris et al. HPC Technology Update. \textit{Pawset Supercomputing Center - Sept 2015}. http://www.pawsey.org.au/wp-content/uploads/2015/09/Pawsey\_HPC\_Technology\_Update\_20150923.pdf
1635 {[}16{]} A. J. van der Steen, J. J. Dongarra. Overview of Recent Supercomputers.
1636 \textit{Academic Computing Centre Utrecht, the Netherlands, Department of Computer Science, University of Tennessee, Knoxville, Mathematical Sciences Section, Oak Ridge, National Laboratory, Oak Ridge}. http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.49.3743\&rep=rep1\&type=pdf
1638 {[}17{]} V. Rajput , S. Kumar, V.K.Patle. Performance Analysis of UMA and NUMA Models".
1639 \textit{School of Studies in Computer Science Pt.Ravishankar Shukla University, Raipur,C.G.} http://www.ijcset.net/docs/Volumes/volume2issue10/ijcset2012021006.pdf
1641 {[}18{]} D. Nguyen, Raj Vaswani and J. Zahorian. Parallel Application Characterization for
1642 Multiprocessor Scheduling Policy Design. \textit{Department of Computer Science and Engineering - University of Washington, Seattle, USA}.
1644 {[}19{]} M. Ewan. Exploring Clustered Parallel File Systems and Object Storage.
1645 \textit{2012}. https://software.intel.com/en-us/articles/exploring-clustered-parallel-file-systems-and-object-storage
1647 {[}20{]} F. Silva, R. Rocha: Parallel and Distributed Programming - Performance Metrics. \textit{DCC-FCUP}.
1649 {[}21{]} G. Ballard et Al. Communication Optimal Parallel Multiplication
1650 of Sparse Random Matrices". \textit{UC Berkeley, INRIA Paris Rocquencourt, Tel-Aviv University}. http://www.eecs.berkeley.edu/\textasciitilde{}odedsc/papers/spaa13-sparse.pdf
1652 {[}22{]} T. Ilsche, J. Schuchart, R. Schöne, and Daniel Hackenberg. Combining Instrumentation and Sampling for Trace-based Application Performance Analysis. \textit{Technische Universität Dresden, Center for Information Services and High Performance Computing (ZIH), 01062 Dresden, Germany}
1654 {[}23{]} J.A. Smitha, S.D. Hammond, G.R. Mudalige - J.A. Davis, A.B. Mills, S.DJarvis. A New Profiling Tool for Large Scale Parallel Scientific Codes. \textit{Department of Computer Science, University of Warwick,Coventry, UK}
1656 {[}24{]} S. Shende - New Features in the TAU Performance System - \textit{ParaTools, Inc and University of Oregon. 2014}.
1658 {[}25{]} M. Mollamotalebi1, R. Maghami1, A. S. Ismail - "Grid and Cloud Computing Simulation Tools" - \textit{International Journal of Networks and Communications 2013, 3(2): 45-52 - DOI: 10.5923/j.ijnc.20130302.02}
1660 {[}26{]} F. Cappello et al. - Grid’5000: a large scale and highly reconfigurable Grid experimental testbed - \textit{INRIA, LRI, LIP, IRISA, LORIA, LIFL, LABRI, IMAG}
1662 {[}27{]} Grid'5000 - http://www.grid5000.org
1664 {[}28{]} A. Sulistio, C. Shin Yeo et R. Buyya - Simulation of Parallel and Distributed Systems: A Taxonomy and Survey of Tools Grid Computing and Distributed Systems (GRIDS)- \textit{Laboratory Dept of Computer Science and Software Engineering The University of Melbourne, Australia}.
1666 {[}29{]} http://www.dau.mil/ - Defense Acquisition University (DAU) - Ft Belvoir (VA) - USA.
1668 {[}30{]} R. M. Fujimoto - Parallel and Distributed Simulation Systems - \textit{Georgia Institute of Technology - John Wiley \& Sons, Inc. - ISBN 0-471-18383-0} - 2000
1670 {[}31{]} MPI: A Message-Passing Interface Standard Version 3.- \textit{University of Tennessee, Knoxville, Tennessee.} - 2015
1672 {[}32{]} MPICH : www.mpich.org
1674 {[}33{]} OpenMPI : www.openmpi.org
1676 {[}34{]} M. Quinson et Al. - Experimenting HPC Systems with Simulation - \textit{Nancy University, France, Caen, HPCS/IWCMC 2010.}
1678 {[}35{]} A. Legrand, L. Marchal, H. Casanova - Scheduling Distributed Applications: the SimGrid Simulation Framework - \textit{Laboratoire de l’Informatique du Parallèlisme - Ecole Normale Supérieure de Lyon, Dept. of Computer Science and Engineering San Diego Supercomputer Center - University of California at San Diego}
1680 {[}36{]} Xian-He Sun, T. Fahringer, M. Pantano - SCALA: A perfformance system for scalable computing - \textit{Department Of Computer Science, Illinois Institute of Technology Chicago, Institute for software technology and parallel systems, University of Vienna Liechtenstein - The International Journal of High Performance Computing Applications,Volume 16, No. 4, Autumn 2002,}
1683 %%--------------------
1684 %% List of figures and tables
1686 %% Include a chapter with a list of all the figures.
1687 %% In French typograhic standard, this list must be at
1688 %% the end of the document.
1691 %% Include a chapter with a list of all the tables.
1692 %% In French typograhic standard, this list must be at
1693 %% the end of the document.
1696 %%--------------------
1697 %% Include a list of definitions
1700 %%--------------------
1705 \chapter{Premier chapitre des annexes}
1707 \chapter{Second chapitre des annexes}