2

私はwin32環境でC++最適化プログラムを実行しています。プログラムは、FFTWおよびpthread用にビルド済みのDLLを使用します。

最近、プログラムは非常に多く、場合によっては無限大に遭遇する可能性があるように変更されました。この変更後、この他の点では無駄のない堅牢なシステムは奇妙な症状を引き起こし始めました-特に、異なる実行(同じコンピューター上、同じバイナリー)で異なる数値結果を生成し、printfまたはダミーの割り当てをあちこちに追加しました行動を根本的に変えました。

考えられるすべてのバッファオーバーラン、メモリ割り当て、スレッドの問題(スレッドプールのサイズを1に減らしました)、スタックサイズを再確認しましたが、数週間の検索の後、何も見つかりませんでした。変更前は、プログラムに非決定性や安定性の問題はなく、数日間定期的に実行されていました。

問題はFFTWモジュールにあるのだろうか?それとも、そのような浮動小数点の不安定性は、多数に起因する可能性がありますか?

4

4 に答える 4

0

大きな数は非決定的な動作を引き起こしませんが、それを拡大する可能性があります。以前は小さな丸めの差であったものが、有限数と NaN または無限大との差になる可能性があります。

注意すべきことの 1 つは、FFTW に渡されるバッファーの配置です。ほとんどの高性能数値ソフトウェアと同様に、データの配置に応じて異なる実装を使用する場合があります。

于 2012-03-06T15:48:08.717 に答える
0

Valgrindを使用して、ar が初期化されていない変数から読み取っているかどうかを調べます。それらは、望ましくないランダム性の最も一般的な原因であり、したがって非決定論です。

もう 1 つのポイントは、マルチスレッド化 (スレッドプールを 1 つに減らしたと言いますが)、おそらく制御スレッドと作業スレッド間の競合状態です。Valgrind は、マルチスレッド コードでの潜在的な競合のチェックにも役立ちます。

于 2012-03-06T09:09:45.880 に答える