Как узнать количество ядер в Win32?

Я пишу программу на C для Windows, которая должна запускать столько потоков, сколько доступно ядер. Но я не знаю, как узнать количество ядер. Есть идеи?

4 ответа

Вы можете позвонить GetSystemInfo Функция WinAPI; это возвращает SYSTEM_INFO struct, которая имеет количество процессоров (это число ядер в системе с несколькими ядрами CPU).

Вы можете прочитать переменную окружения NUMBER_OF_PROCESSORS.

Как @Changming-Sun упомянул в комментарии выше, GetSysInfo возвращает количество логических процессоров, которое не всегда совпадает с количеством ядер процессора. На машинах, поддерживающих гиперпоточность (включая большинство современных процессоров Intel), более одного потока могут работать на одном ядре (технически более чем один поток будет иметь свой контекст потока, загруженный в одно ядро). Чтобы узнать количество ядер процессора, необходимо вызвать GetLogicalProcessorInformation и немного поработать с кодом. По сути, вы получаете список записей SYSTEM_LOGICAL_PROCESSOR_INFORMATION, и вам нужно подсчитать количество записей с установленным RelationProcessorCore. Хороший пример того, как это закодировать в документации GetLogicalProcessorInformation, предоставленной Microsoft: https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getlogicalprocessorinformation

Введите "cmd" при запуске Windows и откройте "cmd.exe". Теперь введите следующую команду:

WMIC CPU Get /Format:List

Вы найдете такие записи, как - "NumberOfCores" и "NumberOfLogicalProcessors". Обычно логические процессоры достигаются многопоточностью. Поэтому отношения обычно бывают такими:

NumberOfLogicalProcessors = NumberOfCores * Количество потоков на ядро.

Поскольку каждое ядро ​​обслуживает блок обработки, следовательно, с многопоточностью блок логической обработки реализуется в реальном пространстве.

Больше информации здесь.

Хотя этот вопрос касается.NET, а ваш - C, основные ответы должны помочь:

Определение количества процессоров

Другие вопросы по тегам