4

小さな単純な浮動小数点演算から時折奇妙な結果が得られるソフトウェア プロジェクトがあります。私が見逃しているものがあると思います。次の問題をデバッグする方法についてのヒントが欲しいです。

(使用されるコンパイラは、Microsoft C コンパイラのバージョン 12 である MS VC 6.0 です)

最初の異常:

extern double Time, TimeStamp, TimeStep;  // History terms, updated elsewhere
void timer_evaluation_function( ) {
    if ( ( Time - TimeStamp ) >= TimeStep ) {  
        TimeStamp += TimeStep;  
        timer_controlled_code( );  
    }
{....}

何らかの理由で、タイマーの評価が失敗し、時間指定されたコードが実行されませんでした。デバッガーでは、トリガー条件が実際に真であることを確認するのに問題はありませんでしたが、FPU は肯定的な結果を見つけることを拒否しました。次のコード セグメントは、同じ操作を実行しましたが、問題はありませんでした。この問題は、失敗する可能性のある偽の評価を挿入することで回避されました。

FPU の状態は、実行された以前の操作によって何らかの形で汚染されていると思いますが、役立つコンパイラ フラグがいくつかあるのでしょうか?

2番目の異常:

double K, Kp = 1.0, Ti = 0.02;
void timed_code( ){
    K = ( Kp * ( float ) 2000 ) / ( ( float ) 2000 - 2.0F * Ti * 1e6 )
{....}

デバッガーは式を約 0.05 と評価しますが、結果は #IND です。#IND 値は、fld 命令を使用して 2.0F 値が FPU にロードされると、FPU スタックに表示されます。前の命令は、fild 命令を使用して、整数値 2000 を double float としてロードします。FPU スタックに #IND 値が含まれると、すべてが失われますが、デバッガーは数式を問題なく評価します。後で、これらの操作は期待される結果を返します。

また、関数呼び出しの直後に FPU の問題が再び発生します。各新しい関数の後に FPU 状態をクリアする浮動小数点演算を挿入する必要がありますか? 何らかの方法で FPU に影響を与える可能性のあるコンパイラ フラグはありますか?

この時点で、すべてのヒントとコツに感謝します。

編集:トップ関数でアセンブリ関数EMMSを最初に呼び出すことで、問題を回避できました。そうすれば、私のコードが呼び出された環境で作成された、または作成されなかった可能性のある MMX 関連のガベージが FPU からクリアされます。FPU の状態は当然のことではないようです。

//フランク

4

6 に答える 6

2

問題が何であるかはわかりませんが、x86では、FINIT命令がFPUをクリアします。理論をテストするために、これをコードのどこかに挿入できます。

__asm {
    finit
}
于 2009-01-26T17:35:47.277 に答える
1

MMXをサポートするシステムでWindowsのQueryPerformanceCounter関数とQueryPerformanceFrequency関数を使用している場合は、周波数/カウンターを照会した後、計算の前にfemms命令を挿入してみてください。

__asm femms

MMXを使用して64ビットの計算を実行し、浮動小数点フラグ/状態をクリアしない前に、これらの関数で問題が発生しました。

この状況は、浮動小数点演算の間に64ビット演算がある場合にも発生する可能性があります。

于 2009-01-27T00:36:36.707 に答える
1

これはあなたの質問に対する答えではありませんが、FPU の奇妙な動作に関する Raymond Chen の 2 つの記事を参照することをお勧めします。あなたの質問を読んで記事を読み直しても、すぐにはリンクが表示されませんが、貼り付けたコードが完全ではない場合、または記事が問題の原因となった周囲の動作についてのアイデアを提供する場合.. . 具体的には、近くのどこかに DLL をロードしている場合です。

初期化されていない浮動小数点変数は致命的な可能性があります

無効にすると、無効な浮動小数点オペランドの例外がどのように発生しましたか?

于 2009-01-26T22:21:29.710 に答える
0

re: タイムスタンプ --

タイムスタンプのソースは何ですか? 何かが疑わしいようです。それらをファイルに記録してみてください。

于 2009-01-26T18:17:59.297 に答える
0

正確な解決策を提供するわけではありませんが、使用できるさまざまな最適化について説明しているこの記事を読むことから始めることをお勧めします。

于 2009-01-26T17:31:38.890 に答える