Plusieurs processeurs

Les ordinateurs avec plusieurs processeurs sont généralement conçus pour l’une des deux architectures suivantes : l’accès à la mémoire non uniforme (NUMA) ou le multitraitement symétrique (SMP).

Dans un ordinateur NUMA, chaque processeur est plus proche de certaines parties de la mémoire que d’autres, ce qui rend l’accès à la mémoire plus rapide pour certaines parties de la mémoire que d’autres parties. Sous le modèle NUMA, le système tente de planifier des threads sur des processeurs proches de la mémoire utilisée. Pour plus d’informations sur NUMA, consultez Prise en charge de NUMA.

Sur un ordinateur SMP, au moins deux processeurs ou cœurs identiques se connectent à une seule mémoire main partagée. Sous le modèle SMP, n’importe quel thread peut être affecté à n’importe quel processeur. Par conséquent, la planification de threads sur un ordinateur SMP est similaire à la planification de threads sur un ordinateur avec un seul processeur. Toutefois, le planificateur dispose d’un pool de processeurs, ce qui lui permet de planifier l’exécution simultanée de threads. La planification est toujours déterminée par la priorité des threads, mais elle peut être influencée par la définition de l’affinité de thread et du processeur idéal pour les threads, comme indiqué dans cette rubrique.

Affinité de thread

L’affinité de thread force un thread à s’exécuter sur un sous-ensemble spécifique de processeurs. La définition de l’affinité de thread doit généralement être évitée, car elle peut interférer avec la capacité du planificateur à planifier efficacement des threads entre les processeurs. Cela peut diminuer les gains de performances générés par le traitement parallèle. Une utilisation appropriée de l’affinité de thread consiste à tester chaque processeur.

Le système représente l’affinité avec un masque de bits appelé masque d’affinité de processeur. Le masque d’affinité est la taille du nombre maximal de processeurs dans le système, avec des bits définis pour identifier un sous-ensemble de processeurs. Initialement, le système détermine le sous-ensemble de processeurs dans le masque.

Vous pouvez obtenir l’affinité de thread actuelle pour tous les threads du processus en appelant la fonction GetProcessAffinityMask . Utilisez la fonction SetProcessAffinityMask pour spécifier l’affinité de thread pour tous les threads du processus. Pour définir l’affinité de thread pour un thread unique, utilisez la fonction SetThreadAffinityMask . L’affinité de thread doit être un sous-ensemble de l’affinité de processus.

Sur les systèmes avec plus de 64 processeurs, le masque d’affinité représente initialement les processeurs d’un seul groupe de processeurs. Toutefois, l’affinité de thread peut être définie sur un processeur dans un autre groupe, ce qui modifie le masque d’affinité pour le processus. Pour plus d’informations, consultez Groupes de processeurs.

Processeur thread idéal

Lorsque vous spécifiez un processeur idéal pour les threads, le planificateur exécute le thread sur le processeur spécifié lorsque cela est possible. Utilisez la fonction SetThreadIdealProcessor pour spécifier un processeur préféré pour un thread. Cela ne garantit pas que le processeur idéal sera choisi, mais fournit une indication utile au planificateur. Sur les systèmes avec plus de 64 processeurs, vous pouvez utiliser la fonction SetThreadIdealProcessorEx pour spécifier un processeur préféré dans un groupe de processeurs spécifique.

Prise en charge de NUMA

Groupes de processeurs