Symptomer

Når du bygger et program ved hjelp av Microsoft Visual C++ 2013, krasjer programmet og du får en "Ulovlig instruksjon" unntak. Dette skjer fordi biblioteket noen flyttall matematiske funksjoner i Visual C++ 2013 x64 C Runtime (CRT) riktig ikke kontrollerer om bestemte instruksjoner for AVX og FMA3 er tilgjengelige før funksjonene prøver å bruke dem. Hvis instruksjonene ikke er tilgjengelige for bruk, føre samtaler til disse funksjonene til et ulovlig instruksjon unntak (0xc000001d). Berørte funksjoner inkluderer Logg log10, og pow og andre.

Dette problemet er mest sannsynlig vil forekomme i følgende scenarier:

  • På en gammel versjon av Windows-operativsystemet som ikke støtter AVX state lagring (for eksempel Windows Vista) Hvis den brukes på en datamaskin som støtter AVX-instruksjonssett

  • Hvis AVX tilstand lagring deaktiveres eksplisitt i oppstartskonfigurasjonen for operativsystemet

  • I Windows forhåndsinstallasjonsmiljø Environment (Windows PE)

    Obs! Windows PE støtter ikke lagring av AVX-tilstand.


Dette problemet er rapportert på Microsoft Connect:

x64 log()-funksjonen bruker vpsrlq AVX-instruksjon uten hensyn til operativsystemet (slik at den krasjer på Vista x64)

Visual Studio 2013 RTM: C++ x64 kode generasjon feil for AVX2 instruksjoner

Årsak

Dette problemet oppstår fordi kjøretidsfilen for Visual C++-2013 x64 C ikke kontrollerer om operativsystemet støtter AVX lagre tilstanden før den prøver å kjøre AVX eller FMA3 instruksjoner.

Oppløsning

Hvis alle berørte C++-binærfilene som er bygget ved hjelp av Visual C++-2013 bruker C Runtime dll-filen (msvcr120.dll), installerer du den oppdaterte Microsoft Visual C++ 2013 Redistributable – 12.0.40660.0 eller en senere versjon.

Hvis de berørte binærfilene for C++ statisk koblet Visual C++ 2013 C Runtime, må du oppdatere installasjonen av Visual Studio-2013 ved å installere hurtigreparasjonen 3174417 og gjenoppbygging og redistribuering av de berørte binærfilene.









Obs! Dette problemet påvirker ikke eldre versjoner av Visual C++ C Runtime (Visual C++-2012 og tidligere versjoner). Problemet ble løst før den første versjonen av Universal CRT som brukes av Visual C++-2015.

Microsoft Download Center

Hvis du vil oppdatere den koblede statisk Visual C++ 2013 C Runtime, 3174417 hurtigreparasjonen er gitt ut som en bare laste ned oppdateringen og ikke er distribuert via Windows Update. Den er tilgjengelig på webområdet for Microsoft Download Center:

Download Last ned nå.

Oppdatere det dynamisk koblet Visual C++ 2013 C Runtime DLLer, en oppdatert redistributable er tilgjengelig. Hvis du vil ha mer informasjon, kan du se følgende artikkel i Microsoft Knowledge Base:

3179560 oppdatering for 2013 for Visual C++ og Visual C++-pakken

Løsningen

Du kan omgå dette problemet ved å deaktivere FMA3 i matematikkbiblioteket Hvis du berøres av dette problemet. Du kan spørre om systemet støtter AVX instruksjoner ved å kalle GetEnabledXStateFeatures og å deaktivere AVX i CRT eksplisitt ved å kalle _set_FMA3_enable(0).

Hvis du vil ha mer informasjon, kan du se arbeide med kontekst for XStatepå MSDN-webområdet.

Funksjonen _set_FMA3_enable(0) er deklarert i < math.h >, og det er bare tilgjengelig når du bygger for x64. (Dette problemet påvirker bare x64 biblioteker.) Dette gjør at matematikkbiblioteket gå tilbake til å bruke ikke-FMA3-implementeringer.

Trenger du mer hjelp?

Utvid ferdighetene dine
Utforsk opplæring
Vær først ute med de nye funksjonene
Bli med i Microsoft Insiders

Var denne informasjonen nyttig?

Hvor fornøyd er du med språkkvaliteten?
Hva påvirket opplevelsen din?

Takk for tilbakemeldingen!

×