1

私は現在、C++ および C# で記述された (レガシー) プログラムに取り組んでいます。いくつかの重い計算を実行しますが、完全に決定論的である必要があります。つまり、同じ入力でも同じ出力が得られます... 問題は、(同じコンピューター上で、同じコンパイル済み実行可能ファイルを使用して) 2 回実行すると、わずかに異なる出力が生成されることです。

アプリケーションは、SQL サーバー データベースに対して読み取りと書き込みを行います (DB への一意のアクセス権があるため、DB の値に干渉するものは他にありません)。

実行間の唯一の明らかな違いは、それぞれに一意の名前 (単なる文字列変数) が割り当てられていることです。

コード内にランダムなオブジェクトはなく、すべてのループは、事前に決められた反復回数、または条件が満たされるまで実行され、一定時間実行されません。少量のマルチスレッドがあります。これはスレッドセーフであると確信していますが、自分で確認します。

この逸脱した動作の原因となる、私が探すべき明らかなものは他にありますか?

4

4 に答える 4

2

2 つのアイデアが思い浮かびます。

  • 初期化されていない変数。
  • 浮動小数点演算は結合的ではありません。

後者の点は、マルチスレッドでマシンの精度レベルに差が生じる可能性があります。ただし、初期化されていない変数である可能性がはるかに高くなります!

于 2011-04-21T16:52:34.573 に答える
1

いくつかの考えられる原因が考えられます:

  • 浮動小数点演算は、32 ビット版ではわずかに異なる結果になる場合があります。64ビット
  • 一部の反復アルゴリズムは、ある種のランダム性を使用して開始ベクトルを初期化する場合があります。
  • 一部の実装では、システムにプリインストールされているサードパーティのライブラリを使用する場合があります。LAPACK または FFTW はいくつかの候補です。それらは異なるバージョンを持っている可能性があり、それも原因となる可能性があります。
于 2011-04-21T16:48:16.430 に答える