Paramètres de démarrage pour tester les pilotes pour la prise en charge de plusieurs groupes de processeurs

Windows 7 et Windows Server 2008 R2 prennent en charge les ordinateurs avec plus de 64 processeurs. Cette prise en charge est rendue possible par l’introduction de groupes de processeurs. À des fins de test, vous pouvez configurer n’importe quel ordinateur disposant de plusieurs processeurs logiques pour avoir plusieurs groupes de processeurs en limitant la taille du groupe. Cela signifie que vous pouvez tester des pilotes et des composants pour la compatibilité de plusieurs groupes de processeurs sur des ordinateurs qui ont 64 processeurs logiques ou moins.

Note Le concept de groupes de processeurs, introduit avec Windows 7, permet aux API et aux DDIs existants de continuer à fonctionner sur des ordinateurs dotés de plus de 64 processeurs logiques. En règle générale, les processeurs d’un groupe sont représentés par un masque d’affinité, qui a une longueur de 64 bits. Tout ordinateur avec plus de 64 processeurs logiques aura nécessairement plusieurs groupes. Lorsqu’un processus est créé, le processus est affecté à un groupe spécifique. Par défaut, les threads du processus peuvent s’exécuter sur tous les processeurs logiques du même groupe, bien que l’affinité de thread puisse être modifiée explicitement. Les appels à n’importe quelle API ou DDI qui prend un masque d’affinité ou un numéro de processeur comme argument, mais pas un numéro de groupe, se limitent à affecter ou à créer des rapports sur ces processeurs dans le groupe du thread appelant. Il en va de même pour les API ou les DDIs qui retournent un masque d’affinité ou un numéro de processeur, comme GetSystemInfo.

À compter de Windows 7, une application ou un pilote peut utiliser des fonctions qui étendent les API héritées. Ces nouvelles fonctions prenant en compte le groupe acceptent un argument de numéro de groupe pour qualifier sans ambiguïté un numéro de processeur ou un masque d’affinité, et peuvent donc manipuler des processeurs en dehors du groupe du thread appelant. L’interaction entre les pilotes et les composants s’exécutant dans différents groupes au sein d’un ordinateur présente le risque de bogues lorsque des API ou des DDI héritées sont impliquées. Vous pouvez utiliser les API héritées non compatibles avec les groupes sur Windows 7 et Windows Server 2008 R2. Toutefois, les exigences des pilotes sont plus strictes. Pour garantir l’exactitude fonctionnelle des pilotes sur les ordinateurs qui ont plusieurs groupes de processeurs, vous devez remplacer tout DDI qui accepte un numéro de processeur ou un masque en tant que paramètre sans groupe de processeurs ou retourne un numéro de processeur ou un masque sans groupe de processeurs associé. Ces DDI hérités non compatibles avec les groupes peuvent fonctionner de manière erratique sur un ordinateur qui a plusieurs groupes de processus, car le groupe déduit peut être différent de ce que le thread appelant a prévu. Par conséquent, les pilotes qui utilisent ces DDIs hérités et qui sont ciblés pour Windows Server 2008 R2 doivent être mis à jour pour utiliser les nouvelles versions étendues des interfaces. Les pilotes qui n’appellent pas de fonctions qui utilisent des masques d’affinité processeur ou des numéros de processeur fonctionnent correctement, quel que soit le nombre de processeurs. Les pilotes qui appellent les nouvelles DDI peuvent s’exécuter sur les versions précédentes de Windows en incluant l’en-tête procgrp.h, en appelant WdmlibProcgrpInitialize et en les liant à la bibliothèque de compatibilité du groupe de processeurs (procgrp.lib).

Pour plus d’informations sur les nouvelles API et DDIs prenant en charge les groupes, téléchargez le livre blanc Prise en charge des systèmes qui ont plus de 64 processeurs logiques : recommandations pour les développeurs.

Pour identifier les problèmes potentiels liés aux groupes de processeurs dans les pilotes et les composants, vous pouvez utiliser les options BCDEdit /set . Les deux paramètres de configuration de démarrage BCD, groupsize et maxgroup, peuvent configurer n’importe quel ordinateur disposant de plusieurs processeurs logiques pour prendre en charge plusieurs groupes de processeurs. L’option groupaware modifie le comportement de certaines DDIs et manipule l’environnement de groupe à des fins de test.

Créer plusieurs groupes de processeurs en modifiant la taille du groupe

L’option groupize spécifie le nombre maximal de processeurs logiques dans un groupe. Par défaut, l’option groupize n’est pas définie et tout ordinateur avec 64 processeurs logiques ou moins a un groupe, qui est le groupe 0.

Note Un processeur physique, ou un package de processeur, peut avoir un ou plusieurs cœurs ou unités de processeur, chacun pouvant contenir un ou plusieurs processeurs logiques. Le système d’exploitation considère un processeur logique comme un moteur de calcul logique.

Pour créer plusieurs groupes de processeurs, exécutez BCDEdit /set dans une fenêtre d’invite de commandes avec élévation de privilèges et spécifiez une nouvelle valeur de taille maximale pour groupsize inférieure au nombre total de processeurs logiques. Notez que le paramètre de taille de groupe est destiné au test et que vous ne devez pas configurer les systèmes d’expédition avec ce paramètre. La valeur maxsize peut être définie sur n’importe quelle puissance de 2 comprise entre 1 et 64 inclusivement. La commande utilise la syntaxe suivante :

bcdedit.exe /set groupsize maxsize

Par exemple, la commande suivante définit le nombre maximal de processeurs dans un groupe sur 2.

bcdedit.exe /set groupsize 2

Si un ordinateur non-NUMA a 8 processeurs logiques, le fait de définir la taille de groupes sur 2 crée 4 groupes de processeurs avec 2 processeurs logiques chacun.

Groupe 0 : 1 nœud NUMA contenant 1 package de 2 processeurs logiques

Groupe 1 : 1 nœud NUMA contenant 1 package de 2 processeurs logiques

Groupe 2 : 1 nœud NUMA contenant 1 package de 2 processeurs logiques

Groupe 3 : 1 nœud NUMA contenant 1 package de 2 processeurs logiques

Par conception, un ordinateur non-NUMA est considéré comme ayant un nœud NUMA. Étant donné que les nœuds NUMA ne peuvent pas couvrir les groupes, le système crée un nœud pour chaque groupe après avoir redémarré l’ordinateur.

Si groupize est défini sur une valeur inférieure au nombre de processeurs logiques dans un package de processeur physique (socket), le système redéfinit son concept de package au redémarrage de sorte que le package ne couvre pas un groupe. Cela signifie que plus de packages que ceux qui sont réellement présents sont signalés par les API de topologie du processeur. Cela signifie également que les limites de licence du processeur Windows (au niveau du package) peuvent empêcher certains packages de processeur de démarrer lorsque la taille de groupes est définie.

Un package de processeur peut s’étendre sur des groupes s’il a plusieurs nœuds NUMA définis dans celui-ci et si le système affecte ces nœuds à différents groupes.

Windows limite le nombre de groupes pris en charge. Ce nombre peut changer avec les nouvelles versions de Windows ou dans les versions du Service Pack. Les pilotes ou composants ne doivent pas dépendre du nombre de groupes pris en charge par Windows comme étant constants. La limite du nombre de groupes peut limiter le nombre de processeurs logiques autorisés à démarrer lorsque de petites valeurs sont utilisées pour l’option de démarrage groupize .

Pour supprimer le paramètre de taille de groupes que vous avez utilisé pour le test et revenir au paramètre par défaut de 64 processeurs logiques par groupe, utilisez la commande BCDEdit suivante.

bcdedit.exe /deletevalue groupsize

Cette commande équivaut à définir groupize sur 64.

Maximiser le nombre de groupes de processeurs

L’option maxgroup est une autre façon de créer des groupes de processeurs sur un ordinateur avec plusieurs processeurs logiques et nœuds NUMA. L’option de démarrage maxgroup n’a aucun effet sur les ordinateurs non NUMA.

Pour optimiser le nombre de groupes, exécutez la commande BCDEdit /set dans une fenêtre d’invite de commandes avec élévation de privilèges. La commande utilise la syntaxe suivante :

bcdedit.exe /set maxgroup on

Par exemple, considérez un ordinateur qui a 2 nœuds NUMA, 1 package de processeur par nœud et 4 cœurs de processeur par package, pour un total de 8 processeurs logiques.

La configuration de groupe par défaut est :

Groupe 0 : 8 processeurs logiques, 2 packages, 2 nœuds NUMA

Si vous entrez un bcdedt.exe /set maxgroup on command suivi d’un redémarrage, la commande génère la configuration de groupe suivante :

Groupe 0 : 4 processeurs logiques, 1 package, 1 nœud NUMA

Groupe 1 : 4 processeurs logiques, 1 package, 1 nœud NUMA

Notez que les nœuds NUMA sont attribués aux groupes de manière à maximiser le nombre de groupes.

Pour revenir au paramètre par défaut, utilisez la commande BCDEdit suivante.

bcdedit.exe /set maxgroup off

Tester la compatibilité Multiple-Group en définissant l’option de démarrage prenant en charge les groupes

Windows 7 et Windows Server 2008 R2 ont introduit une nouvelle option BCD (groupaware) qui force les pilotes et les composants à prendre en compte plusieurs groupes dans un environnement de groupe de processeurs multiples. L’option groupaware modifie le comportement d’un ensemble de fonctions de pilote de périphérique pour aider à exposer les incompatibilités entre groupes dans les pilotes et les composants. Vous pouvez utiliser l’option de démarrage groupaware ainsi que les options groupize et maxgroup pour tester la compatibilité des pilotes avec plusieurs groupes lorsqu’un ordinateur a 64 processeurs logiques actifs ou moins.

Lorsque l’option de démarrage groupaware est définie, le système d’exploitation garantit que les processus sont démarrés dans un groupe autre que le groupe 0. Cela augmente les chances d’interaction entre les groupes entre les pilotes et les composants. L’option modifie également le comportement des fonctions héritées qui ne sont pas compatibles avec les groupes, KeSetTargetProcessorDpc, KeSetSystemAffinityThreadEx et KeRevertToUserAffinityThreadEx, afin qu’elles fonctionnent toujours sur le groupe numéroté le plus élevé qui contient des processeurs logiques actifs. Les pilotes qui appellent l’une de ces fonctions héritées doivent être modifiés pour appeler leurs équivalents prenant en charge le groupe (KeSetTargetProcessorDpcEx, KeSetSystemGroupAffinityThread et KeRevertToUserGroupAffinityThread),

Pour tester la compatibilité, utilisez la commande BCDEdit /set suivante.

bcdedit.exe /set groupaware on
Fonctions héritées qui ne prennent pas en compte les groupes Remplacement de Windows 7 prenant en compte les groupes

KeSetTargetProcessorDpc

KeSetTargetProcessorDpcEx

KeSetSystemAffinityThreadEx

KeSetSystemGroupAffinityThread

KeRevertToUserAffinityThreadEx

KeRevertToUserGroupAffinityThread

Pour réinitialiser l’ordinateur au paramètre par défaut, utilisez la commande BCDEdit suivante.

bcdedit.exe /set groupaware off