2014-09-13 2 views
2

У меня есть конфигурация: Intel (R) Core (TM) i7-4702MQ CPU (с архитектурой Haswell), Windows 8, Intel C++ Compiller XE 13.0. Я хочу, чтобы запустить свою программу с оптимизацией AVX2 и поставить флаги компиляции:Как проверить, поддерживает ли операционная система инструкции avx2

/QaxCORE-AVX2, /QxCORE-AVX2

Но когда я запускаю программу, я получаю сообщение об ошибке:

Fatal Error: This program was not built to run in your system. Please verify that both the operating system and the processor support Intel(R) AVX2, BMI, LZCNT, HLE, RTM, and FMA instructions.

Я бегу тест поддержки процессора AVX2, которая дана на странице: How to detect new instruction support in the 4th generation Intel Core processor family. Результат:

This CPU supports ISA extensions introduced in Haswell.

Как я могу проверить, что моя операционная система поддержки AVX2-расширения и что может быть причиной ошибки? Для использования расширений avx2 мне нужно установить как /QaxCORE-AVX2, так и /QxCORE-AVX2 флаги?

обн: если я установить флаг

/QxAVX 

, что программа была успешно запущена.

+0

Возможно XSAVE отключена. Я не уверен, как включить его, но это, вероятно, конфигурация загрузки. – Mysticial

+0

@Mysticial я создаю простой проект win32 с функцией IsProcessorFeaturePresent (PF_XSAVE_ENABLED). Эта функция возвращает True. –

+0

проверка когда? Во время компиляции? Во время выполнения? В любом случае, это больше похоже на проблему, связанную с рынком, например, 2955U - это Celeron, формально основанная на архитектуре Haswell, но она даже не предлагает первое поколение AVX. – user2485710

ответ

4

Если вы хотите проверить для поддержки определенного набора регистров вы в основном есть 2 варианта:

  • сборки с расширениями CPUID
  • встроенные функции (если), предоставляемые компилятором

письменная сборка, которая определяет, какие наборы регистров поддерживаются, является утомительной, долгой и потенциально подверженной ошибкам задачей, не говоря уже о том, что сборка не переносима в разных ОС, разных SoC и разных ABI, также существует бремя CPUid инструкции, которые не всегда реализуются с одинаковым шаблоном во всех ЦП, существуют разные способы достижения одного и того же бита информации с разными поставщиками или даже с разными семействами процессоров от одного и того же поставщика; но у этого есть одно большое преимущество, это ничем не ограничено, если вам действительно нужно знать что-либо о вашем процессоре/SoC, сборка + связанный с CPUid материал - это путь.

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

Использование gcc, проверка на AVX2 так же просто, как написание

... 
if(__builtin_cpu_supports("avx2")) 
{ 
    ... 
} 
... 

документы: http://gcc.gnu.org/onlinedocs/gcc/X86-Built-in-Functions.html

для Visual Studio/MSVC есть встроенные функции, такие как __cpuid и __cpuidex, которые можно использовать для извлечения то же самое, здесь это ссылка с полным и рабочим примером.

документы: http://msdn.microsoft.com/en-us/library/hskdteyh.aspx

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