2009-02-12 4 views
1

J'ai du code qui a besoin de savoir combien de cœurs sont disponibles sur mon ordinateur et si Hyperthreading est activé.Comment savoir si la machine sur laquelle mon programme s'exécute utilise l'hyperthreading? (C#)

Existe-t-il un moyen de le faire en C#?

Mise à jour: Les machines sont un mélange de XP et Vista

Mise à jour: l'accès à 'Win32_Processor.NumberOfCores' ou '' Win32_Processor.NumberOfLogicalProcessors renvoie une exception (un ManagmentException avec le message "Not Found") sur l'un des les machines (mais pas toutes)

Répondre

3

Sous Vista et supérieur, vous pouvez utiliser GetLogicalProcessorInformation via PInvoke pour obtenir le nombre d'unités de processeur logique.

Sous Windows XP, il n'y a aucun moyen de différencier de façon fiable l'hyper-threading d'autres configurations multiprocesseur/cœur via C#. La solution WMI que quelqu'un a postée classera les processeurs multi-core comme hyper-thread.

Avant Vista, le seul moyen fiable est de vérifier le CPUID du processeur. Pour l'utiliser, vous pouvez créer une DLL native pouvant être appelée à partir de votre code managé. Le code Intel suivant sample serait un bon point de départ.

+0

Le lien semble être cassé – Anton

+0

Je pensais que HT serait 2 processeur logique, 1 physique et un dual core montrerait 2 processeurs logiques et 2 physiques. –

1

System.Environment.ProcessorCount vous indiquera combien de cœurs existent sur la machine sur laquelle s'exécute le code.

1

Cochez la propriété Environment.ProcessorCount, il retournera un entier, aussi loin que HyperThreading, je ne suis pas sûr.

2

La réponse simple à la première question au moins: Environment.ProcessorCount doit renvoyer le nombre de cœurs sur la machine.

Modifier: l » Here une méthode non basée sur WMI de vérifier pour savoir si Hyperthreading est activé (pas que ce soit nécessairement plus gentil). Voir également article this.

0

StackOverflow question 188503 a les informations dont vous avez besoin ...

Citant la réponse haut sur cette question:

System.Environment.ProcessorCount 

renvoie le nombre de processeurs logiques (voir MSDN)

Pour distinguer entre hyperthreading et les cœurs séparés, sonne comme si vous aviez besoin d'un peu de WMI.

0

GetLogicalProcessorInformation est suffisante pour l'aspect HT, mais malheureusement, il est uniquement disponible dans XP SP3, 64 bits XP/Vista/Server 2003 (et je crois est légèrement cassé vista avant)

Joe Duffy enveloppé ce en C#, mais a pas encore publié la source, bien que Mark Russinovich ait publié l'outil (Coreinfo) qu'il a créé avec, probablement vous pouvez le décompiler pour voir le code.

Questions connexes