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:Download 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).Aby uzyskać więcej informacji zobacz 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.

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.

Społeczności pomagają zadawać i odpowiadać na pytania, przekazywać opinie i słuchać ekspertów z bogatą wiedzą.