2

システム タイマーである IRQ0 を使用できることはわかっていますが、これは 14.31818MHz クロックに基づいていますよね? これ以上の精度を提供するものはありますか?

ありがとう。

編集: QueryPerformanceCounter が使用する Windows 関数を知っている人はいますか?

4

2 に答える 2

3

「精度」と「精度」は別の意味です。「地球の円周は40000.000000000kmです」は正確ですが、正確ではありません。時計ではもう少し複雑です。

  • 解決策:ティック間の時間、またはティックの期間。(おそらく「精度」と呼べるかもしれませんが、「解像度」の方がわかりやすいと思います。)
  • スキュー:公称クロック周波数と実際のクロック周波数の相対差(ish)
  • ドリフト:スキューの変化率(経年変化、温度などによる)。
  • ジッタ:ティックタイミングのランダムな変動。
  • レイテンシー:タイムスタンプを取得するのにかかる時間。

「システムタイマー」(ウィキペディアによるとPIT)は1.something MHzで実行されますが、通常は100〜1000HzのどこかでIRQ0を取得します。どうやら、ポート0x40から2回読み取って現在のカウンター値を取得することもできますが、これがどのようなレイテンシーであるかはわかりません(次に、次の割り込みまでのカウント数を取得するため、計算を行う必要があります) 。また、最新の「ティックレス」カーネルでは機能しません。

他にもいくつかの高周波タイマーがあります。

  • バス周波数と2の累乗分周器に基づくローカルAPIC。しかし、それを読む方法についてのドキュメントが見つかりません(おそらくそれはI / Oポートですか?)。
  • ACPI電力管理タイマー(Linuxではacpi_pm、私は思う、そして/ UsePMTimer Windowsブートフラグ)、これによると約3.58MHzです。IIRC、それを読むのは少し高価です。
  • HPET。同じリンクによると少なくとも10MHzです(ただし、それより高くなる場合もあります)。また、ACPIPMタイマーよりもレイテンシが低いと想定されています。
  • TSC(警告付き)。ほぼ確実に最低のレイテンシーであり、おそらく最高の周波数でもあります。(ただし、「ティック」ごとに1を超える可能性があるため、1秒あたりのカウント数は必ずしも解像度と同じではありません。)

ダーウィン(つまりOS X)は、TSC周波数が変化しないと想定し、TSCが実行されていない(明らかにC4以上)スリープ状態から復帰するときに追加される基本値を調整するように見えます。TSCはCPU間で同期する必要がないため、CPUごとに異なる基本値があります。賢明なタイムスタンプを取得するには、かなりの労力を費やす必要があります。

IIRC、Linuxは単一のクロックソースを選択するだけです(TSC、それが正常であれば、HPET、次にACPI PMだと思います)。

IIRC、QueryPerformanceCounter()は、Windowsが最適と考えるものをすべて使用します。Windowsのバージョンにも多少依存します(XPはおそらく割り込みに対してHPETをサポートしていないため、タイムスタンプに対してもサポートしていないと思われます)。QueryPerformanceFrequency()を呼び出して推測することができます(1995030000を取得します。これは、おそらくTSCであることを意味します)。

于 2010-10-02T04:07:25.470 に答える
1

Intel プロセッサは通常、rdtsc命令を介して利用できる高精度のタイマー情報を持っています。

14 MHz¹ よりもはるかに高い精度を備えています。注意点は、マルチコアおよびスピード ステッピング プロセッサで問題が発生する可能性があることです。

編集: この質問には、この件に関してより多くの詳細があります。


1. 実際の周波数はプロセッサによって異なりますが、多くの場合はプロセッサの周波数です。どうやら Nehalem プロセッサでは、TSC はフロント サイド バス周波数 (133 MHz) で動作します。

于 2010-09-30T22:01:18.977 に答える