現象
Microsoft Visual C++ 2013 を使用してプログラムをビルドすると、プログラムがクラッシュして"無効な命令例外が表示されます。これは、2013 x64 C の Visual C++ ランタイム (CRT) の一部の浮動小数点数値演算ライブラリ関数は適切にチェックするかどうか特定 AVX と FMA3 手順については、関数を使用しようとする前にために発生します。指示が使用可能でない場合は、これらの関数への呼び出しが発生する無効な命令例外 (0xc000001d)。ログ、log10、pow、および他のユーザーに影響を受ける関数が含まれます。
この問題は、次のシナリオで発生する可能性があります。
-
AVX がサポートされていない Windows オペレーティング システムの以前のバージョンの状態 (Windows Vista の場合など) の保存 AVX 命令セットをサポートするコンピューター上で使用するかどうか
-
AVX の状態の保存は、オペレーティング システムのブート構成で明示的に無効にする場合
-
Windows プレインストール環境 (Windows PE) で
注: Windows PE には、AVX の状態の保存をサポートしていません。
Microsoft Connect には、この問題を報告されています。
x64 を持つ log() 関数はオペレーティング システムとは無関係に AVX 命令を vpsrlq を使用する (ため、Vista x64 でクラッシュした)
Visual Studio 2013年の RTM: x64 の C++ コード生成のバグ AVX2 について
原因
2013 x64 C の Visual C++ ランタイムでは、オペレーティング システムが AVX または FMA3 命令を実行しようとする前に、AVX の状態保存をサポートしているかどうかはチェックしませんので、この問題が発生します。
解決策
Visual C++ 2013 を使用して組み込まれているすべての影響を受ける C++ バイナリは、C ランタイムの DLL (msvcr120.dll) を使用している場合、更新された Microsoft Visual C++ 2013 再頒布可能 – 12.0.40660.0 またはそれ以降のバージョンをインストールします。
影響を受ける、C++ のバイナリ ファイルは、Visual C++ 2013 C ランタイムを静的にリンクを 3174417 の修正プログラムをインストールし、再構築して影響を受けるバイナリを再配置して、Visual Studio の 2013 のインストールを更新しなければなりません。
注: この問題は、以前のバージョンの Visual C++ C ランタイム (Visual C++ 2012 と以前のバージョン) には影響しません。Visual C++ 2015 によって使用されるユニバーサル CRT の最初のリリースの前に、問題が修正されました。
Microsoft ダウンロード センター
静的にリンクされている Visual C++ 2013 C ランタイムを更新するには、3174417 の修正プログラムは、ダウンロードのみの更新プログラムとしてリリースし、Windows Update 経由で配布されていません。Microsoft ダウンロード センター web サイトで使用可能になります。
パッケージを今すぐダウンロードします。
動的にリンクされている Visual C++ 2013 C ランタイムの Dll、更新済みの更新を再頒布可能があります。詳細については、次のマイクロソフト サポート技術情報資料を参照してください。
回避策
この問題を回避するには、この問題が発生した場合、数値演算ライブラリの FMA3 を無効にします。GetEnabledXStateFeaturesを呼び出すと、明示的に_set_FMA3_enable(0)を呼び出すことによって、CRT の AVX を無効にするシステムが AVX 命令をサポートするかどうかを照会することができます。
詳細については、MSDN web サイトのコンテキストの XState の操作を参照してください。
関数_set_FMA3_enable(0)は、< math.h > で宣言されているし、は x64 用のビルド時にのみ使用します。(この問題、x64 のみに影響を及ぼすライブラリです。)これにより、FMA3 ではない実装を使用してに戻すには数値演算ライブラリです。