ENSSAT - EII3
DEA STIR Université de Rennes 1

TP Systèmes sur Silicium (SOC)


Partie 1

Profiling d'applications décrites en C/C++

Installation du TP

Modifiez votre fichier .cshrc en y écrivant la ligne suivante afin de configurer les outils Synopsys et BSS utilisés dans la suite du TP.

source /usr/local/synopsys/environ.csh

source /users/local/gaut/environ.csh

- Copiez le fichier MPEG.tar à partir de http://r2d2.enssat.fr/enseignements/Cao/MPEG.tar
- Décompressez le avec la commande : tar xfv MPEG.tar
- Vous obtenez un répertoire MPEG dans lequel vous vous placerez pour la suite de cette partie du TP.

1. Présentation de l'application

MPEG2
est une norme de codeur-décodeur vidéo utilisée dans la plupart des applications de diffusion de séquences d'images. Le décodeur est principalement composé d'une compensation de mouvement et d'une IDCT. Le code d'un décodeur MPEG 2 est fourni dans le répertoire ~/MPEG, pour le compiler lancer la commande make (la commande make clean permet de retrouver la configuration initiale). L'exécution se fera par la commande mpeg2decode -b test_015.m2v. Pour plus d'infos sur le programme : mpeg2decode. Le fichier test_015.m2v est une séquence test d'images.

2. Outil gprof

Le profiling permet de connaître où (i.e. dans quelle procédure) votre programme passe le plus de temps et quelles fonctions sont appelées durant l'exécution. Cette étape donne une idée de la complexité relative des différentes fonctions d'une application et donc, sur quelles procédures on doit porter l'effort d'optimisation.

gprof est un outil gnu.org de profiling. Son utilisation nécessite de compiler les programmes avec l'option -pg (-g pour un profiling ligne par ligne, -a pour un comptage des blocs de base - if, loop -). L'exécution du programme crée alors un fichier gmon.out. Exécuter maintenant la commande suivante :

gprof mpeg2decode gmon.out > mpeg2decode.gprof

Par un examen du fichier de sortie, déterminer quelles sont les procédures les plus complexes du décodeur. Les informations pour une bonne compréhension du format de ce fichier sont indiquées en début de fichier. Essayez ensuite d'autres options de compilation (-g, -a) et de profiling (-l : line-by-line profiling, -A : annotated source, -f, -z, …).

Un utilitaire graphique permet de parcourir le fichier gprof. Exécutez pour cela la commande : rgg mpeg2decode. Son utilisation est cependant limitée lorsque les applications sont importantes (c'est notre cas).

3. Outil gcov

gcov est un outil de couverture de code fourni avec gcc. En premier lieu, ce programme permet de savoir si le code que vous avez produit, conjointement avec le jeu de test que vous utilisez, est correctement testé. Son exécution permet de savoir si l'ensemble du code est couvert par le test que vous réalisez. Il donne également le nombre de fois que chaque ligne du code est exécutée. Son utilisation est donc complémentaire avec gprof, puisque dans ce cas ce n'est pas le temps d'exécution, mais le nombre d'appels à une fonction qui est donné. Cela permet par exemple de prototyper du code qui serait destiné à être implanté sur une machine différente que celle que vous utiliser actuellement (cross profiling).

gcov [-b] [-v] [-n] [-l] [-f] [-o directory] sourcefile

-b Write branch frequencies to the output file, and write branch summary info to the standard output. This option allows you to see how often each branch in your program was taken.

-v Display the gcov version number (on the standard error stream).

-n Do not create the gcov output file.

-l Create long file names for included source files. For example, if the header file `x.h' contains code, and was included in the file `a.c', then running gcov on the file `a.c' will produce an output file called `a.c.x.h.gcov' instead of `x.h.gcov'. This can be useful if `x.h' is included in multiple source files.

-f Output summaries for each function in addition to the file level summary.

-o The directory where the object files live. Gcov will search for .bb, .bbg, and .da files in this directory.

Pour permettre l'utilisation de gcov, les fichiers sources doivent être compilés avec les options -fprofile-arcs -ftest-coverage. gcov crée pour chaque fichier source un fichier source.gcov qui indique combien de fois chaque ligne a été exécutée. Exécuter gcov sur les sources C les plus complexes déterminés par gprof.

4. Optimisation de code

Une fois déterminées les parties du code les plus complexes, nous pouvons maintenant commencer l'optimisation de celui ci en nous focalisant sur les fonctions les plus coûteuses en temps de calcul. Sur un DSP par exemple, une écriture en assembleur de ces fonctions pourrait améliorer grandement l'efficacité du code.

Sur notre machine cible (sun-sparc-solaris), la première chose à faire est d'utiliser les options d'optimisation du compilateur (-O1 à -O4, -finline-functions, -funroll-loops, …) et d'enlever les options de debug. Quelles sont les nouvelles performances du décodeur MPEG2 ?

Essayer ensuite diverses transformations du code sur les procédures les plus complexes afin d'optimiser le temps d'exécution du décodeur.