これを既に読んでいるquestion浮動小数点の算術演算を同じ入力(同じハードウェア上で、同じコンパイラでコンパイル)で使用する特定のプロセスは、決定論的。私は、これが真実ではない場合を見て、これを引き起こした原因を特定しようとしています。確定的なプロセスで浮動小数点エラーが発生する原因
私は実行可能ファイルをコンパイルしましたが、同じマシン上で(マルチスレッドではなく)実行されている同じデータを供給していますが、私が見つけた慎重なグーグルで約3.814697265625e-06のエラーが出ます実際には1/4^9 = 1/2^18 = 1/262144に等しい。これは32ビットの浮動小数点数の精度レベル(ウィキペディアによると約7桁)にかなり近いです。
疑問は、コードに適用された最適化と関係があることです。私はintel C++コンパイラを使用しており、浮動小数点投機を安全または厳密ではなく高速にしています。これは浮動小数点プロセスを非決定論的にすることができますか?この動作につながる可能性のある他の最適化などはありますか?
EDIT:Paxの提案によれば、私は浮動小数点の投機を安全に変えたコードを再コンパイルしました。私は現在安定した結果を得ています。浮動小数点スペキュレーションが実際に何をするのか、同じバイナリ(つまり、あるコンパイル、複数の実行)がまったく同じ入力に適用されたときに、どのように異なる結果を生み出すことができるのでしょうか?
@Ben私はIntel(R)C++ 11.0.061 [IA-32]を使用してコンパイルしていますが、Intelのクアッドコアプロセッサで動作しています。
プロセッサプロセッサとコンパイラは何ですか? .. please – Ben
どのフラグが原因であるのかわかったら、コンパイラのドキュメントをチェックするだけではどうですか? –
@Tal - 私はドキュメントから何かを見つけるのが難しいです(それは速いとfpsを可能にし、安全/厳格にはそれを無効にすると言うだけです)。私はそれを理解することができますが、fpsは操作の並べ替えを可能にしますが(a * c + b * c => c *(a + b))、これらはコンパイル時の最適化であり、結果のバイナリは依然として確定的でなければならず、なぜそうでないのかを正確に知ること。 –