Незаконная инструкция по AVX с Intel Core i7

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

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

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

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

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


person Ryhor Spivak    schedule 09.10.2014    source источник
comment
Может быть связано: connect.microsoft.com/VisualStudio/Feedback/Details/987093 , connect.microsoft.com/VisualStudio/Feedback/Details/981479   -  person Mysticial    schedule 09.10.2014
comment
Но 4700MQ поддерживает AVX, верно?   -  person harold    schedule 09.10.2014
comment
@ Mysticial да, ОС была причиной. У этого пользователя была версия Win7 до SP1, а поддержка AVX была добавлена ​​только в SP1. Почему-то я подумал, что MSVC 12 делает код совместимым с Vista. Но похоже, что минимальная спецификация - Win7 SP1.   -  person Ryhor Spivak    schedule 10.10.2014
comment
Вторая ссылка Mysticial, однако, использует Win7 SP1 и имеет аналогичную проблему.   -  person Z boson    schedule 10.10.2014


Ответы (1)


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

vmovd r9,xmm0

выглядит как юридическая инструкция для corei7 для меня.

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

person Hal    schedule 10.10.2014