Проблема
При сборке программы с помощью Microsoft Visual C++ 2013 г. программа завершается сбоем, и вы получите исключение "Неправовая инструкция". Это происходит из-за того, что некоторые функции математической библиотеки с плавающей запятой в visual C++ 2013 x64 C Runtime (CRT) неправильно проверка, доступны ли определенные инструкции AVX и FMA3, прежде чем функции попытаются их использовать. Если инструкции недоступны для использования, вызовы этих функций вызывают недопустимое исключение инструкций (0xc000001d). Затронутые функции включают log, log10, pow и другие.
Эта проблема, скорее всего, возникает в следующих сценариях:
В старой версии операционной системы Windows, которая не поддерживает сохранение состояния AVX (например, Windows Vista), если она используется на компьютере, поддерживающем набор инструкций AVX
Если сохранение состояния AVX явно отключено в конфигурации загрузки операционной системы
В среде предустановки Windows (Windows PE)
Примечание. Среда предустановки Windows не поддерживает сохранение состояния AVX.
Эта проблема была зарегистрирована в Microsoft Connect:
Функция x64 log() использует инструкцию vpsrlq AVX без учета операционной системы (поэтому она завершает работу в Vista x64)
Visual Studio 2013 RTM: ошибка создания кода C++ x64 для инструкций AVX2
Причина
Эта проблема возникает из-за того, что среда выполнения Visual C++ 2013 x64 не проверка, поддерживает ли операционная система сохранение состояния AVX перед выполнением инструкций AVX или FMA3.
Решение
Если все затронутые двоичные файлы C++, созданные с помощью Visual C++ 2013, используют библиотеку DLL среды выполнения C (msvcr120.dll), установите обновленный распространяемый Microsoft Visual C++ 2013 — 12.0.40660.0 или более поздней версии.
Если затронутые двоичные файлы C++ статически связывают среду выполнения C Visual C++ 2013, необходимо обновить установку Visual Studio 2013, установив исправление 3174417, а также перестроив и повторно развернув затронутые двоичные файлы.
Примечание. Эта проблема не влияет на более старые версии среды выполнения C Visual C++ (Visual C++ 2012 и более ранние версии). Проблема была исправлена до первоначального выпуска универсального CRT, используемого в Visual C++ 2015.
Центр загрузки Майкрософт
Чтобы обновить статическую связанную среду выполнения Visual C++ 2013, исправление 3174417 выпускается только для скачивания и не распространяется через клиентский компонент Центра обновления Windows. Он доступен на веб-сайте Центра загрузки Майкрософт:
Чтобы обновить динамически связанные библиотеки DLL среды выполнения C в Visual C++ 2013, доступен обновленный распространяемый объект. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
обновление 3179560 для Visual C++ 2013 и пакета Распространяемый компонент Visual C++
Временное решение
Чтобы обойти эту проблему, отключите FMA3 в математической библиотеке, если эта проблема затрагивает вас. Вы можете запросить, поддерживает ли система инструкции AVX, вызвав Метод GetEnabledXStateFeatures и отключив AVX в CRT явным образом, вызвав _set_FMA3_enable(0).
Дополнительные сведения см. в статье Работа с контекстом XState на веб-сайте MSDN.
Функция _set_FMA3_enable(0) объявлена в <math.h> и доступна только при сборке для x64. (Эта проблема затрагивает только библиотеки x64.) Это приводит к тому, что математическая библиотека отменить изменения к использованию реализаций, отличных от FMA3.