Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

5.3.2. Profiler l'utilisation du cache avec Cachegrind

Cachegrind simule l'interaction de votre programme avec la hiérarchie du cache de votre machine et (optionnellement) avec le prédicteur de branches. Il traque l'utilisation des instructions de premier niveau simulées et des caches de données pour détecter de mauvaises interactions de code avec ce niveau de cache, ainsi que le dernier niveau de cache, qu'il s'agisse d'un second ou troisième niveau de cache, afin de traquer l'accès à la mémoire principale. Ainsi, les programmes exécutés avec Cachegrind fonctionnent 20 à 100 fois plus lentement que normalement.
Pour exécuter Cachegrind, exécutez la commande suivante en remplaçant program par le programme que vous souhaitez profiler avec Cachegrind :
# valgrind --tool=cachegrind program
Cachegrind peut rassembler les statistiques suivantes pour le programme entier, ainsi que pour chaque fonction dans le programme :
  • lectures du cache des instructions de premier niveau (ou instructions exécutées) et échecs de lecture, ainsi que les échecs de lecture des instructions du cache du dernier niveau ;
  • lectures du cache de données (ou lectures de mémoire), échecs des lectures et échecs des lectures de données du cache du dernier niveau ;
  • écritures du cache de données (ou écritures de mémoire), échecs des écritures et échecs des écritures du cache du dernier niveau ;
  • branches conditionnelles exécutées et mal prédites ;
  • branches indirectes exécutées et mal prédites.
Cachegrind imprime des informations sommaires à propos de ces statistiques sur la console et écrit des informations de profilage plus détaillées sur un fichier (par défaut cachegrind.out.pid, où pid est l'ID de processus du programme sur lequel vous avez exécuté Cachegrind). Ce fichier peut encore être traité par l'outil accompagnateur cg_annotate, ainsi :
# cg_annotate cachegrind.out.pid

Note

cg_annotate peut délivrer en sortie des lignes de plus de 120 caractères, selon la longueur du chemin. Pour rendre la sortie plus claire et plus facile à lire, il est recommandé d'élargir votre fenêtre terminal au minimum à cette même taille avant d'exécuter la commande mentionnée ci-dessus.
Vous pouvez aussi comparer les fichiers de profils créés par Cachegrind afin de faciliter l'impression des performances du programme avant et après un changement. Pour ce faire, utilisez la commande cg_diff, en remplaçant first par le fichier de sortie du profil initial et second par le fichier de sortie du profil suivant :
# cg_diff first second
Cette commande produit un fichier de sortie combiné, qui peut être affiché avec plus de détails avec cg_annotate.
Cachegrind prend en charge un certain nombre d'options pour concentrer sa sorte. Voici quelques-unes des options disponibles :
--I1
Spécifie la taille, l'associativité et la taille de ligne du cache d'instructions du premier niveau, séparé par des virgules : --I1=size,associativity,line size.
--D1
Spécifie la taille, l'associativité et la taille de ligne du cache de données du premier niveau, séparé par des virgules : --D1=size,associativity,line size.
--LL
Spécifie la taille, l'associativité et la taille de ligne du cache du dernier niveau, séparé par des virgules : --LL=size,associativity,line size.
--cache-sim
Active ou désactive la collection des accès au cache et du compte des échecs. La valeur par défaut est yes (activé).
Remarquez que désactiver cette option ainsi que --branch-sim laisse Cachegrind sans la moindre information à collecter.
--branch-sim
Active ou désactive la collection des instructions de branches et du compte des mauvaises prédictions. Cette option est définie sur no (désactivé) par défaut car elle ralentit Cachegrind d'environ 25 pour cent.
Remarquez que désactiver cette option ainsi que --cache-sim laisse Cachegrind sans la moindre information à collecter.
Pour une liste complète des options, veuillez vous reporter à la documentation incluse sur /usr/share/doc/valgrind-version/valgrind_manual.pdf.