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側は騙し騙し実現してるのじゃないか?と思う様な状況ではないか?とさえ思います。

スポンサーサイト

Microsoft Visual C++ Redistributable

こんなに沢山入れる必要があるなら、複雑なダイナミックリンクの機能を持たせるより、全部単純明快なスタティックリンクにした方が健全かつ全体で見るとコンパクトじゃないでしょうか?すくなくともダイナミックリンクに浪費する複雑な仕組みを取り払う事は出来ますから高速かつコンパクトという逆説的結果に成りそうです・・・
VCPPRTM.jpg

nBody ベンチマークプログラムの改造?

以前このブログ記事でご紹介させて頂きました、N体シミュレーションを使ったベンチマークソフトですが、作者の方から連絡を頂きまして複数GPU(主にAMD製と2世代以上前のnVidia製)を搭載したPCでベンチマークスコアが正しく表示されないケースが有る事に気付きまして、デバッグとプログラム修正を提案させて頂きましたところ、お手伝いする事になりました。

とりあえず、問題だった複数GPUでのスコアですが、同種のGPUに限っては何とか解決出来まして、ついでに画面左上にカーネルの種類と測定したデバイスの情報、右下に私のハンドルネームとブログURLを表示させて頂きました。
n-Body_HD7970-2GPU-d.jpg

元のプログラムがきれいに書いてありましたので、ピンポイントで数行追加/修正すれば同種のGPUでの複数GPUの件は解決でした。
異種混合複数GPUへの対応は、テスト中です。

ところで、こんな感じでパラメタを変えると簡単に 4TFLOPS を超えるスコアが出る訳ですが、
N-Body-Tahiti-2GPU-b32-local.jpg
※コマンドラインオプション "-kernel local -b 32" で起動

GPUを2枚増やしてOverClockすれば個人のPCで 10 TFLOPS を簡単に超えられそうですね。
10 TFLOPS と言えば、10,000,000,000,000 FLOPS ですから、実に1秒間に10兆回の浮動少数点演算をした事に成ります・・・
現時点で世界最速スパコンの「京」は10PFLOPS=1京FLOPSらしいですから、ちょうど1/1000の性能という事に成り、数字のみで単純比較は出来ませんが、金額や消費電力や占有面積などを考えると、なかなか凄い性能が出てますね。
もしLINPACKを実行したら、どの程度のスコアに成るんでしょう・・・

久しぶりのソフト開発で、手始めにメモリレイテンシ計測にトライ?!

久しぶりのソフト開発で、手始めにメモリレイテンシ計測にトライ?!と言いましても、既存アプリの修正版です。

少々レガシーな雰囲気を漂わせるロードレイテンシ・帯域計測ツールに注目しまして、何と言いましてもソースが公開されておりますので簡単です。

ついでに筆者は、このツールのコンパイルに必要な VisualStudio 2003 の正規ユーザですから、開発環境も簡単に構築出来まして、半日ほどで修正出来ました。

最新版はMS-DOS上で動作しますが、CPUを32Bitモードに切り替えて測定していますので、16Bitのメモリ上限を超えて測定出来ます。
なぜMS-DOS上で測定しているかといいますと、割り込みやサービスといったWindows上では裏で回っているタスクが正確な測定をする上での邪魔になるから・・・だと思います。

画面の赤線で囲った所が筆者が修正した箇所です。
latency.png

L1/L2の境界などでレイテンシが大きく変化し大幅に増えているのが確認出来ます。というか、L1のレイテンシは10年以上前から全く向上していない様ですね。

恐らくSRAMの限界が1ns程度なのだと思いますが、この事は逆にL1のレイテンシサイクルを多めにするとOverClockの耐性が高くなる事につながると思われ、定格利用前提のCPUとOC前提のCPUで状況を比べると傾向が良く判るのではないかと思われます。

ちなみに修正箇所は4点ありまして、
1:バージョン名に“+”を付けて v0.7+ にしました。
2:CPUの名前を表示する様にしました(部分的にアセンブラ)。
3:計測レンジを変則的にして色々なL3のバリエーションに対応。
4:コマンドラインオプションで最大レンジを256MBまで設定可能に。
※64MB以上の測定には異様に時間が掛かりますので注意が必要です。

修正にあたりまして、擬似乱数生成とレンジサイズの依存度が高く計測レンジを変則的にする部分で若干苦労しましたが、何とか解決してるのではないかと思います。

ただ、これ、困った事に著作権に関する記載が一切無くて、しかも作者への連絡手段も不明ですから、修正版を筆者が配布してもよいものなのか、他のソフトにソースを流用しても良いのかなど、判断に苦慮しております・・・

今後の展開として、このツールと帯域測定ツールを使いまして、SuperPIとCPUキャッシュの関係を調査してみようと思っています。
但し、より優先度の高いベンチマークソフトの改造を平行してやっていますので、いつになるやら判りませんが・・・

来年からのOpenCL(GPGPU)

えっと、こんな感じだと思います。

クリックすると拡大します。
OpenCL-1.jpg
13号機の実測ではGPU⇔MEMの帯域が54GB/s、CPU⇔MEMの帯域が24GB/sですから、HOST⇔DEVICE間の3.5GB/sは一桁低い値で、致命的なボトルネックとさえ言えます。

と来年から始まると書きましたが、SSEを使った実装は既にありますが演算能力としてはGPGPUに敵いませんし、Cellを使った実装ではOpenCL策定時から既にそうなっていた訳ですが、自作PCで扱う範疇でもなく、また一般的でも無いと思います。

来年からの数年間、この分野での本命はFUSIONであると思うのですが・・・
(私が見落としているのか?HPC向けのFUSION-APUの実態像が未だ見えてきません。)
登場するか否かは別として、HyperTransport接続のGPU、つまりCPUソケットに搭載可能なGPUが登場し、マルチソケットマザーでNUMA的なCPUとGPUのフレキシブルな構成が可能だと思う訳です。

こうなるともう、ボトルネックがしばらくは解消出来ないnVidiaにとっては、とにかくCUDAを推進しつつARMのパフォーマンスが向上するのを待つ(もしくは自ら参加してARMを強化する)しか将来的に苦しくなってきますね。
ECC対応のQuadroやTESLAはGPU1枚が50万くらいするんですよォ~
ゲーム用GPUで安価に底辺を広げつつ、頂点からはガッポリって感じですねェ~

台湾サイドからリークされてくるAVXのパフォーマンスが実際にはどの程度なのかも気に成りますね。

あとは、メニィコア化により、数年後にはデュアルソケットでの自作PCは厳しくなるかもしれません。
その場合、このブログの趨勢が我ながら気に成るところですw

ところで、筆者が所有する自作PCのうち、7号機以前のPCに付いては純粋な趣味として旧式PCでのOpenCLを時代に逆行しながらAGPやPCIなどのインターフェースを使ってボトルネックを強化しているだけなんですがwまぁ趣味ですから冷めた目で見てやって下さいw
プロフィール

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