Использование CPUID для определения характеристик процессора, надежное решение? - PullRequest
6 голосов
/ 13 февраля 2012

Я пытаюсь собрать информацию о моем процессоре с помощью __cpuid(). Несмотря на то, что он работает правильно на моем компьютере, когда я запускаю свою программу на компьютере моего коллеги, он обнаруживает, что Intel Core2 Quad Q6600 является гиперпоточным, хотя в соответствии со спецификациями на собственном сайте Intel это не так. «т.

__cpuid() также обнаруживает неправильное количество «логических ядер», как показано здесь: Программно определять количество физических процессоров / ядер или, если гиперпоточность активна в Windows, Mac и Linux . Где утверждается, что Intel Xeon E5520 имеет 16 логических ядер и 8 физических.

Я попытался запустить код, найденный в этой теме, на моем собственном компьютере, Intel i7 2600K , который дал мне те же цифры, что и для Xeon.

Насколько надежен __cpuid() на самом деле? Из моего собственного опыта это не кажется таким надежным. Я понял что-то очень неправильное?

Ответы [ 2 ]

3 голосов
/ 11 июля 2014

В идентификаторах 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, когда нашел ваш вопрос.

3 голосов
/ 14 февраля 2012

CPUID можно доверять, вам просто нужно правильно его использовать. в этом случае это означает правильное перечисление топологии. вы получаете 16 логических процессоров, потому что поле, из которого оно получено, представляет максимум, который он может поддерживать, а не сколько там на самом деле. значение, полученное для ядер, на самом деле является логическим числом.

код в теме очень простой и подразумевается как отправная точка, в моей системе (i7 2720QM) я также записываю недопустимые данные, но, используя свой собственный код, который проверяет топологию в соответствии с отображениями Intel CPUID, я получаю правильные результаты .

...