7
votes

C / C ++ / Assembly Détecter par programme si l'hyper-threading est actif sur Windows, Mac et Linux

Je peux déjà détecter correctement le nombre de processeurs logiques correctement sur les trois de ces plates-formes.

Pour pouvoir détecter le nombre de processeurs physiques / noyaux correctement, je devrai détecter correctement si HyperThreading est prise en charge et active (ou activée si vous préférez) et si cela divise le nombre de processeurs logiques de 2 pour déterminer le nombre des processeurs physiques.

PEPHAPS Je devrais fournir un exemple:

Un noyau quadrial Intel CPU avec hyperthreading activé comporte 4 cœurs physiques, mais 8 processeurs logiques (hyperthreading crée 4 autres processeurs logiques). Donc, ma fonction actuelle détecterait 8 au lieu du 4 souhaité.

Ma question est donc s'il existe un moyen de détecter si l'hyperthreading est pris en charge et activé?


0 commentaires

4 Réponses :


3
votes

Linux:

Nombre de CPU physiques: P>

grep -i "processor" /proc/cpuinfo | sort -u | wc -l


1 commentaires

Je suppose que je vais devoir utiliser grep.cpp de Boost Bibliothèque dans mon programme pour l'utiliser. Ma question était spécifique à C / C ++ / Assembller, comme indiqué dans le sujet et les balises



4
votes

Le CPUID instructions (lorsque vous passez la fonction 1H dans EAX) renvoie, ils hyper le drapeau de fonctionnalité de filetage au bit 28 du registre EDX. Je pense que les processeurs multicœurs signalent qu'ils sont hyperthreading activés, même si chaque noyau individuel ne peut exécuter qu'un seul fil.

Il renvoie également le nombre de processeurs logiques par processeur physique en bits 23-16 de EBX. Je pense que vous devez interroger chaque processeur individuellement afin de frapper tous les processeurs de votre système.


0 commentaires

4
votes

sur Windows 2003 Server et Windows XP SP3 et ultérieurement, vous pouvez déterminer ces informations à l'aide du GetLogicalProcessorInformation Call System.


2 commentaires

Cela fonctionne-t-il sur Windows 7 ou Windows Server 2008 RC2? Ou devrais-je utiliser getlogicalProcessorInformation alors?


La page MSDN indique du champ System_Logical_Processor_Information :: ProcessorCore.Flags champs "Si la valeur de ce membre est 1, les processeurs logiques identifiés par la valeur des unités fonctionnelles de l'élément de process masksk, comme dans HyperTheading ou SMT. Sinon, les processeurs logiques identifiés ne pas partager des unités fonctionnelles. " Mais il dit également que la valeur est erronée avant Windows Vista, puis signifie que les processeurs logiques sont dans le même package physique. Il y a plus de problèmes: il n'est vraiment pas précisé que l'appel regroupera les processeurs logiques de manière utile.



3
votes

ON OS X:

#include <sys/sysctl.h>

int physicalCores;
sysctlbyname("hw.physicalcpu", &physicalCores, sizeof(physicalCores), NULL, 0);


0 commentaires