В идентификаторах APIC [x2] на вашем процессоре почти наверняка есть пробел, что означает, что некоторые значения идентификаторов APIC не отображаются ни на какие логические процессоры.Вы должны использовать лист процессора 0xB, чтобы узнать.Вы можете посмотреть справочный код и алгоритм Intel (https://software.intel.com/en-us/articles/intel-64-architecture-processor-topology-enumeration/) для шагов, но он сводится к вызову с EAX = 0xB, ECX = 0 и получению в EBX числа логических процессоров (потоков) на ядро изатем снова вызвать cpuid с EAX = 0xB, ECX = 1 и получить в EBX количество логических процессоров на пакет процессора.
Старый метод использования листа 0x1 не может учитывать пробелы в идентификаторе APIC. Увы, это пример кодадо сих пор приведены на справочной странице MSDN Visual C ++ 2013 (http://msdn.microsoft.com/en-us/library/hskdteyh.aspx), и , это некорректно для процессоров, выпущенных в 2010 году, а затем , поскольку вы выяснили, используя ли код из MSDN или аналогичный неверный кодиз другого источника. На странице Википедии по cpuid, которую я недавно обновил после того, как изо всех сил пытался разобраться в этой проблеме, теперь в разделе «Топология потоков, ядра и кэша Intel» приведен пример перечисления топологии процессора с APIC.пробелы в идентификаторах, с дополнительной информацией, в том числе о том, как определить, какие битыФактически используются идентификаторы APIC, которые являются «мертвыми».
Учитывая пример кода, который в настоящее время предлагается Microsoft на их странице __cpuid (), это в основном тот же вопрос, что и Логический счетчик ЦП возвращает 16 вместо 4 , поскольку он основан на той же ошибке интерпретациииз спецификации Intel.В качестве объяснения плохого шоу MSDN код, который они предлагают, работал нормально до 2010 года или около того;Корпорация Intel использовала подобный метод до появления x2APIC, как вы можете видеть в этом старом видео / статье: https://software.intel.com/en-us/articles/hyper-threading-technology-and-multi-core-processor-detection Если вы посмотрите на различные версии страницы MSDN на __cpuid, их пример кода в основном осталсято же самое с 2008 года ...
Что касается одиночного бита обнаружения многопоточности, то это более длинная история, на которую я уже ответил в Почему Hyper-Threading сообщается как поддерживаемый на процессорах без него? .Короче говоря, этот довольно старый бит говорит вам, поддерживает ли процессорный пакет более одного логического процессора, будь то с помощью гиперпоточности или многоядерной технологии.Таким образом, название бита вводит в заблуждение.
Кроме того, я предлагаю изменить название вашего вопроса на «Использование CPUID для обнаружения CPU топология , надежное решение?»потому что я нашел твой вопрос совершенно случайно.Я искал дампы Sandy Bridge cpuid в Google, когда нашел ваш вопрос.