Sintomi
Quando si compila un programma utilizzando Microsoft Visual C++ 2013, il programma si blocca e si riceve un'eccezione di "Istruzione non valida". Ciò si verifica perché alcune funzioni di libreria matematica a virgola mobile di runtime di Visual C++ 2013 x64 C (CRT) non controlla correttamente se determinate istruzioni AVX e FMA3 sono disponibili prima che le funzioni tentano di utilizzarli. Se le istruzioni non sono disponibili per l'utilizzo, chiamate a queste funzioni causano un'istruzione non valida (0xc000001d). Funzioni interessate includono log, log10 e pow e altri.
Questo problema è più probabile si verifichi nei seguenti scenari:
-
In una versione precedente del sistema operativo Windows che non supporta AVX stato salvataggio (ad esempio, Windows Vista) se viene utilizzato in un computer che supporta il set di istruzioni AVX
-
Se il salvataggio dello stato di AVX è disabilitato in modo esplicito nella configurazione di avvio del sistema operativo
-
Nell'ambiente di preinstallazione di Windows (Windows PE)
Nota: Windows PE non supporta il salvataggio dello stato di AVX.
Questo problema è stato riscontrato su Microsoft Connect:
x64 funzione log () utilizza istruzioni AVX vpsrlq indipendentemente dal sistema operativo (si blocca in Vista x64)
Visual Studio 2013 RTM: Errore di generazione per AVX2 istruzioni di codice C++ x64
Causa
Questo problema si verifica perché il Runtime di Visual C++ 2013 x64 C verifica se il sistema operativo supporta il salvataggio dello stato AVX prima di tentare di eseguire istruzioni AVX o FMA3.
Risoluzione
Se tutti i binari C++ interessati che vengono compilati utilizzando Visual C++ 2013 utilizzano la DLL di Runtime C (msvcr120.dll), installare aggiornamento Microsoft Visual C++ 2013 Redistributable – 12.0.40660.0 o versione successiva.
Se i file binari C++ interessati collegano statico il Runtime di Visual C++ 2013 C, è necessario aggiornare l'installazione di Visual Studio 2013 installazione dell'hotfix 3174417 e ricompilare e ridistribuire i file binari interessati.
Nota: Questo problema non riguarda le versioni precedenti della C Runtime di Visual C++ (Visual C++ 2012 e versioni precedenti). Il problema è stato risolto prima del rilascio iniziale di CRT universale utilizzato da Visual C++ 2015.
Area Download Microsoft
Per aggiornare il Runtime di C collegata staticamente di Visual C++ 2013, l'hotfix 3174417 è stato rilasciato come un aggiornamento di solo download e non viene distribuito tramite Windows Update. È disponibile presso il sito Web Microsoft Download Center:
Download del pacchetto.
Per aggiornare dinamicamente collegato DLL di Visual C++ 2013 C Runtime, una versione aggiornata ridistribuibile è disponibile. Per ulteriori informazioni, vedere il seguente articolo della Microsoft Knowledge Base:
Aggiornamento 3179560 per 2013 di Visual C++ e Visual C++ Redistributable Package
Soluzione alternativa
Per risolvere questo problema, disattivare FMA3 nella libreria math se è interessati da questo problema. È possibile eseguire una query se il sistema supporta istruzioni AVX chiamando GetEnabledXStateFeatures e la disattivazione di AVX in CRT in modo esplicito chiamando _set_FMA3_enable(0).
Per ulteriori informazioni, vedere utilizzo di contesto XStatesul sito Web MSDN.
La funzione _set_FMA3_enable(0) viene dichiarato in < Math > ed è disponibile solo quando si compila per x64. (Questo problema interessa solo la x64 le librerie.) In questo modo la libreria math per tornare a utilizzare le implementazioni non-FMA3.