Objawy
Gdy podczas tworzenia programu za pomocą programu Microsoft Visual C++ 2013 awarii programu i otrzymujesz wyjątek "Niedozwolonej instrukcji". Dzieje się tak, ponieważ niektóre funkcje biblioteki matematyczne na liczbach zmiennoprzecinkowych w programie Visual C++ 2013 x64 C Runtime (CRT) prawidłowo sprawdza, czy określone instrukcje AVX i FMA3 są dostępne, zanim spróbujesz użyć ich funkcje. Jeśli instrukcje nie są dostępne do użytku, wywołania tych funkcji powoduje wyjątek niedozwolonej instrukcji (0xc000001d). Dotkniętych funkcje obejmują dziennika, log10, a pow i inne.
Ten problem jest najbardziej prawdopodobne w następujących scenariuszach:-
W starej wersji systemu operacyjnego Windows, który nie obsługuje AVX Państwo zapisanie (na przykład Windows Vista) Jeśli jest używany na komputerze, który obsługuje zestaw instrukcji AVX
-
Jeśli zapisywanie stanu AVX jest jawnie wyłączone w konfiguracji rozruchu systemu operacyjnego
-
W środowisku preinstalacji systemu Windows (Windows PE)
Uwaga Środowisko Preinstalacyjne systemu Windows nie obsługuje zapisywanie stanu AVX.
Ten problem został wcześniej zgłoszony w witrynie Microsoft Connect:
x64 funkcja log () używa instrukcji AVX vpsrlq, bez względu na system operacyjny (tak aby uległa awarii w systemie Vista x64) Visual Studio 2013 RTM: Błąd generacji AVX2 instrukcje kodu C++ x64
Przyczyna
Ten problem występuje, ponieważ środowisko wykonawcze Visual C++ 2013 x64 C nie sprawdza, czy system operacyjny obsługuje zapisywanie Państwo AVX przed ponowną próbą uruchomienia instrukcji AVX lub FMA3.
Rozwiązanie
Wszystkich dotkniętych plików binarnych C++, które są zbudowane przy użyciu programu Visual C++ 2013 użyć DLL C Runtime (msvcr120.dll), należy zainstalować zaktualizowane Microsoft Visual C++ 2013 Redistributable – 12.0.40660.0 lub nowszej wersji.
Jeśli dotyczy plików binarnych C++ statycznie Visual C++ 2013 C Runtime, należy zaktualizować instalacji programu Visual Studio 2013 przez zainstalowanie poprawki 3174417 i odbudowa i ponownego wdrożenia dotyczy plików binarnych. Uwaga Ten problem nie wpływa na starsze wersje Visual C++ C Runtime (Visual C++ 2012 i wcześniejszych wersjach). Ten problem został rozwiązany przed wydaniem wstępnym uniwersalny CRT, który jest używany przez program Visual C++ 2015.Centrum pobierania firmy Microsoft
Aby zaktualizować statycznie Visual C++ 2013 C Runtime, 3174417 poprawka jest wydawane w formie tylko do pobierania aktualizacji i nie jest dystrybuowane za pośrednictwem witryny Windows Update. Jest on dostępny w witrynie sieci Web Microsoft Download Center:Pobierz teraz pakiet. Aby zaktualizować połączony dynamicznie DLL Visual C++ 2013 C Runtime, zaktualizowany pakiet redystrybucyjny jest dostępna. Aby uzyskać więcej informacji zobacz następujący artykuł z bazy wiedzy Microsoft Knowledge Base:
3179560 aktualizacji dla Visual C++ 2013 i pakiet redystrybucyjny programu Visual C++
Obejście problemu
Aby obejść ten problem, należy wyłączyć FMA3 w biblioteka funkcji matematycznych, jeśli jest narażony na ten problem. Można zbadać, czy system obsługuje instrukcje AVX przez wywołanie GetEnabledXStateFeatures i wyłączanie AVX w CRT jawnie przez wywołanie _set_FMA3_enable(0).Praca z kontekstem XStatew witrynie MSDN. Funkcja _set_FMA3_enable(0) jest zadeklarowany w < math.h >, i jest dostępna tylko wtedy, gdy tworzysz aplikacje na x64. (Ten problem dotyczy tylko x64 bibliotekami.) Powoduje to, że biblioteka funkcji matematycznych przywrócić przy użyciu implementacji non-FMA3.
Aby uzyskać więcej informacji zobacz