| 1 | \documentclass [12pt, a4paper, twoside] {report} |
|---|
| 2 | |
|---|
| 3 | |
|---|
| 4 | \usepackage{lettrine} |
|---|
| 5 | \usepackage[utf8]{inputenc} |
|---|
| 6 | \usepackage[T1]{fontenc} |
|---|
| 7 | \usepackage{palatino} |
|---|
| 8 | \usepackage{fancyhdr} |
|---|
| 9 | \usepackage{float} |
|---|
| 10 | \usepackage{subfigure} |
|---|
| 11 | \usepackage{wrapfig} |
|---|
| 12 | \usepackage{graphicx} |
|---|
| 13 | \usepackage[french]{babel} |
|---|
| 14 | \usepackage{amsmath} % |
|---|
| 15 | |
|---|
| 16 | % correct bad hyphenation here |
|---|
| 17 | \hyphenation{} |
|---|
| 18 | |
|---|
| 19 | \setlength{\topmargin}{0cm} |
|---|
| 20 | \setlength{\headheight}{1cm} |
|---|
| 21 | \setlength{\textheight}{23cm} |
|---|
| 22 | \setlength{\textwidth}{16cm} |
|---|
| 23 | \setlength{\oddsidemargin}{0cm} |
|---|
| 24 | \setlength{\evensidemargin}{0cm} |
|---|
| 25 | \setlength{\columnsep}{0.125in} |
|---|
| 26 | \setlength{\columnseprule}{0.5pt} |
|---|
| 27 | \setlength{\footskip}{1cm} |
|---|
| 28 | |
|---|
| 29 | \sloppy |
|---|
| 30 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|---|
| 31 | \begin{document} |
|---|
| 32 | \begin{titlepage} |
|---|
| 33 | {\begin{center} \huge \textsf {Université Pierre et Marie Curie} \end{center}} |
|---|
| 34 | \vspace{0.4cm} |
|---|
| 35 | {\begin{center} \huge \textsf {MastÚre de sciences et technologies} \end{center}} |
|---|
| 36 | \vspace{0.4cm} |
|---|
| 37 | {\begin{center} \large \textbf{Mention Informatique - Spécialité STL\\2008 -- 2009} \end{center}} |
|---|
| 38 | \vspace{0.4cm} |
|---|
| 39 | {\begin{center} \huge \textsf {Spécialité : APR } \end{center}} |
|---|
| 40 | \vspace{0.4cm} |
|---|
| 41 | {\begin{center} \Huge \textbf{Simulation d'architectures multic\oe urs pour la parallélisation et l'optimisation de programmes} \end{center}} |
|---|
| 42 | \vspace{0.4cm} |
|---|
| 43 | {\begin{center} \huge \textsc{Rapport de Présoutenance} \end{center}} |
|---|
| 44 | \vspace{0.4cm} |
|---|
| 45 | {\begin{center} \large \textsf {date exposé 2009 } \end{center}} |
|---|
| 46 | \vspace{0.4cm} |
|---|
| 47 | {\begin{center} \Large \textsc{Présenté Par} \end{center}} |
|---|
| 48 | {\begin{center} \huge \textsc{Guillaume Bau} \end{center}} |
|---|
| 49 | \vspace{0.4cm} |
|---|
| 50 | {\begin{center} \Large \textsc{Encadrants} \end{center}} |
|---|
| 51 | {\begin{center} \Large \textsc{Karine Heydemann} \end{center}} |
|---|
| 52 | {\begin{center} \Large \textsc{Nathalie Drach} \end{center}} |
|---|
| 53 | {\begin{center} \large \textsf{Laboratoire d'accueil : LIP6 - Département SystÚmes embarqués sur puce } \end{center}} |
|---|
| 54 | \end{titlepage} |
|---|
| 55 | |
|---|
| 56 | \author{} |
|---|
| 57 | |
|---|
| 58 | %\pagestyle{plain} |
|---|
| 59 | |
|---|
| 60 | |
|---|
| 61 | \newpage |
|---|
| 62 | \pagestyle{headings} |
|---|
| 63 | %\fancyhf{} |
|---|
| 64 | %\fancyhead[R]{\slshape \thepage} |
|---|
| 65 | |
|---|
| 66 | \setcounter{page}{1} |
|---|
| 67 | \pagenumbering{Roman} |
|---|
| 68 | \tableofcontents |
|---|
| 69 | |
|---|
| 70 | \newpage |
|---|
| 71 | |
|---|
| 72 | \listoffigures |
|---|
| 73 | |
|---|
| 74 | \newpage |
|---|
| 75 | |
|---|
| 76 | \setcounter{page}{1} |
|---|
| 77 | \pagenumbering{arabic} |
|---|
| 78 | |
|---|
| 79 | |
|---|
| 80 | |
|---|
| 81 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|---|
| 82 | % Définition et analyse du problÚme |
|---|
| 83 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|---|
| 84 | \chapter{Introduction} |
|---|
| 85 | \section{Présentation} |
|---|
| 86 | Les nouvelles architectures de microprocesseurs sont de plus en plus complexes |
|---|
| 87 | et de plus en plus variées. L'approche des limites physiques, notamment en |
|---|
| 88 | fréquence, des microprocesseurs a poussé les concepteurs a créer des |
|---|
| 89 | architectures multic\oe urs, afin de délivrer plus de puissance, et ce, non |
|---|
| 90 | seulement dans les PC, mais de plus en plus dans les systÚmes embarqués tels |
|---|
| 91 | que les téléphones récents, baladeurs multimédia, etc. |
|---|
| 92 | |
|---|
| 93 | Ces architectures multic\oe urs peuvent adopter des structures différentes, par |
|---|
| 94 | exemple, différents niveaux de cache, certains caches partagés entre les c\oe |
|---|
| 95 | urs\ldots |
|---|
| 96 | |
|---|
| 97 | Afin de tirer parti des performances, les compilateurs doivent |
|---|
| 98 | intégrer ces différences, et proposer des algorithmes d'optimisations adaptés à |
|---|
| 99 | ces architectures. De même, les programmeurs pourront désirer optimiser leurs |
|---|
| 100 | applications pour un micro-processeur en particulier. |
|---|
| 101 | |
|---|
| 102 | La simulation du \textit{CPU} permet de résoudre ce problÚme, puisqu'elle |
|---|
| 103 | permet un \textit{profiling} trÚs avancé, en simulant le fonctionnement de |
|---|
| 104 | toute l'architecture, en recueillant des statistiques d'utilisation, un |
|---|
| 105 | diagnostic aussi complet que le souhaite l'utilisateur. |
|---|
| 106 | |
|---|
| 107 | Cependant, la simulation d'une architecture complÚte est trÚs lente, et source |
|---|
| 108 | de nombreuses approximations, voire d'erreurs, du fait de l'impossibilité de |
|---|
| 109 | simuler un processeur transistor par transistor. En effet, les résultats |
|---|
| 110 | expérimentaux de simulateurs précis au cycle (\textit{cycle accurate}) montrent |
|---|
| 111 | que la simulation est trÚs approximative. Les simulateurs les plus répandus, |
|---|
| 112 | lorsqu'ils permettent de simuler une architecture multic\oe ur, se montrent |
|---|
| 113 | d'autant plus lents que le nombre de c\oe urs à simuler est élevé. |
|---|
| 114 | |
|---|
| 115 | Afin de palier aux défauts de ce type de simulation, on se propose de ne |
|---|
| 116 | simuler qu'un modÚle trÚs simplifié d'architecture, dans laquelle on se |
|---|
| 117 | focalise sur la hiérarchie mémoire. On peut ainsi étudier le comportement de la |
|---|
| 118 | mémoire pour optimiser cet aspect indépendamment des autres. |
|---|
| 119 | |
|---|
| 120 | \section{Ãtat de l'art} |
|---|
| 121 | Les simulateurs sont des logiciels extrémement complexes et sont trÚs longs |
|---|
| 122 | à développer. Parmi les plus connus, SimpleScalar est assez rapide mais |
|---|
| 123 | est incapable, sans extension de simuler un systÚme multiprocesseur. C'est, |
|---|
| 124 | de plus, un logiciel monolithique et donc difficile à modifier. |
|---|
| 125 | Au contraire, unisim est conçu autour d'un framework trÚs ouvert, il facilite |
|---|
| 126 | la réutilisation de code et la modularité, et peut simuler un systÚme |
|---|
| 127 | multi-processeur. Cependant, c'est un simulateur \textit{cycle accurate} qui |
|---|
| 128 | simule tous les aspects documentés d'une architecture, ce qui ne correspond |
|---|
| 129 | pas à nos attentes, et aurait requis des modifications importantes. |
|---|
| 130 | Enfin, Simics est réputé trÚs rapide, est capable de gérer de nombreuses |
|---|
| 131 | architectures y compris des architectures multic\oe ur, mais c'est un logiciel |
|---|
| 132 | propriétaire que nous n'avons pas à disposition. |
|---|
| 133 | |
|---|
| 134 | |
|---|
| 135 | \section{Objectifs} |
|---|
| 136 | Les objectifs de ce projet sont de créer un simulateur pour une architecture |
|---|
| 137 | multic\oe ur, reposant sur un modÚle trÚs simplifié dans lequel la hiérarchie |
|---|
| 138 | mémoire sera prédominante. |
|---|
| 139 | |
|---|
| 140 | Le simulateur doit prendre en charge une hiérarchie de cache entiÚrement |
|---|
| 141 | paramétrable : |
|---|
| 142 | \begin{itemize} |
|---|
| 143 | \item on pourra définir une hiérarchie de deux, trois, \ldots \ niveaux de caches. |
|---|
| 144 | \item on pourra choisir de partager les cache d'un niveau entre plusieurs c\oe urs |
|---|
| 145 | ou bien les séparer. |
|---|
| 146 | \item les latences induites par le chargement d'une donnée dans un cache seront |
|---|
| 147 | spécifiées manuellement, et donc la gestion électronique sous-jancente ne |
|---|
| 148 | sera pas simulées. |
|---|
| 149 | \end{itemize} |
|---|
| 150 | |
|---|
| 151 | Ãtant donné un programme séparé en plusieurs sous-programmes, |
|---|
| 152 | chacun s'exécutant sur un c\oe ur, on estimera le nombre de hits et miss |
|---|
| 153 | obtenus dans chacun des niveaux de cache, ainsi qu'une estimation du temps |
|---|
| 154 | total d'exécution du programme. |
|---|
| 155 | |
|---|
| 156 | |
|---|
| 157 | On évaluera ensuite la pertinence des informations obtenues par cette |
|---|
| 158 | simulation en tant que mesure approximative des performances du programme |
|---|
| 159 | simulé. |
|---|
| 160 | |
|---|
| 161 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|---|
| 162 | % Proposition d'une solution de principe |
|---|
| 163 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|---|
| 164 | \chapter{Solution de principe} |
|---|
| 165 | \section{Présentation} |
|---|
| 166 | La modélisation du cache s'effectue avec des modules SystemC. Un module |
|---|
| 167 | représentant le micro-processeur est chargé d'éxécuter un programme exécutable |
|---|
| 168 | ou plusieurs programmes exécutables. |
|---|
| 169 | |
|---|
| 170 | Le modÚle simplifié ne comprendra pas de directives internes permettant le |
|---|
| 171 | lancement de thread et de verrous. Il ne tiendra pas compte des dépendances |
|---|
| 172 | entre instructions. |
|---|
| 173 | |
|---|
| 174 | Le modÚle simplifié ne tiendra compte que du cache de données; on ne prendra |
|---|
| 175 | donc pas compte du cache d'instruction, on n'effectuera pas de prédiction de |
|---|
| 176 | branchement. |
|---|
| 177 | |
|---|
| 178 | On cherche à se limiter au strict minimum au niveau de la gestion des |
|---|
| 179 | instructions, cependant, il n'est pas envisageable de ne simuler que les |
|---|
| 180 | instructions \textit{load} et \textit{store} : il faut simuler le comportement |
|---|
| 181 | correct du programme. |
|---|
| 182 | |
|---|
| 183 | Différentes stratégies pour résoudre ce problÚme seront étudiées durant |
|---|
| 184 | la seconde période du stage, parmi celles-ci, on peut suivre les pistes |
|---|
| 185 | suivantes : |
|---|
| 186 | \begin{itemize} |
|---|
| 187 | \item une instrumentation d'un exécutable natif existant, d'une maniÚre |
|---|
| 188 | similaire à \textit{Valgrind}. |
|---|
| 189 | \item une émulation des autres instructions d'un processeur déterminé. |
|---|
| 190 | \item \ldots |
|---|
| 191 | \end{itemize} |
|---|
| 192 | |
|---|
| 193 | L'implémentation sera effectuée en SystemC, tout en essayant de limiter |
|---|
| 194 | les fonctionnalités de SystemC qui sont les plus coûteuses en temps d'exécution |
|---|
| 195 | |
|---|
| 196 | \section{Détails} |
|---|
| 197 | Le simulateur est décomposé en plusieurs module SystemC : |
|---|
| 198 | \begin{itemize} |
|---|
| 199 | \item un module représentant un processeur qui traite les instructions et |
|---|
| 200 | envoie des requêtes au cache qui lui est connecté |
|---|
| 201 | \item un module représentant un cache L1 qui doit être connecté au processeur |
|---|
| 202 | et à un autre cache ou la mémoire |
|---|
| 203 | \item un module représentant un cache L2 ou L3, qui doit être connecté |
|---|
| 204 | a un autre cache (L1 ou autre), et à la mémoire |
|---|
| 205 | \end{itemize} |
|---|
| 206 | |
|---|
| 207 | Chacun des caches gÚre une file d'attente de requêtes en entrée et en sortie : |
|---|
| 208 | la file limite le nombre de requêtes en cours de traitement dans le cache de |
|---|
| 209 | niveau supérieur. |
|---|
| 210 | |
|---|
| 211 | Une liste interne, la \textit{ProcessingQueue} permet de simuler le délai de |
|---|
| 212 | chargement d'une donnée dans le cache. |
|---|
| 213 | |
|---|
| 214 | \begin{figure}[!h] |
|---|
| 215 | \center |
|---|
| 216 | \includegraphics[scale=0.4]{rapport/intern_communication.png} |
|---|
| 217 | \caption{Module représentant un cache L1} |
|---|
| 218 | \end{figure} |
|---|
| 219 | |
|---|
| 220 | |
|---|
| 221 | |
|---|
| 222 | Un exemple de modélisation de cache pourrait être celui-ci : |
|---|
| 223 | |
|---|
| 224 | \begin{figure}[!h] |
|---|
| 225 | \center |
|---|
| 226 | \includegraphics[scale=0.5]{rapport/config_sample.png} |
|---|
| 227 | \caption{Exemple de configuration de cache} |
|---|
| 228 | \end{figure} |
|---|
| 229 | |
|---|
| 230 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|---|
| 231 | % Identification des taches à accomplir |
|---|
| 232 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|---|
| 233 | \chapter{Tâches à accomplir et Planning} |
|---|
| 234 | \section{Tâches à accomplir} |
|---|
| 235 | |
|---|
| 236 | Les principales tâches à accomplir sont essentiellement l'étude précise du cadre |
|---|
| 237 | de simulation du processeur et une implémentation. |
|---|
| 238 | |
|---|
| 239 | Les pistes envisagées sont le développement d'une instrumentation d'exécutable |
|---|
| 240 | d'une maniÚre similaire à valgrind et l'émulation. L'instrumentation d'exécutable |
|---|
| 241 | demande d'avoir à sa disposition le processeur que l'on simule, ce qui limite |
|---|
| 242 | légÚrement l'intérêt d'une simulation. L'autre solution est l'émulation, mais |
|---|
| 243 | elle requiert de se concentrer sur un jeu d'instruction particulier pour être |
|---|
| 244 | réalisée en un temps raisonnable. |
|---|
| 245 | |
|---|
| 246 | |
|---|
| 247 | |
|---|
| 248 | \section{Planning} |
|---|
| 249 | |
|---|
| 250 | |
|---|
| 251 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|---|
| 252 | % Procedure de recette |
|---|
| 253 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|---|
| 254 | \chapter{Procédure de recette} |
|---|
| 255 | \section{Validation du simulateur} |
|---|
| 256 | Les résultats seront partiellement validés automatiquement : une petite suite |
|---|
| 257 | de tests permet de valider des petits programmes afin de vérifier les données |
|---|
| 258 | recueillies par le simulateur, afin de les confronter à des résultats obtenus |
|---|
| 259 | par le calcul, par exemple : |
|---|
| 260 | \begin{itemize} |
|---|
| 261 | \item le nombre de \textit{hits} et de \textit{miss} |
|---|
| 262 | \item le temps d'éxecution total estimé d'un programme. |
|---|
| 263 | \end{itemize} |
|---|
| 264 | \ |
|---|
| 265 | |
|---|
| 266 | |
|---|
| 267 | Plusieurs configurations possibles seront testées : |
|---|
| 268 | \begin{itemize} |
|---|
| 269 | \item les différentes associativités (mapping direct, associativité complÚte, |
|---|
| 270 | N-Way ) |
|---|
| 271 | \item différents niveaux de caches, qui pourront être partagés entre plusieurs |
|---|
| 272 | c\oe urs ou bien indépendants. |
|---|
| 273 | \end{itemize} |
|---|
| 274 | |
|---|
| 275 | \section{Validation des résultats} |
|---|
| 276 | Des comparaisons des résultats et des performances avec d'autres simulateurs |
|---|
| 277 | comme unisim permettront d'une part de mesurer le gain en performance de |
|---|
| 278 | ce simulateur, mais aussi d'estimer la précision des mesures se focalisant sur |
|---|
| 279 | l'aspect mémoire, et de constater dans quelle mesure les performances |
|---|
| 280 | d'une application sont représentées par l'utilisation optimale ou non de |
|---|
| 281 | l'aspect mémoire. |
|---|
| 282 | |
|---|
| 283 | \end{document} |
|---|