Quel sera le code exact pour obtenir le décompte des échecs de cache de dernier niveau sur l'architecture Intel Kaby Lake

Quel sera le code exact pour obtenir le décompte des échecs de cache de dernier niveau sur l'architecture Intel Kaby Lake

Vous pouvez utiliser perf comme Cody l'a suggéré pour mesurer les événements depuis l'extérieur du code, mais je soupçonne d'après votre exemple de code que vous avez besoin d'un accès programmatique fin aux compteurs de performances.

Pour ce faire, vous devez activer la lecture en mode utilisateur des compteurs et également avoir un moyen de les programmer. Comme il s'agit d'opérations restreintes, vous avez besoin d'au moins l'aide du noyau du système d'exploitation pour le faire. Rouler votre propre solution va être assez difficile, mais heureusement, il existe plusieurs solutions existantes pour Ubunty 16.04 :

  • La bibliothèque jevents d'Andi Kleen, qui permet entre autres de lire les événements PMU depuis l'espace utilisateur. Je n'ai pas personnellement utilisé cette partie de pmu-tools, mais les éléments que j'ai utilisés sont de haute qualité. Il semble utiliser les appels système perf_events existants pour la programmation des compteurs et n'a donc pas besoin d'un modèle de noyau.
  • La bibliothèque libpfc est une implémentation à partir de zéro d'un module noyau et d'un code utilisateur qui permet la lecture utilisateur des compteurs de performance. J'ai utilisé ça et ça marche bien. Vous installez le module du noyau qui vous permet de programmer le PMU, puis utilisez l'API exposée par libpfc pour lire les compteurs depuis l'espace utilisateur (les appels se résument à rdpmc des instructions). C'est le moyen le plus précis et le plus précis de lire les compteurs, et il inclut une fonctionnalité de "soustraction de surcharge" qui peut vous donner le véritable nombre de PMU pour la région mesurée en soustrayant les événements causés par le code de lecture PMU lui-même. Vous devez épingler un seul noyau pour que les décomptes aient un sens, et vous obtiendrez des résultats erronés si votre processus est interrompu.
  • Bibliothèque Open Source Processor Counter Monitor d'Intel. Je n'ai pas essayé cela sur Linux, mais j'ai utilisé sa bibliothèque précédente, la très similaire 1 Performance Counter Monitor sous Windows, et cela a fonctionné. Sous Windows, il a besoin d'un pilote de noyau, mais sous Linux, il semble que vous puissiez soit utiliser un lecteur, soit le faire passer par perf_events .
  • Utilisez la fonctionnalité de l'API Marker de la bibliothèque likwid. Likwid existe depuis un certain temps et semble bien soutenu. J'ai utilisé likwid dans le passé, mais uniquement pour mesurer des processus entiers dans un domaine similaire à perf stat et non avec l'API marqueur. Pour utiliser l'API de marqueur, vous devez toujours exécuter votre processus en tant qu'enfant du processus de mesure likwid, mais vous pouvez lire par programme les valeurs de compteur dans votre processus, ce dont vous avez besoin (si je comprends bien). Je ne sais pas comment likwid configure et lit les compteurs lorsque l'API de marqueur est utilisée.

Vous avez donc beaucoup d'options! Je pense que tous pourraient fonctionner, mais je peux personnellement me porter garant de libpfc puisque je l'ai moi-même utilisé dans le même but sur Ubuntu 16.04. Le projet est activement développé et probablement le plus précis (moins de frais généraux) de ce qui précède. Je commencerais donc probablement par celui-là.

Toutes les solutions ci-dessus devraient pouvoir fonctionner pour Kaby Lake, car la fonctionnalité de chaque "architecture de surveillance des performances" successive semble généralement être un sur-ensemble de la précédente, et l'API est généralement préservée. Dans le cas de libpfc , cependant, l'auteur l'a limité à ne prendre en charge que l'architecture de Haswell (PMA v3), mais il vous suffit de modifier une ligne de code localement pour résoudre ce problème.

1 En effet, ils sont tous deux communément appelés par leur acronyme, PCM , et je soupçonne que le nouveau projet est simplement la continuation officiellement open source de l'ancien projet PCM (qui était également disponible sous forme source, mais sans mécanisme de contribution communautaire).