高精度イベントタイマー

精度イベントタイマーHPET)は、現代のx86互換パーソナルコンピュータで利用可能なハードウェアタイマーです。x86アーキテクチャで利用可能な旧式のタイマーと比較して、HPETはマルチメディア再生やOSタスク切り替えなど、タイミングに非常に敏感なアプリケーションをより効率的に処理できます。これはIntelMicrosoftによって共同開発され、2005年からPCチップセットに組み込まれています。以前はIntelによってマルチメディアタイマーと呼ばれていましたが[ 1 ]Windows 3.0マルチメディア拡張機能で導入されたソフトウェアマルチメディアタイマーとの混同を避けるためにHPETという用語が選択されました。[ 2 ]

ハードウェア HPET デバイスをサポートしていない古いオペレーティング システムでは、プログラマブル インターバル タイマー(PIT) やリアルタイム クロック(RTC) といった古いタイミング機能しか使用できません。最新のハードウェア抽象化レイヤー(HAL)を搭載したWindows XPでは、プロセッサのタイムスタンプ カウンター(TSC) や ACPI 電源管理タイマー (ACPI PMTIMER) を RTC と組み合わせて使用​​することで、Windows のそれ以降のバージョンでは HPET ハードウェアによって提供されるオペレーティング システム機能も提供できます。紛らわしいことに、このような Windows XP システムでは、Intel HPET デバイスが使用されていないにもかかわらず、 デバイス ドライバーマネージャーに「HPET」接続が表示されます。

特徴

HPETチップは、少なくとも10MHzの周波数でカウントする64ビットのアップカウンタ(メインカウンタ)と、少なくとも3個、最大256個のコンパレータで構成されています。これらのコンパレータは32ビットまたは64ビット幅です。HPETは、 ACPI経由で検出可能なメモリマップドI/Oウィンドウを介してプログラムされます。最近のPCのHPET回路は、サウスブリッジチップに統合されています。[ a ]

各コンパレータには値がプログラムされており、メインカウンタの値がプログラムされた値と一致した際に割り込みを生成できます。また、32ビットモードでは、メインカウンタの下位32ビットがゼロにラップアラウンドするたびに割り込みを生成します。コンパレータはワンショットモードまたは周期モードに設定でき、少なくとも1つのコンパレータが周期モードをサポートし、すべてのコンパレータがワンショットモードをサポートします。ワンショットモードでは、メインカウンタがコンパレータのレジスタに格納された値に達した際にコンパレータは1回割り込みを発生します。一方、周期モードでは、指定された間隔で割り込みが生成されます。

コンパレータは、スケジューリング用に CPU ごとに 1 つのタイマーを提供するなど、オペレーティング システムによって駆動することも、アプリケーションによって駆動することもできます。

アプリケーション

HPETはRTCよりもはるかに高い分解能で周期的な割り込みを生成でき、マルチメディアストリームの同期によく使用されます。これにより、スムーズな再生が可能になり、x86ベースのCPURDTSC命令などの他のタイムスタンプ計算の必要性が軽減されます。これにより、CPUはタイマーの低分解能を補うためにサイクルを無駄にする必要がなくなり、効率が向上します。また、スリープ状態をより積極的に活用できるため、消費電力が削減されます。アプリケーションレベルでの高精度クロックの要求に加えて、スケジューラやマルチプロセッサシステムで安定したクロックベースを利用できるというOSレベルのメリットもあります。[ 3 ]

前任者との比較

HPETは、 8254プログラマブルインターバルタイマーとRTCの周期割り込み機能を補完・置き換えることを目的としています。これらの旧式のタイマー回路と比較して、HPETはより高い周波数とより広い64ビットカウンタを備えています(ただし、32ビットモードでも駆動可能です)。[ 1 ]

HPET仕様ではタイマー周波数は定義されておらず、最小10MHzのみを要求しています。実際の周波数は、期間あたりのフェムト秒数(上限は100 000 000  fs)。一般的な値は 14.3 x 18  MHz で、標準の 8254 周波数 1.193 x 18  MHz の 12 倍です。

8254 と RTC はHPET のようなワンショットモードにすることができますが、セットアッププロセスが非常に遅いため、正確なスケジュールを必要とするタスクでは、実際にはワンショットモードは使用されません。[ 4 ]代わりに、8254 と RTC は通常、非常に短い時間間隔の周期モードで使用されます。たとえば、アプリケーションが短い (数ミリ秒など) 待機を数回実行する必要がある場合、8254 または RTC のワンショットタイマーのセットアップコストが高いため、1 ミリ秒周期で常に実行されている周期タイマーを使用する方が適切です。これにより、アプリケーションが実際の作業をそれほど頻繁に行う必要がない場合でも、1 ミリ秒ごとに割り込みが発生します。HPET を使用すると、HPET ワンショットタイマーのセットアップコストが大幅に小さいため、余分な割り込みを回避できます。

使用と互換性

システムクロックソースとしてHPETからTSCへの切り替えを示すLinuxブートログ

HPET が存在する以前に設計されたオペレーティングシステムは HPET を使用できないため、他のタイマー機能を使用します。新しいオペレーティングシステムはどちらか一方を使用できる傾向があります。一部のハードウェアは両方を備えています。実際、現在のサウスブリッジチップのほとんどは、オペレーティングシステムで使用されるかどうかにかかわらず、PIT、PIC、Advanced Programmable Interrupt Controller (APIC)、および RTC デバイスのレガシーサポートインスタンスをシリコンに組み込んでおり、これにより非常に最新の PC で古いオペレーティングシステムを実行できるようになります。

以下のオペレーティングシステムではHPET を使用できないことが分かっています: Windows XP SP1、 [ b ]およびそれ以前のWindowsバージョン、Linuxカーネル 2.6 より前。[ c ]

HPETを使用できるオペレーティングシステムとして、Windows XP SP3、[ d ] Windows Server 2003 SP2Windows Server 2008Windows Server 2008 R2Windows VistaWindows 7、x86ベースのOS X、 2.6カーネル(またはそれ以降)を使用するLinuxオペレーティングシステム、FreeBSD [ 5 ]およびOpenSolarisが知られています。

LinuxカーネルはHPETをクロックソースとして使用することもできます。Red Hat MRGバージョン2のドキュメントでは、オーバーヘッドがはるかに低いためTSCが推奨クロックソースであると記載されていますが、HPETはフォールバックとして使用されます。この環境で1,000万イベントカウントのベンチマークを行ったところ、TSCは約0.6秒、HPETは約12秒強、ACPI電源管理タイマーは約24秒でした。[ 6 ]

2019年には、一部のIntel CPU(Coffee Lake)上で実行する場合、その不安定性のため、新しいLinuxカーネルでHPETをブラックリストに登録することが決定されました。[ 7 ]

問題

HPETは、カウントアップする連続実行タイマーであり、ゼロまでカウントダウンして1回の割り込みを発生させて停止するワンショットデバイスではありません。HPETは、実際のタイマー値とプログラムされた目標値を「大きいか等しい」ではなく「等しい」で比較するため、コンパレータ値がチップのレジスタに書き込まれた時点で目標時間が既に経過している場合、割り込みが失われる可能性があります。[ 8 ]このような場合、意図した割り込みが失われるだけでなく、実際にははるかに未来(約2の32乗または2の64乗カウント)に設定されます。[ 9 ]実行時間に上限が定められていないノンマスカブル割り込み(システム管理割り込み(SMI)など)が存在する場合、この競合状態はセットアップ後にタイマーの再チェックに時間がかかり、完全に回避することは困難です。一部のチップセットのように、コンパレータ値がタイマーと即座に同期されず、1~2ティック遅延される場合、問題はさらに深刻になります。[ 8 ]

VMwareのドキュメントでは、前述の競合状態に加えて、いくつかの欠点も挙げられています。「仕様では、タイマーの粒度が特に細かく、ドリフトが小さく、読み取り速度が速いことを求めていません。一般的な実装では、カウンターを約18MHzで動作させ、HPETの読み取りにACPIタイマーとほぼ同じ時間(1~2μs)を要します。周期レジスタの誤差が800ppm以上になる実装も確認されています。」[ 9 ]

注記

  1. ^これらの高度に統合されたダイでは、 BIOS がACPI で HPET を誤って設定し、 Intel 8253モードでのみ正しく初期化してしまうことがよくあります。ACPI が正しく設定されていない場合、 OS はHPET をリストできません。また、BIOS と OS の開発者は、リアルタイムサポートの必要性を感じていません。そのため、HPET はシステムの高速化のニーズを満たすためだけに存在します。BIOS から ACPI で HPET が正しく設定されている場合、最初の HPET チップの ACPI MMIO ページは 0xFED00000 に、2 番目の HPET は 0xFED80000 ページにあるはずです (詳細については、説明を参照してください)。
  2. ^ Windows XP SP2 はHPET タイマー(ACPI\PNP0103 識別子を持つデバイスとして)を認識します。検出されると(例えばIntel DQ45CB マザーボードの場合)、デバイス マネージャー(スタート / 設定 / コントロール パネル / システム / デバイス マネージャー)の「システム デバイス」ブランチに「高精度イベント タイマー」デバイスが表示されます。しかし、このデバイスは全く使用されていません。
  3. ^ Linux カーネルでは、オリジナルの RTC ドライバーではなく、新しい RTC-CMOS ハードウェア クロック デバイス ドライバーが必要です。
  4. ^XP SP3 は、2005年までに Windows Vista 向けに設計された PC に搭載されることになるデバイスを見越して、2002年に策定された HPET 仕様の大部分を「エミュレート」しています。ドライバマネージャ内では、「高精度イベントタイマー」という用語が、15 MHz インテル HPET デバイスが使用されていない場合でも、TSC (タイムスタンプカウンター) または ACPI 電源管理タイマー (PMTimer) タイミングサブシステムを表すために使用されます。Windows Vista 以降の Windows のみが物理的なインテル 15 MHz HPET を使用しているというのは事実ですが、HPET によって実現されることが想定されていたオペレーティングシステム機能は、仕様が異なり (2005 年ではなく 2002 年の仕様)、したがって機能が制限されていたとはいえ、既に Windows XP にほぼ存在していました。 Windows XP SP3 における物理的な実装に関して言えば、ACPI HAL(バージョン 5.1.2600.5512)を使用する場合、IRQ0 と IRQ8 は通常「高精度イベントタイマー」にマッピングされます。ただし、QueryPerformanceFrequency API 呼び出しは、Windows Vista で得られる Intel HPET 仕様の 15 MHz 値ではなく、定格プロセッサクロック速度(例:2.6 GHz)または PMTIMER(3.579545 MHz)に関連する値を返します。この例外により、このようなシステムにおける「HPET」の意味が不明瞭になりますが、これらのケースでは明らかに 15 MHz の Intel デバイスではありません。この「HPET」を引用した IRQ マッピングと非 HPET クロックの関係は、/USEPMTIMER ブートオーバーライドを使用しているかどうかにかかわらず、Intel システムと AMD システムの両方で見られることに注意してください。 HPETの最初の仕様(2002年)では高解像度のカウンターが要求されており、これはQueryPerformanceFrequencyおよびQueryPerformanceCounter API呼び出し(Windows 2000以降で既に利用可能)によって公開されるため、この「高精度」カウンターが実際にどのように提供されているかを明らかにするのはQueryPerformanceFrequencyです。高い値(1GHzから4GHzの範囲)は、CPUのタイムスタンプカウンター(TSC)がカウンターのソースであることを示しています。AMDの初期のマルチコアCPUでは、TSCから得られるQueryPerformanceCounterの読み取り値に問題がありました。これは、拡散スペクトラムや電源管理の速度変動の影響を受けるためです。この問題は、後のプロセッサ設計でTSCクロックをCPUクロックから独立させることで最終的に解決されましたが、ACPIシステムのPMタイマーがカウンターソースとして選択されるようになり、PMタイマーの使用を強制するにはWindowsのBOOT.INIファイルで/USEPMTIMERをオーバーライドする必要がありました。 ACPI HALと/USEPMTIMERブートスイッチを併用したIntelおよびAMDマシンでは、IRQ 0と8は引き続きHPETを報告しますが、QueryPerformanceFrequencyはPMTIMERの周波数である3.579545MHzを報告するようになります。これはCPU周波数に依存しないという明確な利点があり、マイクロ秒未満の非常に妥当な分解能と精度を提供します。皮肉なことに、TSCメカニズムで得られるカウントレートが非常に高いため(PMTIMERやIntel HPETデバイスと比較して)、測定可能な時間間隔が短すぎるという問題が発生する可能性があります。つまり、早期にオーバーフローするカウンターの有用性には上限があるということです。また、新しいプロセッサ設計ではプロセッサ速度が絶えず向上しているため、この使用可能な時間間隔がさらに短くなるという問題もあります。そのため、PMTIMERおよびIntel HPETシステムが、サブマイクロ秒単位の分解能を実現することを意図して明確に指定された固定レートを使用し、TSCよりも長い期間の測定を可能にしているのも当然のことです。 /PMTIMER スイッチの有無にかかわらず、HPET 仕様の「イベント」部分は、別のタイミングソースを使用することでのみエミュレートできます。これは、基盤となる TSC および PMTIMER ソリューションのどちらにも、仕様で規定されている非周期的なイベントトリガー用の暗黙的なハードウェアが含まれていないためです。しかし、Windows XP のタイマー API では、timeBeginPeriod - timeEndPeriod API 呼び出しを使用した場合の最高分解能は 0.9766 ミリ秒です。デバイスマネージャーが HPET を IRQ0 および IRQ8 の位置で引用しているにもかかわらず、この仕様部分は RTC デバイスによってソフトウェアの支援を受けて実行されます。

参考文献

  1. ^ a b Intel Corporation (2004年10月)、IA-PC HPET (高精度イベントタイマー) 仕様 (リビジョン1.0a) (PDF) 、 2012年6月15日取得
  2. ^ 「マルチメディアタイマー」。Microsoft。2007年12月10日。 2010年10月20日閲覧
  3. ^ 「IA-PC HPET(高精度イベントタイマー)仕様」(PDF) . Intel. 2004年10月. 2022年8月30日閲覧
  4. ^マルチメディアタイマーサポートを提供するためのガイドライン、2002年9月20日、 2009年11月10日取得
  5. ^ 「FreeBSD マニュアルページ: hpet(4)」 . www.freebsd.org .
  6. ^ 「第15章 タイムスタンプ」 . Access.redhat.com. 2016年5月7日時点のオリジナルよりアーカイブ2014年2月14日閲覧。
  7. ^ 「Intel Coffee Lake の HPETを無効にする Linux カーネル」。Phoronix
  8. ^ a b Thomas Gleixner、x86: hpet: ハードウェアの愚かさを回避する方法アーカイブ2012-07-09 at archive.today、Linuxカーネル2.6.36-rc5にマージされたコミット
  9. ^ a b VMware 仮想マシンのタイムキーピング (VMware vSphere 5.0、Workstation 8.0、Fusion 4.0 用) Archived 2016-06-26 at the Wayback Machine、ページ 9