2016-08-18 2 views
0

En un mot, je suis en train de réaliser ce qui suit dans un processus de référence userland (pseudo-code, en supposant x86_64 et un système UNIX):Comment configurer et échantillon Intel compteurs de performance In-Process

results[] = ... 
for (iteration = 0; iteration < num_iterations; iteration++) { 
    pctr_start = sample_pctr(); 
    the_benchmark(); 
    pctr_stop = sample_pctr(); 
    results[iteration] = pctr_stop - pctr_start; 
} 

FWIW, le compteur de performance que je pense utiliser est CPU_CLK_UNHALTED.THREAD_ALL, pour lire le nombre de cycles de base indépendants des changements de fréquence d'horloge (Dans un earlier question j'avais prévu d'utiliser le registre TSC pour cela, mais hélas, ce n'est pas ce que cela enregistrer des mesures du tout).

Mon intention initiale était d'utiliser l'assembleur en ligne pour d'abord configurer un compteur en utilisant WRMSR, puis de lire le compteur en utilisant RDPMC à l'intérieur de sample_pctr().

Je suis tombé sur le premier obstacle, car l'écriture MSR nécessite des privilèges noyau. Il semble que vous pouvez en fait lire les compteurs de l'espace utilisateur (si configuré correctement), mais l'acte de configurant le compteur (avec un MSR) doit être entrepris par le noyau.

Est-ce que quelqu'un connaît un moyen léger de demander au noyau de configurer les compteurs de performance a depuis l'espace utilisateur afin que je puisse ensuite utiliser RDPMC depuis mon harnais de banc d'essai?

Stuff je l'ai regardé dans/réflexion sur:

  • outils pour Linux perf. Semble être prêt pour l'échantillonnage sur toute la durée de vie d'un processus, et non dans un processus en tant que points spécifiques (avant et après chaque itération).
  • Utilisez directement les appels système perf (c'est-à-dire perf_event_open). On dirait que la valeur du compteur ne sera mise à jour que périodiquement (en utilisant un taux d'échantillonnage) ou après que le compteur dépasse un seuil. J'ai besoin de la contre-valeur précisément au moment où je demande. C'est pourquoi RDPMC semblait si attrayant. J'imagine que l'échantillonnage fréquemment faussera les lectures du compteur de performance.
  • PAPI s'appuie sur perf, donc hérite probablement le problème ci-dessus.
  • Ecrivez un module noyau - trop d'effort, trop sujet aux erreurs.

Idéalement, je voudrais une solution qui fonctionne sur OpenBSD et Linux, mais je pense que c'est un gros problème. Peut-être juste pour Linux pour le moment.

Toute aide est très appréciée. Merci.

EDIT: Je viens de trouver le Linux msr device node, ce qui suffirait probablement. Je vais laisser la question au cas où une meilleure réponse se présenterait.

+0

Vous pouvez programmer des compteurs à partir de l'espace utilisateur, mais vous souhaitez probablement épingler vos threads aux cœurs car les PMC ne sont pas sauvegardés/restaurés sur les commutateurs de contexte. Voir http: // agner.org/optimize/pour un module de noyau déjà écrit pour Linux qui vous donne accès à PMC, et aussi http://stackoverflow.com/questions/38848914/pmu-for-multi-threaded-environment/38984414#38984414 pour une discussion de les utiliser. –

+0

Merci! Pouvez-vous commenter sur combien imposerait le modèle d'échantillonnage de perf de frais généraux? Est-ce que ces routines de perfusion elles-mêmes seraient incluses dans les lectures que je ferais? –

+0

Aucune idée. J'utilise juste 'perf' en mettant une boucle que je veux microbenchmark dans son propre programme autonome et en utilisant' perf stat'. –

Répondre

0

Il semble que la meilleure façon - pour Linux au moins - est d'utiliser the msr device node.

Vous ouvrez simplement un nœud de périphérique, recherchez l'adresse du MSR requis et lisez ou écrivez 8 octets. OpenBSD est plus difficile, car (au moment de l'écriture) il n'y a pas de proxy d'espace utilisateur pour les MSR. Vous auriez donc besoin d'écrire un module noyau ou d'implémenter un sysctl à la main.

+0

Au lieu de 'lseek' /' write', il suffit d'utiliser 'pwrite' pour écrire à un décalage spécifié, comme décrit dans http://stackoverflow.com/questions/38848914/pmu-for-multi-threaded-environment/38984414# 38984414 –