Příznaky
Při vytváření aplikace pomocí Microsoft Visual C++ 2013, dojde k chybě programu a obdržíte výjimku "Neplatná instrukce". K tomu dochází, protože některé funkce knihovny matematiku s plovoucí desetinnou čárkou v aplikaci Visual C++ 2013 x64 C Runtime (CRT) nesprávně kontroluje zda jsou k dispozici některé instrukce AVX a FMA3, před jejich použití funkce. Pokud pokyny nejsou k dispozici, volání těchto funkcí způsobit výjimku Neplatná instrukce (0xc000001d). Ovlivněné funkce obsahují protokol, log10 a pow a další.
Tento problém je pravděpodobně dojít v následujících situacích:
-
Na starší verze operačního systému Windows, který nepodporuje AVX stavu ukládání (například systém Windows Vista) Pokud se používá v počítači, který podporuje instrukční sadu AVX
-
Pokud v konfiguraci spouštění operačního systému je výslovně zakázáno ukládání stavu AVX
-
V prostředí předinstalace systému Windows (Windows PE)
Poznámka: Prostředí Windows PE nepodporuje ukládání stavu AVX.
Tento problém je hlášeno na webu Microsoft Connect:
x64 funkce log() používá instrukce AVX vpsrlq bez ohledu na operační systém (takže se zhroutí na Vista x64)
Visual Studio 2013 RTM: C++ x64 kód chyby generování pokyny AVX2
Příčina
K tomuto problému dochází, protože modul Runtime Visual C++ 2013 x64 C nekontroluje, zda operační systém podporuje ukládání stavu AVX, před pokusem o spuštění pokyny AVX nebo FMA3.
Řešení
Pokud všech příslušných binárních souborů C++, které jsou vytvořeny pomocí Visual C++ 2013 použít knihovny DLL C Runtime (msvcr120.dll), nainstalujte aktualizovaný Microsoft Visual C++ 2013 Redistributable – 12.0.40660.0 nebo novější.
Pokud vaše příslušných binárních souborů C++ staticky propojíte Visual C++ 2013 C Runtime, je nutné aktualizovat instalace sady Visual Studio 2013 instalací opravy hotfix 3174417 a opětovné sestavení a opětovného nasazení příslušných binárních souborů.
Poznámka: Tento problém nemá vliv na starší verze Visual C Runtime C++ (Visual C++ 2012 a starší). Problém byl opraven před počáteční verze Universal CRT, který používá Visual C++ 2015.
Microsoft Download Center
3174417 opravy hotfix k aktualizaci staticky propojené aplikace Visual C++ 2013 C Runtime, je vydána jako pouze ke stažení aktualizace a není distribuována prostřednictvím služby Windows Update. Je k dispozici na webu Microsoft Download Center:
Stáhněte balíček.
Chcete-li aktualizovat dynamicky propojené Visual C++ 2013 C Runtime knihoven DLL, aktualizace redistributable je k dispozici. Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
3179560 aktualizace pro aplikaci Visual C++ 2013 a Visual C++ Redistributable Package
Jak potíže obejít
Chcete-li tento problém vyřešit, zakažte FMA3 v math library, pokud jsou ovlivněny tento problém. Může se dotázat, zda systém podporuje instrukce AVX voláním GetEnabledXStateFeatures a zákaz AVX v CRT explicitně voláním _set_FMA3_enable(0).
Další informace naleznete v tématu práce s XState kontextna webu MSDN.
Funkce _set_FMA3_enable(0) je deklarován v < math.h > a je k dispozici pouze v případě, že sestavení pro x64. (Tento problém ovlivňuje pouze x64 knihoven.) To způsobí, že math library vrátit pomocí jiných FMA3 implementace.