Sintomas
Quando você cria um programa usando o Microsoft Visual C++ 2013, o programa falha e você recebe uma exceção "Instrução ilegal". Isso ocorre porque algumas funções da biblioteca de matemática de ponto flutuante em tempo de execução do Visual C++ 2013 x64 C (CRT) não corretamente verificar se determinadas instruções AVX e FMA3 estão disponíveis antes que as funções de tentam usá-los. Se as instruções não estão disponíveis para uso, chamadas para essas funções causam uma exceção de instrução ilegal (0xc000001d). Funções afetadas incluem o registro, log10 e pow e outros.
Esse problema é mais provável de ocorrer nas seguintes situações:
-
Em uma versão antiga do sistema operacional Windows que não dá suporte a AVX estado salvar (por exemplo, o Windows Vista) se ele é usado em um computador que suporta o conjunto de instruções AVX
-
Se a gravação de estado AVX explicitamente está desabilitada na configuração de inicialização do sistema operacional
-
No ambiente de pré-instalação do Windows (Windows PE)
Observação: O Windows PE não dá suporte à economia de estado AVX.
Esse problema foi relatado no Microsoft Connect:
x64 log() função usa instruções de AVX vpsrlq independentemente do sistema operacional (de modo que ele falha no Vista x64)
Visual Studio 2013 RTM: Erro de geração de instruções de AVX2 de código C++ x64
Causa
Esse problema ocorre porque o tempo de execução do Visual C++ 2013 x64 C não verifica se o sistema operacional suporta AVX estado salvar antes de tentar executar instruções AVX ou FMA3.
Resolução
Se todos os binários afetados do C++ são criados usando o Visual C++ 2013 usam a DLL de tempo de execução do C (msvcr120.dll), instale a atualização Microsoft Visual C++ 2013 redistribuível – 12.0.40660.0 ou uma versão posterior.
Se os binários afetados do C++ estaticamente vinculam o Visual C++ 2013 C Runtime, você deve atualizar a sua instalação do Visual Studio 2013 instalar o hotfix 3174417 e recriar e reimplantar os binários afetados.
Observação: Esse problema não afeta as versões anteriores do Visual C++ C Runtime (Visual C++ 2012 e versões anteriores). O problema foi corrigido antes do lançamento inicial do CRT Universal que é usado pelo Visual C++ 2015.
Centro de Download da Microsoft
Para atualizar o Visual C++ 2013 C Runtime vinculadas estaticamente, o hotfix 3174417 é lançado como uma atualização somente para download e não é distribuído através do Windows Update. Ela está disponível no site Microsoft Download Center:
Baixe o pacote agora.
Atualizar dinamicamente vinculado Visual C++ 2013 C Runtime DLLs, um atualizado redistribuível está disponível. Para obter mais informações, consulte o seguinte artigo da Base de Conhecimento Microsoft:
Atualização 3179560 para 2013 do Visual C++ e o pacote redistribuível do Visual C++
Solução alternativa
Para contornar esse problema, desative FMA3 na biblioteca de matemática se você tiver sido afetado por esse problema. Você pode consultar se o sistema suporta instruções AVX chamando GetEnabledXStateFeatures e desativar AVX no CRT explicitamente chamando _set_FMA3_enable(0).
Para obter mais informações, consulte Trabalhando com contexto de XStateno site do MSDN.
A função _set_FMA3_enable(0) foi declarado em < math.h > e está disponível somente quando você construir para x64. (Este bibliotecas de afeta apenas o x64 de problema). Isso faz com que a biblioteca de matemática voltar a usar as implementações não FMA3.