Использование CPUID для определения характеристик процессора, надежное решение?

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

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

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

Так насколько же на самом деле __cpuid() надежен? По моему собственному опыту, это не кажется таким надежным. У меня что-то очень серьезное не так?


person Alex    schedule 13.02.2012    source источник
comment
Если вы не хотите использовать __cpuid (). Вы можете использовать OpenMP omp_get_num_procs (), который должен возвращать количество потоков, которые ваш процессор может запускать одновременно. Понятия не имею, насколько достоверна эта информация. Так у меня никогда не было проблем.   -  person Compuholic    schedule 13.02.2012
comment
CPUID обычно довольно надежен, но иногда может вводить в заблуждение или неверно. Ваш процессор вполне может поддерживать одну функцию, но ваша материнская плата не поддерживает (или отключена), поэтому она будет отображаться как присутствующая, но не будет работать. Существуют библиотеки, которые берут CPUID и пытаются сделать его более надежным, с базой данных исправлений и тому подобным.   -  person Kitsune    schedule 13.02.2012
comment
Но если ЦП не поддерживает Hyperthreading и CPUID, дающий вам информацию о том, что он присутствует, это действительно проблема с материнской платой, я мог видеть, что это наоборот, когда ЦП поддерживает HTT, но не материнская плата, и поэтому вы получить ложь при проверке HTT.   -  person Alex    schedule 13.02.2012


Ответы (2)


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

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

person Necrolis    schedule 13.02.2012

Почти наверняка существует пробел в идентификаторах [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