0

(rdtscを使用して)時間を返す高速関数を実装しました。それを と呼びましょうfast_time()。参考までにシステムコールを使ったオリジナルの関数があるので、 と呼びましょうsystem_time()。私のプログラムは使用していますfast_time()が、別のスレッドで、関数から返された時間と元の関数から返された時間の差が事前定義されたしきい値より大きいかどうかを確認するために、while ループを常に実行しています。何かのようなもの

while (true)
{
    if (abs((fast_time() - system_time()).microseconds()) > MICROSECONDS_THRESHOLD)
    {
        report error
    }
}

通常、エラーは表示されませんが、エラーが発生する場合があり、この問題をよりよく理解したいと考えています。私の最初の疑いは、への呼び出しが返されたsystem_time()直後に行われないということです。プログラムを可能な限り「原子的に」fast_time()実行するにはどうすればよいですか?fast_time() - system_time()

4

1 に答える 1

2

rdtsc は、いくつかの理由により、リアルタイムを測定するための本質的に信頼できない方法です。

1) 各 HW スレッドは異なる値を返すため、スレッドが 1 つの HW スレッドにロックされていない場合、異なる値が返されます。そのため、OS がスレッドをスケジュールする方法に応じて、時間が予期せず前後にジャンプする場合があります。

そして更に重要なことに:

2) CPU スロットリングにより、CPU の周波数が予期せず変更される可能性があります。rdtsc は時間ではなく実行されたサイクルを測定するため、サイクル数を CPU 周波数で除算しても経過時間を確実に取得することはできません (2 つの rdtsc 呼び出しの間で周波数がランダムに変化する可能性があります)。

また、特定のテスト ケースでは、OS が fast_time() と system_time() 呼び出しの間で生成するようにスレッドをスケジュールする場合があるため、fast_time() が正しい値を返したとしても、測定された時間に差異が生じます。したがって、あなたの質問に答えるために、これを防ぐ方法はないと思います。

于 2014-06-22T14:20:14.580 に答える