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 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.

Serve aiuto?

Amplia le tue competenze
Esplora i corsi di formazione
Ottieni in anticipo le nuove caratteristiche
Partecipa a Microsoft Insider

Queste informazioni sono risultate utili?

Come valuti la qualità della lingua?
Cosa ha influito sulla tua esperienza?

Grazie per il feedback!

×