Почти наверняка существует пробел в идентификаторах [x2] APIC на вашем процессоре, что означает, что некоторые значения идентификаторов APIC не отображаются ни на какие логические процессоры. Вы должны использовать 0xB лист cpuid, чтобы узнать. Вы можете посмотреть эталонный код и алгоритм 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 или аналогичный неправильный код из другого места. На странице Wikipedia по cpuid, которую я недавно обновил после того, как я изо всех сил пытался понять проблему, теперь есть проработанный пример в разделе «Поток / ядро Intel и топология кеша» для перечисления топологии на процессоре с пропусками APIC id, с дополнительными деталями, включая то, как определить, какие биты идентификаторов 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 для определения топологии ЦП, надежное решение?» потому что я нашел ваш вопрос совершенно случайно. Я искал дампы процессора Sandy Bridge в Google, когда нашел ваш вопрос.
person
Fizz
schedule
11.07.2014