Puis-je lire les compteurs de performance du processeur à partir d’un programme en mode utilisateur sous Windows?

Je voudrais programmer et lire les compteurs de performance matérielle offerts sur tous les matériels x86 récents.

Sur Linux, il existe différents systèmes perf_events (et l’utilitaire perf pour le faire en dehors d’un programme non modifié).

Existe-t-il une telle fonctionnalité intégrée dans Windows? Si aucune fonction intégrée n’existe, la deuxième solution serait une autre approche utilisant peut-être un code tiers, mais cela ne nécessite pas que je fasse signer un pilote.

Réponse courte

Non, il n’y a pas de fonctionnalité intégrée dans Windows. De plus, la commande linux perf ne fonctionne pas sur le sous-système Linux pour Windows 10.

Longue réponse

Pour accéder à ces compteurs, vous devez combiner ces instructions:

  • rdpmc __readpmc (voir la réponse associée)
  • rdmsr __readmsr
  • wrmsr __writemsr

Malheureusement, ces instructions ne peuvent être appelées qu’à partir du mode kernel, vous devez donc vous connecter avec un pilote. Bien qu’il soit facile d’écrire le code du pilote, il n’est pas si facile de faire signer le pilote (surtout si vous avez indiqué que vous souhaitiez le faire individuellement).

C’est pourquoi je vous conseille de regarder des projets existants comme Open Hardware Monitor et le projet pcm d’Intel.

Open Hardware Monitor

Ce projet open-source est écrit en C # et inclut les binarys et le code source C d’un pilote WinRing0.sys (32 bits) / WinRing0x64.sys (64 bits) développé par OpenLibSys.org. Si vous souhaitez utiliser ce pilote dans votre projet, il vous suffit d’inclure leur avis de copyright .

PCM

Ce projet open-source est écrit en C ++ et contient également des sources pour un pilote similaire (voir le répertoire WinMSRDriver), mais vous devez le créer vous-même pour que vous renconsortingez à nouveau le problème de signature.

Quoi qu’il en soit, je voulais mentionner ce projet car il contient probablement beaucoup de code qui pourrait vous intéresser.

Accès en mode utilisateur

Maintenant, une fois que ce pilote est chargé (Open Hardware Monitor extrait et charge automatiquement le pilote au démarrage de l’application), vous pouvez commencer à appeler ces pilotes IOCTL en utilisant les fonctions Windows CreateFile / DeviceIoControl et bien sûr CloseHandle depuis votre application en mode utilisateur.