2014-10-09 3 views
1

У меня есть программа для Windows x64 C++, которая скомпилирована MSVC 12 без поддержки AVX (нет/arch: AVX в вариантах компиляции).Нелегальная инструкция по AVX с Intel Core i7

И у меня есть отчет о сбоях от одного клиента с Core i7 4700MQ на Win7. Код исключения - c000001d (незаконная команда), а смещение исключений указывает на команду «vmovd r9, xmm0» внутри функции sin(). Я пробовал две разные сборки с этим пользователем, и в обоих случаях он указывает на эту же инструкцию.

Похоже, что библиотечная версия библиотеки msvc имеет встроенный код AVX, даже если скомпилирован без поддержки AVX. И этот код отлично работает на более старых процессорах i3, у которых не было AVX.

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

Возможно, AVX может быть каким-то образом отключен в настройках ОС/BIOS и код sin() не могут это проверить? Или, может быть, было некоторое обновление ОС, которое добавило поддержку AVX, и без него какие-либо триггеры кода AVX c000001d?

+2

Может быть, связанные с: https://connect.microsoft.com/VisualStudio/Feedback/Details/987093, https://connect.microsoft.com/VisualStudio/Feedback/Details/981479 – Mysticial

+0

Но 4700MQ * делает * поддерживает AVX, правильно? – harold

+1

@ Мистическое да, ОС была причиной. Этот пользователь запускал версию Win7 до SP1, а поддержка AVX была добавлена ​​только в SP1. Как-то я думал, что MSVC 12 делает код совместимым с Vista. Но выглядит как min spec - Win7 SP1. –

ответ

0

Если это код в динамически связанной библиотеке, то параметры компиляции для вашего кода не имеют большого значения. DLL могла бы делать отправку в разные реализации на основе возвращаемого значения cpuid, чтобы определить, доступен ли avx, и вернуться в версию sse, если нет.

vmovd г9, XMM0

выглядит как юридическое обучение на Corei7 мне.

http://www.felixcloutier.com/x86/MOVD:MOVQ.html

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

  • Нет связанных вопросов^_^