Fabian Gruber - Debogage de performance pour code binaire: Analyse de sensitivité et profilage de dependences

14:00
Mardi
17
Déc
2019
Organisé par : 
Fabian Gruber
Intervenant : 
Fabian Gruber
Équipes : 

Jury :

  • Barton Miller, Professor, University of Wisconsin-Madison, rapporteur
  • Denis Barthou, Professor, Bordeaux INP, rapporteur
  • Franz Franchetti, Professor, Carnegie Mellon University, examinateur
  • Frédéric Pétrot, Professor, Grenoble INP, examinateur
  • Svilen Kanev, Software Engineer, Google, examinateur
  • Fabrice Rastello, directeur de recherche, Inria, directeur de thèse

Lieu de soutenance :

Antenne Inria Grenoble - GIANT, 17 Avenue des Martyrs, salle C306

 

Le débogage, tel qu'il est généralement défini, consiste à trouver et à supprimer les problèmes empêchant un logiciel de fonctionner correctement.
Quand on parle de bogues et de débogage, on fait donc habituellement référence à des bogues fonctionnels et au débogage fonctionnel.
Dans le contexte de cette thèse, cependant, nous parlerons des bogues de performance et de débogage de performance.
Nous ne cherchons donc pas les problèmes engendrant de mauvais comportements du programme, mais les problèmes qui le rendent inefficace, trop lent, ou qui induisent une trop grande utilisation de ressources.
À cette fin, nous avons développé des outils qui analysent et modélisent la performance pour aider les programmeurs à améliorer leur code de ce point de vue là.
Nous proposons les deux techniques de débogage de performance suivantes: analyse des goulets d'étranglement basée sur la sensibilité et Suggestions d'optimisation polyédrique basées sur les dépendances de données.

Analyse des goulets d'étranglement basée sur la sensibilité:
Il peut être étonnamment difficile de répondre à une question apparemment anodine sur la performance d'un programme, comme par exemple celle de savoir s'il est limité par la mémoire ou par le CPU.
En effet, le CPU et la mémoire ne sont pas deux ressources complètement indépendantes, mais sont composés de multiples sous-systèmes complexes et interdépendants.
Ici, un blocage d'une ressource peut à la fois masquer ou aggraver des problèmes avec une autre ressource.
Nous présentons une analyse des goulets d'étranglement basée sur la sensibilité qui utilise un modèle de performance de haut niveau implémenté dans GUS, un simulateur CPU rapide pour identifier les goulets d'étranglement de performance.

Notre modèle de performance a besoin d'une base de référence pour la performance attendue des différentes opérations sur un CPU, comme le pic IPC et comment différentes instructions se partagent les ressources du processeur.
Malheureusement, cette information est rarement publiée par les fournisseurs de matériel, comme Intel ou AMD.
Pour construire notre modèle de processeur, nous avons développé un système permettant de récupérer les informations requises en utilisant des micro-benchmarks générés automatiquement.

Suggestions d'optimisation polyédrique basées sur les dépendances de données:
Nous avons développé MICKEY, un profileur dynamique de dépendances de données qui fournit un retour d'optimisation de haut niveau sur l'applicabilité et la rentabilité des optimisations manquées par le compilateur.
MICKEY exploite le modèle polyédrique, un puissant cadre d'optimisation pour trouver des séquences de transformations de boucle afin d'exposer la localité des données et d'implémenter à la fois le parallélisme gros-grain, c'est-à-dire au niveau thread, et grain-fin, c'est-à-dire au niveau vectoriel.
Notre outil utilise une instrumentation binaire dynamique pour analyser des programmes écrits dans différents langages de programmation ou utilisant des bibliothèques tierces pour lesquelles aucun code source n'est disponible.

En interne MICKEY utilise une représentation intermédiaire (RI) polyédrique qui code à la fois l'exécution dynamique des instructions d'un programme ainsi que ses dépendances de données.
La RI ne capture pas seulement les dépendances de données à travers plusieurs boucles mais aussi à travers des appels de procédure, éventuellement récursifs.
Nous avons développé l'algorithme de folding, un algorithme efficace de compression de traces qui construit cette RI polyédrique à partir de l'exécution d'un programme.
L'algorithme de folding trouve aussi des accès réguliers dans les accès mémoire pour prédire la possibilité et la rentabilité de la vectorisation.
Il passe à l'échelle sur de gros programmes grâce à un mécanisme de sur-approximation sûr et sélectif pour les applications partiellement irrégulières.