2 votes

Dans quels cas GetSystemInfo/GetLogicalProcessorInformationEx renvoie un nombre de processeurs différent dans la même exécution de programme ?

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.

2voto

Hadi Brais Points 7944

Si un thread est programmé pour s'exécuter sur un cœur qui appartient à un groupe de processeurs différent avec un nombre différent de processeurs, GetSystemInfo y GetLogicalProcessorInformation renverrait un nombre différent de processeurs, qui est le nombre de processeurs dans le groupe auquel appartient ce noyau.

Sur les systèmes de type serveur qui prennent en charge l'ajout de processeurs à chaud, ce nombre de processeurs peut évoluer comme suit :

  • L'ajout à chaud d'un processeur de telle sorte qu'il existe un groupe de processeurs avec moins de 64 processeurs et que le thread s'exécute sur ce groupe modifierait le nombre de processeurs indiqué par la fonction GetSystemInfo , GetLogicalProcessorInformation et GetLogicalProcessorInformationEx .
  • La taille maximale d'un groupe de processeurs est de 64 et Windows crée toujours les groupes de manière à minimiser le nombre total de groupes. Ainsi, le nombre de groupes est le plafond du nombre total de cœurs logiques divisé par 64. L'ajout à chaud d'un processeur peut entraîner la création d'un nouveau groupe. Cela change non seulement le nombre total de processeurs, mais aussi le nombre de groupes, qui ne peut être obtenu que via GetLogicalProcessorInformationEx .

Sur une machine virtuelle, le nombre de processeurs peut également augmenter de façon dynamique sans qu'il soit nécessaire de les brancher à chaud.

Vous pouvez simuler l'ajout de processeurs à chaud à l'aide de la fonction PNPCPU outil. Ceci est utile pour tester l'exactitude d'une partie d'un code qui dépend du nombre de processeurs.

Il est possible de recevoir une notification du système lorsqu'un nouveau processeur est ajouté en écrivant un pilote de périphérique et en enregistrant une fonction synchrone o asynchrone notification du conducteur. Je ne pense pas que cela soit possible sans un pilote de périphérique.

Je pense que, sur les systèmes actuels, les propriétés du cache retournées par GetLogicalProcessorInformationEx ne peut changer que lors de la migration d'un thread vers un autre cœur ou CPU où une ou plusieurs de ces propriétés sont différentes. Par exemple, sur un processeur Intel Lakefield, les propriétés du cache L2 dépendent du cœur sur lequel le thread est exécuté car les différents cœurs ont des caches L2 aux propriétés différentes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X