2010-05-25 2 views
6

Я уже правильно правильно правильно определяю количество логических процессоров на всех трех этих платформах.C/C++/Assembly Программно определить, активна ли гиперпоточность в Windows, Mac и Linux

Для того, чтобы правильно определить количество физических процессоров/ядер, мне нужно будет определить, поддерживается ли гиперпоточность и активна (или включена, если вы предпочитаете), и если это так делит количество логических процессоров на 2, чтобы определить количество физических процессоров.

Perphaps я должен привести пример:

четырехъядерным Intel процессора с HyperThreading включен имеет 4 физических ядра, все же 8 логических процессоров (гиперпотоковой создает еще 4 логических процессоров). Таким образом, моя текущая функция обнаружила бы 8 вместо желаемого 4.

Мой вопрос, поэтому, есть ли способ определить, поддерживается ли поддержка гиперпотока И ВКЛЮЧЕНА?

ответ

4

Linux:

Количество физических процессоров:

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

Количество логических процессоров:

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

Предположим, что мне понадобится использовать grep.cpp из библиотеки boost в моей программе, чтобы использовать это. Мой вопрос был специфичен для c/C++/assemler, как указано в теме, и теги – HTASSCPP

5

CPUID инструкция (при передаче функции 1H в EAX) возвращает они Hyper Threading флаг функции в бит 28 регистра EDX. Я думаю, что многоядерные процессоры сообщают, что они поддерживают гиперпоточность, хотя каждое отдельное ядро ​​может запускать только один поток.

Он также возвращает количество логических процессоров на физический процессор в битах 23-16 EBX. Я думаю, что вам придется запросить каждый процессор отдельно, чтобы поразить все процессоры вашей системы.

4

В Windows 2003 Server и Windows XP с пакетом обновления 3 (SP3) и более поздней версии вы можете определить эту информацию, используя системный вызов GetLogicalProcessorInformation.

+0

Означает ли это, что можно сказать Windows 7 или Windows Server 2008 RC2? Или я должен использовать GetLogicalProcessorInformation? – HTASSCPP

+0

Страница msdn говорит об элементе SYSTEM_LOGICAL_PROCESSOR_INFORMATION :: ProcessorCore.Flags: «Если значение этого элемента равно 1, логические процессоры, идентифицированные значением функциональных блоков участника ProcessorMask, как в Hyperthreading или SMT. В противном случае идентифицированные логические процессоры не делят функциональные блоки ». Но он также говорит, что значение не соответствует до Windows Vista, а затем означает, что логические процессоры находятся в одном физическом пакете. Есть больше проблем: на самом деле не указано, что вызов будет группировать логические процессоры полезным способом. –

3

На OS X:

#include <sys/sysctl.h> 

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

См заголовок или справочную страницу для получения дополнительной информации. (Обратите внимание, что вы можете получить число логических cpus таким же образом, используя строку «hw.logicalcpu»)

+0

Работы pefectly на всех машинах Я протестировал это, спасибо! – HTASSCPP

Смежные вопросы