High Precision Event Timer

High Precision Event Timer（高精度イベント タイマー、HPET）はパーソナルコンピューターで使用されるハードウェア タイマーである。マイクロソフトとインテルによって共同で開発され、2005年頃からPCのチップセットに組み込まれ始めた。インテルは当初「Multimedia Timer」と呼んでいたが、Windows 3.0のWindows Multimedia Extensionsで導入されたソフトウェア機能のとの混同を避けるため、現在の名称に変更された。
古いオペレーティングシステムはHPETをサポートしておらず、リアルタイムクロックといった以前からの古いタイマー設備を使用する。
特徴.
HPETチップはとのように10MHzの64ビットのアップカウンターと3つの独立した64ビットコンパレータで構成されている。HPETのチップはユーザーソフトウェアのランダムな割り込みの発生のために29の32ビット コンパレーター/タイマーを含んでいる。しかし、いくつかのオペレーティングシステムはマルチコアCPUのシステムでそれらのタイマーを使用するように構成することができない。
ACPI BIOSによって用意されるメモリマップドI/Oを通す場合のみ、HPETの32/64ビット拡張ができる。HPETのチップをマザーボードに同時に8つ実装することができる。FSBとDDR-RAMは2つのHPETチップを必要とする。これは近代的なPCは64の割り込みとIRQが使用可能なタイマーのために、6つの8253-Timer互換のカウンタ/コンパレータと58の32ビット HPET/コンパレータを持つことを表す。
64ビットカウンタの値の最下位ビットが対応するビットと同値である場合、コンパレータ/タイマーは割り込みを生成することができる。コンパレータ/タイマーはワンショットモードか周期的モードで用いることができる。ワンショットモードは、カウンタの値がコンパレータのレジスタにストアされた値に達した場合に割り込みを起こす。周期的なモードは定義した間隔で割り込みを生成する。
比較的、近代的なPCはHPETの回路をノースブリッジに統合している。
これらのシステム上では、HPETは100MHz以上で動作する。
アプリケーション.
HPETはRTCに比べて高い解像度でより多くの定期的な割り込みを生成することができるため、スムーズな再生を提供するためのマルチメディアストリームの同期によく用いられ、x86ベースのCPUのRDTSC命令のような他のタイムスタンプの計算回数を減らしている。
既存のタイマーとの比較.
HPETは Programmable interval timerとRTC周期割り込み機能を補い、そして置き換えることが意図されている。PITやRTCなどの古いタイマーと比較して、HPETは高い周波数（少なくとも10MHz）と、より広い64ビットカウンターを持つ（ただし、32ビットモードで駆動することもできる）。
8254やRTCもHPETと同様にワンショットモードで利用できるが、セットアッププロセスが非常に遅いため、正確なスケジューリングを必要とするタスクで使用されることはなく、時間間隔を非常に小さく設定した周期モードで代用されていた。たとえば、アプリケーションが数ミリ秒程度の短い待機を何度も行う場合、8254またはRTCのワンショットタイマーを使用するとセットアップコストが高くつくため、1ミリ秒間隔の周期タイマーモードで動作させた方が良い。しかしそうすると、アプリケーションが実際には長い周期の動作を求めているのに、1ミリ秒毎に余分な割り込みが発生してしまう。一方、HPETのワンショットタイマーはセットアップコストがかなり小さく、短い待ちでもコストを気にしなくて済むため、余分な割り込みを避けることができる。
互換性.
HPETが登場する以前に設計されたオペレーティング システムはHPETを使用できないため、HPETを除く他のハードウェアタイマーを使用する。より新しいオペレーティングシステムはどちらでも使用できる傾向にあり、いくつかのハードウェアは両方を持つ。
以下のオペレーティング システムは、HPETを使用することができないことが知られている。Windows XP
、Windows Server 2003、それより古いバージョンのWindows、バージョン2.6 よりも古いLinuxカーネル。
以下のオペレーティング システムは、HPETを使用することが知られている。Windows Vista、Windows Server 2008、Windows 7、x86バージョンのMac OS X、バージョン2.6の Linuxカーネル、FreeBSDとOpenSolaris。