2016-06-22 2 views
4

У меня есть свалка для моего приложения. Мое приложение не работает для какого-то пользователя, говорящего «неверная инструкция», пытаясь выполнить некоторую инструкцию SSSE, которую я имею там.Найти модель CPU, учитывая дамп аварийной ситуации в режиме пользователя

В WinDBG, как узнать модель процессора, чтобы я мог узнать его набор команд, либо поддерживать набор инструкций, либо обновлять минимальные аппаратные требования приложения?

Вот выход !cpuid:

CP F/M/S Manufacturer  MHz 
0 16,4,3 <unavailable> 3000 
1 16,4,3 <unavailable> 3000 
2 16,4,3 <unavailable> 3000 
3 16,4,3 <unavailable> 3000 

Остальные команды Google говорит может помочь печати «Нет экспорт найден» (errrec, CPUInfo, SysInfo!!).

ответ

5

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

Столбец CP содержит номер логического процессора, поэтому вы знаете, что имеете дело с системой с 4 логическими процессорами. Может быть четырехъядерным, или, возможно, двухъядерным с HyperThreading.

F/M/S является семейством/моделью/степпингом, которые являются обычным и довольно стандартным способом идентификации процессоров. Как AMD говорит:

Процессор Семейство идентифицирует один или несколько процессоров, как принадлежность к группе, которая обладает некоторым общим определением для программного обеспечения или аппаратных целей. Модель Модель указывает один экземпляр семейства процессоров. Шаг определяет конкретную версию конкретной модели. Таким образом, семья, модель и шаг, вместе взятые, образуют уникальный идентификатор или подпись для процессора.

Это наиболее полезно, если у вас есть производитель, когда вы идете искать эти вещи, потому что семейные номера довольно сумбурно, но, к счастью, это довольно ясно, что семья число 16 (10 в шестнадцатеричном формате) соответствует AMD процессор (который должен иметь строку производителя «AuthenticAMD»). В частности, это AMD K10, который является микроархитектурой Барселоны. Это означает, что нет HyperThreading - это просто встроенная четырехъядерная система.

Мы можем сузить его, посмотрев на модель. Было много разных моделей, основанных на ядре Barcelona, ​​которые были по-разному обозначены как Athlon II, Opteron, Phenom, Phenom II, Sempron, Turion и V-Series. Ваша модель 4. Это то, где она становится довольно сложной, потому что я не знаю хорошего ресурса, в котором перечислены номера моделей и степпинги для разных процессоров. Вы должны обратиться непосредственно к производителю и пробраться через их руководства. Например, here is AMD's Revision Guide for the 10h Family. Если вы перейдете в раздел «Идентификация процессора» (отображается в качестве закладки в PDF-файле для меня), вы увидите что-то, что выглядит многообещающим, но информация, конечно же, не представлена ​​в легко усваиваемой форме. Вы получаете длинные шестнадцатеричные значения, из которых вы должны извлекать отдельные биты, соответствующие семейству (8-11), модели (4-7) и шагу (0-3).

Я не делал все усилия, чтобы быть уверенным, я просто думаю, что это AMD Phenom II X4. X4 подходит для четырехъядерных процессоров, и из беглого взгляда кажется, что Phenom II - это модель 4.

В любом случае, возможно, вы, вероятно, остановились, потому что микроархитектура сообщает вам все, что вам нужно знать. Это ядро ​​AMD Barcelona, ​​которое не поддерживает инструкции Supplemental SSE3 (SSSE3) (три S's-не следует путать с SSE3, соглашения об именах смешны). SSSE3 был изобретен Intel, выпущенный с микроархитектурой Core 2.

AMD не применяет их до Bobcat/Bulldozer. Bulldozer было следующим поколением, семейство 21 (15 часов), для настольных компьютеров и серверов, а Bobcat было низкопористым сердечником для APU AMD.

SSSE3 действительно не предлагал много новых инструкций. Только 16, в основном предназначенные для работы с упакованными целыми числами, и большинство из них aren't very exciting. Дамп должен также сообщить вам код операции, вызвавшей сбой. Если нет, вам придется вернуться и понять это из байтового адреса кода. Это точно скажет вам, какая инструкция является проблемой. Я предполагаю, что вы используете PSHUFB, чтобы перетасовать байты на месте, что является одной инструкцией SSSE3, которая на самом деле очень полезна. Одно общее использование, которое я видел, - a fast population count algorithm (хотя есть и другие реализации, для которых не требуется SSSE3, которые почти одинаково быстрей, если не быстрее).

Предполагая, что вы компилируете с помощью MSVC, я действительно удивлен, увидев, что он испускает эту инструкцию. Чтобы получить его, вам нужно сказать компилятору, чтобы он нацелился на AVX, что остановит ваш код от работы на чем-то старше Sandy Bridge/Bulldozer. Я уверен, что если вы не хотите поднять минимальные системные требования, вы можете найти альтернативную последовательность инструкций, чтобы сделать то же самое. pshufd, или movaps + shufps Возможные кандидаты для обходных решений.

+0

Спасибо за ваш вклад. Да, здание с визуальной студии. Это не компилятор, излучающий эти инструкции. Я проверил свой код вручную, используя intrinsics. AFAIR он стал примерно в два раза быстрее по сравнению с автоматической векторизации на AVX2: мои алгоритмы в основном обрабатывают целочисленные числа/бит-маски, гигабайты из них, и я закодировал множество бит-трюков, обрабатывающих эти значения __m128i. Я не считаю, что автоматическая векторизация способна делать оптимизации, сопоставимые с тем, что я здесь сделал. – Soonts

+0

Как вы видите, совместимость с процессором является недостатком этого подхода: я был очень разочарован, когда я понял, что в течение последнего десятилетия уже нет такой вещи, как набор инструкций x86, Intel/AMD расходится. Похоже, я могу полагаться только на SSE 4.1 и ниже, и им уже 9 лет ... – Soonts

+1

Как раз тогда, когда я думаю, что я догоняю, есть такая запись, которая усиливает, насколько мне еще нужно идти. Вы могли бы пойти прямо на хрюканье, но решили сделать его образовательным, и это преуменьшение. Написать книгу. Я куплю это. –

3

Команда !sysinfo, !cpuinfo и !errec являются ядро ​​дамп команды, определенной в kdexts расширения, поэтому они не доступны в режиме отладки пользовательской и, вероятно, не будут хорошо работать, если вы загрузите это расширение в явном виде.

Единственная идея, чтобы получить дополнительную информацию из дампа я был .dumpdebug, который будет выводить поток называется SystemInfoStream который выглядит следующим образом:

Stream 7: type SystemInfoStream (7), size 00000038, RVA 000000BC 
    ProcessorArchitecture 0000 (PROCESSOR_ARCHITECTURE_INTEL) 
    ProcessorLevel   0006 
    ProcessorRevision  2A07 
    NumberOfProcessors  04 
    ... (OS specifics) ... 

К сожалению, это точно так же, как показано на !cpuid, так что на самом деле больше информации не содержится в дампе.

Смежные вопросы