Jury :
Le calcul à hautes performances s'est vu contraint d'évoluer de façon radicalement différente durant la dernière décennie. La miniaturisation et l'augmentation de la fréquence des processeurs a atteint ses limites en raison des consommations d'énergies déraisonnables induites. Cette contrainte énergétique a conduit les fabricants de matériel à développer de nombreuses architectures alternatives afin de répondre aux besoins toujours croissants de puissance de calcul de la communauté scientifique. Cependant, programmer efficacement des plates-formes aussi diverses et exploiter l'intégralité des ressources qu'elles offrent s'avère extrêmement difficile. L'approche classique de conception d'application haute performance consistant à se reposer sur des codes monolithiques offrant de nombreuses opportunités d'optimisation est ainsi devenue de plus en plus difficile à appliquer en raison de difficulté d'implémentation, de portabilité et de maintenance. Par conséquent, les développeurs de telles applications considèrent de plus en plus couramment des approches modulaires et une exécution dynamique des différents composants. Une approche populaire consiste à implémenter ces applications à relativement haut niveau, indépendamment de l'architecture matérielle, en se reposant sur un paradigme basé sur la notion de graphe de tâches où chaque tâche correspond à un noyau de calcul soigneusement optimisé pour chaque architecture cible. Un système de runtime peut alors ensuite être utilisé pour ordonnancer dynamiquement ces tâches sur les différentes ressources de calcul à disposition.
Garantir l'efficacité de telles applications sur un large spectre de configurations reste néanmoins un défi majeur. En effet, en raison de la grande complexité du matériel, de la variabilité des temps d'exécution des calculs et de la dynamicité d'ordonnancement des tâches, l'exécution des applications n'est pas déterministe et l’évaluation de la performance de ces systèmes est très délicate. Par conséquent, il est nécessaire de disposer d'une méthodologie systématique, rigoureuse et reproductible pour conduire de telles études et évaluer la performance de tels systèmes.Dans cette thèse, nous montrons qu'il est possible d'étudier les performances de telles applications dynamiques à l'aide de simulations, et ce de façon fiable, cohérente et reproductible. Nous proposons dans un premier temps une méthode de travail originale basée sur deux outils couramment utilisés dans notre communauté, Git et Org-mode, et permettant de mettre en oeuvre une recherche expérimentale reproductible. Cette approche simple permet de résoudre de façon pragmatique des problèmes tels que le suivi de la provenance des expériences ou la réplication de l'analyse des données expérimentales. Dans un second temps, nous contribuons à l'évaluation de performance d'applications dynamiques en concevant et en validant une simulation/émulation hybride à gros grains de StarPU, un runtime dynamique utilisant le paradigme de graphes de tâches et particulièrement adapté à l'exploitation d'architecture hybrides. Cette simulation est réalisée à l'aide de SimGrid, un simulateur polyvalent de systèmes distribués. Nous présentons comment notre approche permet d'obtenir des prédictions de performances d'exécutions réelles fiables sur un large panel de machines hétérogènes. Nous appliquons notre approche à deux classes de programmes différentes, les applications d'algèbre linéaire dense et creuse, qui sont représentatives d'un grand nombre d'applications scientifiques.