Gejala
Ketika Anda membangun program dengan menggunakan Microsoft Visual C++ 2013, program macet dan Anda menerima pengecualian "Ilegal instruksi". Hal ini terjadi karena beberapa fungsi pustaka floating-point matematika di Runtime Visual C++ 2013 x64 C (CRT) tidak benar memeriksa apakah instruksi AVX dan FMA3 tertentu tersedia sebelum fungsi mencoba menggunakannya. Jika petunjuk tidak tersedia untuk digunakan, panggilan ke fungsi-fungsi ini menyebabkan pengecualian ilegal instruksi (0xc000001d). Fungsi terpengaruh termasuk log, log10, dan pow, dan lain-lain.
Masalah ini kemungkinan besar terjadi dalam skenario berikut:-
Pada versi lama dari sistem operasi Windows yang tidak mendukung AVX menyatakan menyimpan (misalnya, Windows Vista) jika digunakan di komputer yang mendukung set instruksi AVX
-
Jika menyimpan status AVX dinonaktifkan secara eksplisit di konfigurasi boot sistem operasi
-
Di lingkungan prainstal Windows (Windows PE)
Catatan Windows PE tidak mendukung AVX status penyimpanan.
Masalah ini telah dilaporkan pada Microsoft Connect:
x64 log() fungsi menggunakan instruksi AVX vpsrlq tanpa sistem operasi (sehingga lumpuh di Vista x64) Visual Studio 2013 RTM: C++ x64 kode generasi bug untuk petunjuk AVX2
Penyebab
Masalah ini terjadi karena Runtime Visual C++ 2013 x64 C tidak memeriksa apakah sistem operasi mendukung AVX status menyimpan sebelum mencoba untuk menjalankan instruksi AVX atau FMA3.
Pemecahan masalah
Jika semua terpengaruh C++ biner yang dibuat dengan menggunakan Visual C++ 2013 menggunakan DLL waktu jalan C (msvcr120.dll), instal pemutakhiran Microsoft Visual C++ 2013 Redistributable-12.0.40660.0 atau versi yang lebih baru.
Jika Anda terkena C++ biner statis link Visual C++ 2013 C Runtime, Anda harus memperbarui pemasangan Visual Studio 2013 dengan menginstal 3174417 hotfix dan membangun kembali dan redeploying biner yang terpengaruh. Catatan Masalah ini tidak mempengaruhi versi Visual C++ C Runtime (Visual C++ 2012 dan versi yang lebih lawas). Masalah telah diperbaiki sebelum peluncuran awal CRT Universal yang digunakan oleh Visual C++ 2015.Pusat Unduh Microsoft
Untuk memperbarui statis tertaut Visual C++ 2013 C Runtime, 3174417 hotfix diluncurkan sebagai pemutakhiran hanya download dan tidak didistribusikan melalui Pemutakhiran Windows. Hal ini tersedia di situs web Microsoft Download Center:Unduh paket sekarang. Untuk memperbarui terkait secara dinamis Visual C++ 2013 C Runtime dll, diperbarui redistributable tersedia. Untuk informasi selengkapnya, lihat artikel Basis Pengetahuan Microsoft berikut ini:
3179560 pemutakhiran untuk Visual C++ 2013 dan Visual C++ Redistributable Package
Pemecahan masalah
Untuk mengatasi masalah ini, Nonaktifkan FMA3 di Perpustakaan matematika jika Anda terpengaruh oleh masalah ini. Anda dapat meminta Apakah sistem mendukung instruksi AVX dengan menelepon GetEnabledXStateFeatures dan menonaktifkan AVX di CRT eksplisit dengan menelepon _set_FMA3_enable(0).bekerja dengan konteks XStatedi MSDN website. Function _set_FMA3_enable(0) dinyatakan di < math.h >, dan tersedia hanya ketika Anda membangun untuk x64. (Ini masalah mempengaruhi hanya x64 Perpustakaan.) Hal ini menyebabkan Perpustakaan matematika untuk kembali untuk menggunakan penerapan non-FMA3.
Untuk informasi selengkapnya, lihat