HPET ( High Precision Event Timer ) の動作状況を確認する方法


 HPET が起動しているか確認するには、コントロールパネル -> デバイスマネージャ -> システムデバイス の中に高精度イベントタイマーが有れば起動しています。LinuxやBSD等ではdmesgでHPET関連の文言を見付けて下さい。但しそれだけでは機能しているとは限らない様です
HPET.jpg

 下記は、PC/AT互換機のタイマー一覧です。
TIMERLIST4.png

 仮想環境では、更に仮想環境専用タイマーがある様です。

 PITには2種類の呼び名があります。

 Programmable Interval Timer
 Programmable Interrupt Timer



 OSは、これらのタイマーの中から最善(かもしれない)物を選択して利用しています


 Windows Vista 以降で、かつBIOS/UEFIでHPET有効にした状態でもHPETが利用されていない場合、HPETを強制的に利用するには、下記のコマンドを実行後に再起動します。

 bcdedit /set useplatformclock true

 但し、この設定でHPETを有効にすると、多くの場合は DPC Latency が増大し、もっさり感(つまり、デバイスの反応が悪くなる)を体感する事になるかもしれません。

 HPET と DPC Latency の関係を調べてみました。
HPETandDPC2.png
 傾向としては、HPETを有効にするとDPCレイテンシが増大するケースが多い様です。

 以下の説明は、HPET 誕生までの経緯と、その後を筆者が調べた結果です。調べていて判ったのですが、多くの人が Windows の機能(ソフトウエアで実現している機能)にある マルチメディアタイマ と混同していますし、筆者も今まで混同していました。

 PC/AT互換機に標準装備されているシステム時刻は RTC ( Real Time Clock ) と言われ Motorola 製の MC146818 チップと互換性のある秒刻み仕様の時計です。その為、これを使うと秒以下の精度が必要な音楽や動画を扱う場合や機械制御などに不都合です。

 そこで、Windows3.0 のマルチメディア拡張機能 ( MME:Multi Media Extensions ) を作る際に策定されたものが マルチメディアタイマー ( Multimedia Timers ) という1ミリ秒刻み(機種やマザーの設定などにより異なるのかもしれない)のタイマー機能で、これが WindowsNT 3.1 以降は標準機能になりました。

 これとは別に、Windowsの時刻はRTCのハードウエアを利用せず、独自に15.6ミリ秒の分解能を持ったカウンターを64回転させて1秒を刻み時計機能を実装しています(この分解能は管理者権限で変更可能です)。RTCはWindowsの起動時に一度だけ読み込まれ、それ以降はOSがカウンターを使って時刻を表現し、NTPの同期には逆にOS側からRTCを更新しています。

 話をマルチメディアタイマーに戻しますと、このマルチメディアタイマーの詳しい動作原理は不明ですが、WindowsNT3.1発売当時は PC/AT互換機に標準で備わっているPITを利用するしかなかったのではないか?と思われます。理由は上の表を見ると判りますがWindowsNT3.1が発売された当時はPIT以外に秒以下の精度を出せるタイマーハードウエアが互換機に搭載されていなかった為です。

 ですが、このPITは8086時代の遺物ですから反応が遅くて足を引っ張る為、対策が必要となるのは当然と思われます。

 そこで高性能で高分解能なタイマーハードウエアを作成する必要性から、2002年頃からIntelがハードウエアの規格を策定する際に Multimedia Timer という名称のハードウエアを作成したのですが、既に書きました通りWindowsNT3.1以降に搭載されているマルチメディアタイマーと名前を混同すると困るので名称を HPET に変更する事に成りました。が、その時点で既にマルチメディアタイマーとしてマザーボード製造業者に認知されていた為にBIOSやマザーのマニュアル等にマルチメディアタイマーとして既に登場しており、時既に遅しとなったのではないかと思われます。

 この様な歴史的経緯から HPET には下記の3種類の呼び名があります。

 Multimedia Timer : 初期の名称かつ混同する原因
 High Perfomance Event Timer : 俗称
 High Precision Event Timer : 現在の正式名称


 BIOS/UEFIでは、この3種類のいづれかの名称で掲載されています。そして有効(ENABLE)/無効(DISABLE)の設定とカウンターの32Bit/64Bit切り替えが出来るものもあります。

 ここで、更に厄介な問題として、出来上がった HPET はオリジナルの PC/AT 以降に策定されたハードウエア仕様ですから、必ずしも全てのPC/AT互換機に搭載されている訳ではありませんし、搭載されていたとしても BIOS/UEFI のバグや設定で正しく機能していない事が多々あり、また、HPET が機能しなくてもとりあえずOSは下位互換で正常動作してしまう為にBIOS/UEFIのバグなどによる HPET の動作不良は誰にも気付かれずに見過ごされてしまい、結果、HPET以外のタイマーがいたる所で使われている状況がある様です。

 OS側のHPET対応はWindowsではVista/2008以降、Linuxではカーネル2.6以降の様で、これらのOSが利用される以前はHPETが問題を起こす事がありBIOS/UEFIで無効(DISABLE)がデフォルトに成っている事もある様です。

 HPETが機能していると、機能していない時よりも動作が軽くなる様です(未確認)。先述の通り、DPC-Latencyが増大して、反応が鈍くなる事があります。
 
 HPETを有効にしてWindows上のアプリから測定すると、概ね下記の通りです。

 システム時刻:分解能1秒(内部のカウンターは15.6ミリ秒刻み)
 マルチメディアタイマ:分解能 1ミリ秒
 高分解能パフォーマンスカウンタ:分解能 0.04~0.6マイクロ秒(40~600ナノ秒)


 上記の高分解能パフォーマンスカウンタ(英語では単にPerformanceCounter)は、必ずしもHPET(高精度イベントタイマー)ではない様です。

 BIOSでHPETを無効にして高精度イベントタイマがデバイスマネジャから消えた状態にしても、アプリ側からは高分解能パフォーマンスカウンタの分解能が0.3マイクロ秒程度で機能しますので、HPET以外のハードウエアで代用していると思われます。

 最近のLinuxではCPUに搭載されているTSC:Time Stamp CounterやLocal APIC Timer を優先的に利用する様ですが、HPETへの切り替えも可能です。

 とにかく、タイマー関連を調べれば調べるほど複雑怪奇で、時代とともに変化もし、また、バグも多く、機種によるハードウエア実装も異なり、OS側は騙し騙し実現してるのじゃないか?と思う様な状況ではないか?とさえ思います。

関連記事
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

DualSocketTheWorld

Author:DualSocketTheWorld
自作を始めて20台目くらいになりますが、最初からデュアルソケット限定(始めた当時はデュアルスロット)で自作しており、近年になってAMD K6を試したくなりSocket7でK6-2+のシングル構成で組んだのがシングル初です。

シングルマザー(含:シングルソケットマルチコア)や4ソケット以上の自作は基本的にしませんし、メーカー製PCの改造も基本的にはしません(ノートPCのSSD化くらいはしますが・・・)

基本路線はワークステーションと呼ばれる分野での自作で、OSもWindows系であればProfesionalが主な対象に成ります。

ゲーマーの様なOverClockは行わず、WS路線としてハイエンドCPUとハイエンドGPUの組み合わせで定格或いはDownClockで発熱を抑えつつ、その時のアーキテクチャに置いて爆速かつ静音を目指し、30年以上の長期に渡り稼動状態をキープする事を目指します。

※基本的にリンクフリーです。どこでも自由にどうぞ。

※画像は時々変ります。

※お決まりの文章ですが、改造は個人の責任で行ってください。ここに記載された情報は間違いを含んでいる可能性が有り、それを元に製作や改造などをして失敗しても筆者は一切責任持てませんので悪しからず。

筆者略歴:
小学生時代にゴミ捨て場で拾ったジャンクテレビ数台を分解して部品を取り出し真空管アンプを自作、中学生時代にPC8801mkⅡsrでZ80アセンブラを始める。社会人になって初のプログラムは弾道計算、後に医療系・金融系プログラマ~SEを経て100~200人規模プロジェクトのジェネラルマネジャを数年経験、独立して起業。現在は不動産所得で半引退生活。
(人物特定を避ける目的で一部経歴を変更しています)

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
アクセスカウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR