C/С++/Assembly Программно определить, активна ли гиперпоточность в Windows, Mac и Linux

Я могу правильно правильно определить количество логических процессоров на всех трех этих платформах.

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

Перфапы Я должен привести пример:

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

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

Ответ 1

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

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

Ответ 2

Linux:

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

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

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

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

Ответ 3

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

Ответ 4

В OS X:

#include <sys/sysctl.h>

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

Для получения дополнительной информации см. заголовок или man-страницу. (Обратите внимание, что вы можете получить число логического процессора таким же образом, используя строку "hw.logicalcpu" )