Il existe des fonctions API Windows pour obtenir la topologie du CPU et du cache du CPU.
GetSystemInfo
remplit SYSTEM_INFO
con dwActiveProcessorMask
y dwNumberOfProcessors
.
GetLogicalProcessorInformationEx
peut être utilisé pour obtenir des informations plus précises sur chaque processeur, comme la taille du cache, la taille des lignes de cache, l'associativité du cache, etc. Certaines de ces informations peuvent être obtenues par _cpuidex
también.
Je demande dans quels cas les valeurs obtenues pour un appel ne sont pas cohérentes avec les valeurs obtenues pour un autre appel, si les deux appels sont effectués sans redémarrage du programme.
Plus précisément, le nombre de CPU peut-il changer :
- L'utilisateur doit-il mettre en hibernation, installer un nouveau processeur et réveiller le système ? Ou bien cela ne fonctionnerait-il pas ?
- Ou le système d'exploitation et le matériel peuvent décider dynamiquement de brancher un autre processeur ?
- Ou bien cela peut être réalisé avec des machines virtuelles, mais pas sur du matériel réel ?
La taille de la ligne de cache et la taille du cache peuvent changer :
- Para
GetLogicalProcessorInformationEx
car le processeur est remplacé au moment de l'exécution - Para
_cpuid
simplement parce que le système contient des processeurs avec des propriétés de cache différentes, et que les appels ultérieurs se font sur un processeur différent
La raison pratique de ces questions est que je veux obtenir ces informations une seule fois, et les mettre en cache :
- Je vais l'utiliser pour régler l'allocateur, donc changer la stratégie d'allocation pour la mémoire déjà allouée est susceptible de provoquer une corruption de la mémoire.
- Ces fonctions peuvent être coûteuses, elles peuvent être des appels au noyau, ce que je veux éviter.