Soutenance de stage de DEA 
É valuation de la quantité de travail utile dans 
l’’exécution des programmes 
Stage encadré par P. Michaud 
et effectué par B. Vidal 
Projet CAPS
Dé finition 
• Une instruction dynamique est utile si 
- Elle produit un résultat émis en sortie 
- Elle produit un résultat utilisé comme opérande 
d’’une instruction utile 
- C’’est un branchement 
2
3 
Bibliographie 
• Différentes définitions du travail inutile 
- Valeurs mortes dynamiques 
 G. Sohi & A. Butt 
ASPLOS X - oct. 2002 
- É critures silencieuses 
 M. Lipasti, K. Lepak & G. Bell 
IEEE, vol. 50, No. 11 - nov. 2001 
- É valuation de l’’ensemble du travail inutile 
après exécution
La mé thode utilisé e [1] 
• Exemple simple 
3
La mé thode utilisé e [1] 
• Exemple simple 
3
La mé thode utilisé e [1] 
• Exemple simple 
3
La mé thode utilisé e [1] 
• Exemple simple 
3
La mé thode utilisé e [1] 
• Exemple simple 
3
La mé thode utilisé e [1] 
• Exemple simple 
3
La mé thode utilisé e [1] 
• Exemple simple 
3
La mé thode utilisé e [1] 
• Exemple simple 
3
La mé thode utilisé e [1] 
• Exemple simple 
3
La mé thode utilisé e [2] 
• Graphe de dépendance de donnée 
- Construction au cours de l’’exécution 
- Relier les instructions dépendantes 
 Registres 
 Mémoire 
• Parcours du graphe 
- Sources (sorties ou branchements) 
- Marquage des instructions utiles 
4
Optimisation 
• Réduction du graphe 
- Suppression des noeoeuds certifiés utiles 
 A mesure que le programme se déroule 
 Un noeoeud utile ne peut devenir inutile 
- Suppression des noeoeuds certifiés inutiles 
 Une instruction n’’est accessible depuis aucune 
ressource 
 Système de ramasse-miette 
5
Optimisation 
5
Optimisation 
• Réduction du graphe 
- Suppression des noeoeuds certifiés utiles 
 A mesure que le programme se déroule 
 Un noeoeud utile ne peut devenir inutile 
- Suppression des noeoeuds certifiés inutiles 
 Une instruction n’’est accessible depuis aucune 
ressource 
 Système de ramasse-miette 
5
Mise en oeoeuvre 
• Salto 
- Récupérer des informations statiques 
- Instrumenter du code assembleur 
 Insérer des instructions 
• Au cours de l’’exécution 
- Récupérer des informations dynamiques 
 Ordre d’’exécution 
 Adresses des accès à la mémoire 
 É tat du système 
6
Instrumentation [1] 
• Exemple simple 
7
Instrumentation [1] 
• Exemple simple 
7
Instrumentation [1] 
• Exemple simple 
7
Instrumentation [1] 
• Exemple simple 
7
Instrumentation [1] 
• Exemple simple 
7
Instrumentation [2] 
• Différentes phases 
- Sauvegarde du contexte 
- Création de la structure de donnée 
- Traitement des opérandes 
- Traitement des résultats 
- Parcours du graphe si nécessaire 
- Restauration du contexte 
8
Vé rification 
• Ré-exécution du même programme avec 
les mêmes données en entrée 
- Saut des instructions inutiles 
• Vérification que les deux exécutions sont 
équivalentes 
9
Ré sultats 
• Tests effectués sur GZIP et GUNZIP 
- Sans optimisation de compilation 
 Entre 1 et 11 % de travail inutile en moyenne 
- Avec optimisations de compilation 
 Entre 10 et 12 % de travail inutile en moyenne 
- Dépend du type de traitement 
 Compression 
 Décompression 
- Dépend du fichier traité 
10
Analyse [1] 
11 
GZIP sur un fichier texte de 2 Ko 
Sans optimisation de compilation 
Nombre d’instructions dynamiques 
Nombre d’instructions inutiles
Analyse [2] 
• Phase d’’initialisation 
 ≈≈ 50 % de travail inutile 
• Coeoeur de l’’algorithme de compression 
- Sans optimisation de compilation 
 ≈≈ 7 % de travail inutile 
- Avec optimisations de compilation 
 ≈≈ 10 % de travail inutile 
12
Analyse [3] 
• Exemple d’’initialisation 
prev_match = match_start; 
. . . 
if (prev_length>=MIN_MATCH && 
match_length<=prev_length) { 
check_match(strstart-1, prev_match, prev_length); 
. . . 
} 
Affectation inutile dans 95 % des cas 
13
Analyse [4] 
• Au coeoeur de l’’algorithme 
- « Dictionnaire » 
- Insertion d’’un nouvel élément (chaî ne) 
- Recherche de redondance 
- Comparaison progressive 
 Lazy evaluation mechanism 
- Insertion d’’éléments n’’apparaissant qu’’une fois 
 Travail inutile 
14
Conclusion 
• Quantifier le travail inutile 
- Proportion non négligeable dans GZIP 
• Comprendre d’’où il provient 
- Algorithme 
 Inhérent à l’’algorithme 
 Du à une implémentation « naï ve » 
- Compilation 
• É viter ce travail 
- Outil d’’aide au programmeur 
15

Evaluation de la quantité de travail (in)utile dans l’exécution des programmes

  • 1.
    Soutenance de stagede DEA É valuation de la quantité de travail utile dans l’’exécution des programmes Stage encadré par P. Michaud et effectué par B. Vidal Projet CAPS
  • 2.
    Dé finition •Une instruction dynamique est utile si - Elle produit un résultat émis en sortie - Elle produit un résultat utilisé comme opérande d’’une instruction utile - C’’est un branchement 2
  • 3.
    3 Bibliographie •Différentes définitions du travail inutile - Valeurs mortes dynamiques  G. Sohi & A. Butt ASPLOS X - oct. 2002 - É critures silencieuses  M. Lipasti, K. Lepak & G. Bell IEEE, vol. 50, No. 11 - nov. 2001 - É valuation de l’’ensemble du travail inutile après exécution
  • 4.
    La mé thodeutilisé e [1] • Exemple simple 3
  • 5.
    La mé thodeutilisé e [1] • Exemple simple 3
  • 6.
    La mé thodeutilisé e [1] • Exemple simple 3
  • 7.
    La mé thodeutilisé e [1] • Exemple simple 3
  • 8.
    La mé thodeutilisé e [1] • Exemple simple 3
  • 9.
    La mé thodeutilisé e [1] • Exemple simple 3
  • 10.
    La mé thodeutilisé e [1] • Exemple simple 3
  • 11.
    La mé thodeutilisé e [1] • Exemple simple 3
  • 12.
    La mé thodeutilisé e [1] • Exemple simple 3
  • 13.
    La mé thodeutilisé e [2] • Graphe de dépendance de donnée - Construction au cours de l’’exécution - Relier les instructions dépendantes  Registres  Mémoire • Parcours du graphe - Sources (sorties ou branchements) - Marquage des instructions utiles 4
  • 14.
    Optimisation • Réductiondu graphe - Suppression des noeoeuds certifiés utiles  A mesure que le programme se déroule  Un noeoeud utile ne peut devenir inutile - Suppression des noeoeuds certifiés inutiles  Une instruction n’’est accessible depuis aucune ressource  Système de ramasse-miette 5
  • 15.
  • 16.
    Optimisation • Réductiondu graphe - Suppression des noeoeuds certifiés utiles  A mesure que le programme se déroule  Un noeoeud utile ne peut devenir inutile - Suppression des noeoeuds certifiés inutiles  Une instruction n’’est accessible depuis aucune ressource  Système de ramasse-miette 5
  • 17.
    Mise en oeoeuvre • Salto - Récupérer des informations statiques - Instrumenter du code assembleur  Insérer des instructions • Au cours de l’’exécution - Récupérer des informations dynamiques  Ordre d’’exécution  Adresses des accès à la mémoire  É tat du système 6
  • 18.
    Instrumentation [1] •Exemple simple 7
  • 19.
    Instrumentation [1] •Exemple simple 7
  • 20.
    Instrumentation [1] •Exemple simple 7
  • 21.
    Instrumentation [1] •Exemple simple 7
  • 22.
    Instrumentation [1] •Exemple simple 7
  • 23.
    Instrumentation [2] •Différentes phases - Sauvegarde du contexte - Création de la structure de donnée - Traitement des opérandes - Traitement des résultats - Parcours du graphe si nécessaire - Restauration du contexte 8
  • 24.
    Vé rification •Ré-exécution du même programme avec les mêmes données en entrée - Saut des instructions inutiles • Vérification que les deux exécutions sont équivalentes 9
  • 25.
    Ré sultats •Tests effectués sur GZIP et GUNZIP - Sans optimisation de compilation  Entre 1 et 11 % de travail inutile en moyenne - Avec optimisations de compilation  Entre 10 et 12 % de travail inutile en moyenne - Dépend du type de traitement  Compression  Décompression - Dépend du fichier traité 10
  • 26.
    Analyse [1] 11 GZIP sur un fichier texte de 2 Ko Sans optimisation de compilation Nombre d’instructions dynamiques Nombre d’instructions inutiles
  • 27.
    Analyse [2] •Phase d’’initialisation  ≈≈ 50 % de travail inutile • Coeoeur de l’’algorithme de compression - Sans optimisation de compilation  ≈≈ 7 % de travail inutile - Avec optimisations de compilation  ≈≈ 10 % de travail inutile 12
  • 28.
    Analyse [3] •Exemple d’’initialisation prev_match = match_start; . . . if (prev_length>=MIN_MATCH && match_length<=prev_length) { check_match(strstart-1, prev_match, prev_length); . . . } Affectation inutile dans 95 % des cas 13
  • 29.
    Analyse [4] •Au coeoeur de l’’algorithme - « Dictionnaire » - Insertion d’’un nouvel élément (chaî ne) - Recherche de redondance - Comparaison progressive  Lazy evaluation mechanism - Insertion d’’éléments n’’apparaissant qu’’une fois  Travail inutile 14
  • 30.
    Conclusion • Quantifierle travail inutile - Proportion non négligeable dans GZIP • Comprendre d’’où il provient - Algorithme  Inhérent à l’’algorithme  Du à une implémentation « naï ve » - Compilation • É viter ce travail - Outil d’’aide au programmeur 15

Notes de l'éditeur

  • #2 Bonjour...
  • #3 Expliquer à l’oral la définition retenue du travail inutile (déf. récursive) Expliquer d’emblée le but du stage
  • #4 Donner rapidement à l’oral les deux autres définitions et les comparer à la notre. Mettre en évidence le fait que les valeurs mortes dynamiques sont un sous ensemble de notre def. Et que les écritures silencieuses sont disjointe à la def.
  • #5 Expliquer le principe de la table de l’état mémoire/registres
  • #13 Introduire les problèmes mémoire posés par cet algorithme !
  • #14 Expliquer à l’oral ce que représente un arc du graphe (un lien de dépendance partant du consommateur d’une ressource et allant à son producteur). Expliquer qu’il sagit d’un graphe de dépendance de donnée dynamique ! =&amp;gt; il est impossible de le construire avant l’exécution. Dire que chaque instruction dynamique du programme est un noeud. Expliquer que le parcours du graphe part d&amp;apos;une source (noeud de sortie ou de branchement) et parcours tous les arcs sortants de ce noeud (opérandes de l&amp;apos;instruction). Ainsi de suite récursivement jusqu&amp;apos;à arriver à des puits du graphe (instruction sans opérandes : instructions d&amp;apos;affectation d&amp;apos;une constante ou entrée d&amp;apos;une donnée par l&amp;apos;utilisateur). Ne pas oublier de parler de GZIP
  • #15 Gros problème de l’algo précédent : on est obligé de garder en mémoire une quantité d’information très importante pendant l’exécution du programme =&amp;gt; impossible de tester de gros programmes (limité à 300 000 instructions). Réduction du graphe =&amp;gt; réduction de l’occupation mémoire. Grace aux optimisations proposées qui ont été implémentées (libération mémoire des noeuds certifiés utiles seulement) =&amp;gt; jusqu’à 1 000 000 d’instructions (gain d’un facteur 3 à 4). Expliquer que les noeuds peuvent être certifiés utiles à mesure que le programme se déroule si on a des sorties intermédiaires. Transition avec prec : solution au problème de mémoire rencontrés : optimisation.
  • #16 Gros problème de l’algo précédent : on est obligé de garder en mémoire une quantité d’information très importante pendant l’exécution du programme =&amp;gt; impossible de tester de gros programmes (limité à 300 000 instructions). Réduction du graphe =&amp;gt; réduction de l’occupation mémoire. Grace aux optimisations proposées qui ont été implémentées (libération mémoire des noeuds certifiés utiles seulement) =&amp;gt; jusqu’à 1 000 000 d’instructions (gain d’un facteur 3 à 4). Expliquer que les noeuds peuvent être certifiés utiles à mesure que le programme se déroule si on a des sorties intermédiaires. Transition avec prec : solution au problème de mémoire rencontrés : optimisation.
  • #17 Gros problème de l’algo précédent : on est obligé de garder en mémoire une quantité d’information très importante pendant l’exécution du programme =&amp;gt; impossible de tester de gros programmes (limité à 300 000 instructions). Réduction du graphe =&amp;gt; réduction de l’occupation mémoire. Grace aux optimisations proposées qui ont été implémentées (libération mémoire des noeuds certifiés utiles seulement) =&amp;gt; jusqu’à 1 000 000 d’instructions (gain d’un facteur 3 à 4). Expliquer que les noeuds peuvent être certifiés utiles à mesure que le programme se déroule si on a des sorties intermédiaires. Transition avec prec : solution au problème de mémoire rencontrés : optimisation.
  • #18 On ne passe pas trop de temps sur l’implémentation mais il nous a semblé intéressant de mettre en lumière la méthode qui nous a permis de récupérer des information dynamiques : l’instrumentation. Expliquer à l’oral que l’état du système permet de connaitre le niveau de la fenêtre de registres dans le cas de l’architecture utilisée (Sparc).
  • #23 Dans notre cas nous avions besoin de -&amp;gt; transp suivant
  • #24 La façon dont nous avons instrumenté chaque instruction. Expliquer le travail qui est fait au niveau de chacune des phases.
  • #25 Expliquer que cette vérification à permis d’affiner l’implémentation du premier programme et de s’assurer que le travail inutile l’était bien. Expliquer qu’on n’a réussi à le faire tourner que sur un niveau d’optimisation de compilation nul.
  • #26 Expliquer qu’on a écarté de ces chiffres le cas particulier ou on recompresse/décompresse un fichier déjà compressé.
  • #27 Donner les conditions de tests à l’oral + marquer de quoi il sagit
  • #31 Ce qu’on a appris sur GZIP…