Intel Xeon (Pentium 4) Hardware Performance Monitoring Countersの使い方 V0.01 09/30/02 V0.02 10/02/02 HyperThreadingサポートにともなう追加 By Hiro Yoshioka 参考文献 http://developer.intel.com/design/Pentium4/manuals/ IA-32 Intel Architecture Software Developer's Manual Volume 3 : System Programming Guide Intel Pentium 4 Processor Optimization Reference Manual 1 Intel XeonのHardware Performance Monitoring Counters概要 IA-32 (Intel Architecture)には、実行性能のモニタリング用のハードウェア・ イベント・カウンタがある。ここでは、Intel XeonおよびPentium 4 プロセッサ に実装されている Performance Monitoring Counters の利用方法について記す。 Pentium III/Pentium II/Pentium Pro等のいわゆるP6の実装は、Intel Xeon系と は異なるので、別途記す。 Performance Monitoring機能はPentiumから導入されたが、Pentium/P6/Intel Xeon系それぞれ実装依存(model specific)で互換性はない。しかし、 wrmsr/rdmsr/rdpmc命令によってイベントの選択、フィルタリング、計測、読み 込みするという概念に違いはない。 2 Performance Monitoringカウンタについて Performance Monitoring機能を利用して各種ハードウェアイベントを計測する概 要は以下のとおりである。 1) ESCR (Event Selection Control Registor) に計測するイベントとイベント マスクを設定する 2) ESCRのOS/USRフラグを設定する 3) どのCCCR (Counter Configutstion Control Registor)選択するかESCRに設 定する 4) CCCRのcompare/complement flagsおよびthresholdフィールドを設定する 5) 必要であれば、CCCRのedge flagを設定する 2.1 各種レジスタ 1) ESCR (Event Selection Control Registors) 45個の MSR (Model Specific Registor) がある。モニタするイベントを選 択する。 2) 18個のイベントをカウントする Performance Counter MSRがある 3) 18個のPerformance Counter MSRに対応する CCCR (Counter Configuration Control) MSRがある。各CCCRはカウント方法など対応する performance counter用に設定する IA-32 Intel Architecture Software Developer's Manual Volume 3 : System Programming GuideのTable 15-4に、performance counter MSRと対応す るCCCRおよびESCR MSRの表がある。以下、特にことわりのない場合は、上記マニュ アルから引用する。 以下に示す2つのタイプのイベントを測定できる。 1) Non-retirementイベント。命令実行中に発生するイベント(例えば、分岐リ タイアメント、バストランザクション、キャッシュトランザクション) 2) At-retirementイベント。命令実行のリタイアメント時のイベント(例えば、 tagging uOPs (micro operations) など)。taggingによって実行パスのリタイヤ の測定と、キャンセルされた実行パス(例えば分岐予測に失敗したパス上の実行) の測定を区別できる。 注:Xeonは深いパイプラインを持つので、分岐先を予測して命令を投機的に実行 するが、分岐予測が間違っていた場合は、分岐先での実行はキャンセルされる。 taggingによってキャンセルされたイベント、キャンセルされなかったイベント を区別することができる。Non-retirementイベントでの測定では、コミットされ なかった(キャンセルされた)命令によって発生したイベントも計測されてしまう が、At-retirementイベントにより計測だと、実際にリタイヤされた命令に関連 するイベントのみを測定できる。 Pentium 4およびIntel Xeonでは下記の3つの利用モデルがある。最初の2つは Non-retirement/At-retirementイベントを測定できるが、3つめの利用モデルで は、At-retirementイベントのサブセットしか測定できない。 1) イベントカウント。インターバルによってイベントを数える。 2) 精密でないイベントサンプリング(Non-precise event-based sampling) カウンタがオーバフローした時に割り込みがかかるように設定する。オーバ フローを発生させるため、カウンタにあらかじめ値を設定しておく。カウンタが オーバーフローすると、プロセッサはPMI (performance moniroring interrupt)を発生する。PMIに対する割り込み処理ルーチンは、RIP (return instruction pointer) を記録し、値を再設定し、カウンタを再実行する。例え ば、カウンタに-1000を設定しておけば、1000回ごとにオーバフロー割り込みが 発生する。このRIPの分布を調べることによって、性能を分析することができる。 3) 精密なイベントサンプリング(Precise event-based sampling -- PEBS) このタイプは、精密でないイベントサンプリングと似ているが、カウンタが オーバフローした時のプロセッサの状態のレコードをメモリバッファに保存する ことが異なる。 PEBSについては別途記す。 2.2 ESCRについて 45個のESCR MSR (Model Specific Register)は計測するイベントを選択する。各 ESCRは通常、性能カウンタのペアと関連付けられていて、各性能カウンタはいく つかのESCRと関連付けられている。 下記の図はESCR MSRのレイアウトを示している。ESCRはHyperThreadingサポート のため、 bit 0/bit 1の利用が可能になっている。HyperThreadingをサポートし ない、Pentium 4などはbit 0/1は利用できないので注意が必要である。 Event Selection Control Register (ESCR) ;page 15-52 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 x|event sel | event mask | tag | | | | | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! ! ! ! ! tag enable-+ ! ! ! ! T0_OS-+ ! ! ! T0_USR--+ ! ! T1_OS-----+ ! T1_USR------+ ここで、 T0_USR flag, bit 2、設定されていると論理プロセッサ0で実行している current privilege level (CPL) が1、2、3(ユーザモード)のイベントがカウン トされる。 T0_OS flag, bit 3、設定されていると論理プロセッサ0で実行しているCPLが 0(カーネルモード)のイベントがカウントされる。 T1_USR flag, bit 0、設定されていると論理プロセッサ1で実行している current privilege level (CPL) が1、2、3(ユーザモード)のイベントがカウン トされる。 T1_OS flag, bit 1、設定されていると論理プロセッサ1で実行しているCPLが 0(カーネルモード)のイベントがカウントされる。 両方設定されていると、両モードのイベントがカウントされる。 Tag Enable, bit 4、設定されているとat-retirementイベントのカウントを補助 するuOPsのtaggingを可能にする。 Tag Value field, bit 5 - 8、at-retirementイベントをカウントするのに対応 するuOPsのtag値を選択する Event Mask field, bit 9 - 24、イベント選択フィールドで選択されたイベント クラスから選択するイベント Event Select field, bit 25 - 30、カウントするイベントクラスを選択する ESCRの設定は、イベント選択フィールドでカウントするイベントのクラスを選ら び、そしてイベントマスクフィールドによって、そのイベントクラス中のひとつ (あるいはいくつかの)イベントを選択する。 例えば、リタイヤした分岐をカウントするとき、4つの異なるイベントを測定で きる。(分岐不成立予測成功/branch not taken predicted、分岐不成立予測失敗 /branch not taken mispredicted、分岐成立予測成功/branch taken predicted、分岐成立予測失敗/branch taken mispredicted) ESCRはリセット時、0で初期化されている。ESCRのフラグやフィールドはwrmsr命 令によりESCRに書きこむことによって設定できる。ESCRに書き込むだけではカウ ントを開始しない。単にカウントするイベントを選択するだけである。選択した 性能カウンタ用のCCCRを設定する必要がある。CCCRはESCRを選択し、カウンタを 起動する。 At-Retirement カウントの例 At-retirementカウントはコミットされた命令に関するイベントだけあるいは投 機的に実行し後に破棄された命令のイベントだけを計測できる。 Pentium 4およびIntel Xeonプロセッサで利用されているIntel NetBurstマイク ロアーキテクチャでは、多くの投機的実行をおこなっている。例えば、分岐の方 向を予測し、その実行パス上の命令の解析および実行をおこなう。そして分岐予 測が失敗した場合、その実行の結果は取り消される。もし性能カウンタが全ての 実行した命令をカウントするように設定されていれば、実際コミットした命令ば かりでなく、キャンセルした命令も含まれる。 そこで、より詳細なイベントカウントするためにtaggingという方法を提供して いる。これはコミットした結果をあらわすtaggedイベントだけを計測する。これ をAt-retirementカウントと呼ぶ。 IA-32 Intel Architecture Software Developer's Manual Volume 3 : System Programming Guide の Table A-2からA-5にat-retirmentカウントを行な う時のtaggingイベントが掲載されている。 用語の説明 Bogus -- 分岐予測に失敗した実行パスにのっている命令なのでキャンセルされ なければいけない命令ないしはuOPs Non-Bogus/Retire -- コミットされた命令ないしはuOPs 従って、命令はBogusないしはNon-Bogusになるが両方になるということはない。 例えば、non-retirementイベントのカウントでL1 cacheミスが多発していること を発見したとする。Bogus分岐(予測に失敗した分岐)上に多数のL1 cacheミスが あるとすれば、分岐予測が失敗しにくいようにプログラムを書きかえることで結 果として、L1 cacheミスを減らすことになる。 Tagging -- Replay -- Assist -- Event Selection Control Register (ESCR) ;page 15-27 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 x|event sel | event mask | tag | | | | | | 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 ! ! ! ! ! tag enable-+ ! ! ! ! T0_OS-+ ! ! ! T0_USR--+ ! ! T1_OS-----+ ! T1_USR------+ 0x04000204 == event select == 2 (instr_retired) event mask == 1 Non bogus instruction, not tagged USR == 5 user mode 上記の例では、リタイヤした命令の、(Table A-2参照) Non bogus instruction/not taggedでユーザーモードのイベントを カウントする。 2.3 CCCR 18個の性能カウンタはそれに対応する一つの CCCR を持つ。CCCRはイベントのフィ ルタリング、カウント、そして割り込みの生成などを制御する。下記はCCCR MSRのレイアウトを示す。 CCCRもHyperThreadingのサポートにともなって、拡張されている。 HyperThreadingをサポートしない、Pentium 4プロセッサなどは、 bit 27を利用 できないので、注意が必要である。 Counter Configuration Control Register (CCCR); page 15-57 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 | |xxx| | | | |Thresh | | |1 1|ESCR | |xxxxxxxxxxxxxxxxxxxxxxx 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | | | | | | | | | | | | | | | | +------------------Enable | | | | | | | +-----------------------------Compare | | | | | | +----------------------------Complement | | | | | +--------------------------------------------Edge | | | | +-----------------------------------------FORCE_OVF | | | +------------------------------------------OVF_PMI_T0 | | +--------------------------------------------OVF_PMI_T1 | +-----------------------------------------------------Cascade +-----------------------------------------------------------OVR Enable Flag, bit 12 設定によって、カウントを有効にする。クリア時はカウンタは有効でない。リ セット時はクリアされている。 ESCR選択 bit 13 - 15 カウントするイベントを選択するために利用されるESCRを選択する Compare flag, bit 18 Complement flag, bit 19 Threshold field, bit 20 - 23 Edge flag, bit 24 FORCE_OVR flag, bit 25 設定時、カウンタが増加する度にカウンタオーバフローを強制する OVF_PMI_T0 flag, bit 26 設定時、カウンタオーバーフローがおきるたびにPMI (Performance Monitor Interrupt)を論理プロセッサ0へ送付する。 OVF_PMI flag, bit 27 設定時、カウンタオーバーフローがおきるたびにPMI (Performance Monitor Interrupt)を論理プロセッサ1ヘ送付する。 Cascade flag, bit 30 OVR flag, bit 31 記述例 Counter Configuration Control Register (CCCR); page 15-57 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 | |xxx| | | | |Thresh | | |1 1|ESCR | |xxxxxxxxxxxxxxxxxxxxxxx 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 | | | | | | | | | | | | | | | | | +------------------Enable | | | | | | | +-----------------------------Compare | | | | | | +----------------------------Complement | | | | | +--------------------------------------------Edge | | | | +-----------------------------------------FORCE_OVF | | | +------------------------------------------OVF_PMI_T0 | | +--------------------------------------------OVF_PMI_T1 | +-----------------------------------------------------Cascade +-----------------------------------------------------------OVR 0x00039000 == ESCR select field == 4 == MSR_CRU_ESCR0 0x8000000C == MSR_IQ_COUNTER0 (==0xC) e.g., BSQ_cache_reference ESCR restriction -- BSU_CR_ESCR0/BSU_CR_ESCR1 (typo??) ESCR event -- 0xC ESCR event mask -- 0:RD_2ndL_HITS ... 8:RD_2ndL_MISS CCCR select -- 0x7 IOQ_allocation ESCR restriction -- MSR_FSB_ESCR0 ESCR event -- 0x3 ESCR event mask -- bits 0-4 (00001) 5: ALL_READ 6: ALL_WRITE CCCR select 0x6 ---- 記述例 ESCR 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 x|event sel | event mask | tag | | | | | | 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 6 0 0 C 2 0 5 CCCR 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 | |xxx| | | | |Thresh | | |1 1|ESCR | |xxxxxxxxxxxxxxxxxxxxxxx 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 D 0 0 0 0x0600C205 == event select == 3 (IOQ_allocation) == event mask == ALL_READ|ALL_WRITE 0x0003D000 == ESCR select field == 6 == (MSR_FSB_ESCR0) 0x80000000 == MSR_BPU_COUNTER0 (==0x0) * The following command does the same on an Intel Pentium 4 processor: * * perfex -e 0x00039000/0x04000204@0x8000000C some_program * * Explanation: Program IQ_CCCR0 with required flags, ESCR select 4 * (== CRU_ESCR0), and Enable. Program CRU_ESCR0 with event 2 * (instr_retired), NBOGUSNTAG, CPL>0. Map this event to IQ_COUNTER0 * (0xC) with fast RDPMC enabled. 2.4 Performance Counters 各性能カウンタは下記のように40ビット長である。rdpmc命令により40ビットな いしは下位32ビットを読むことができる。下位32ビット読み込みの方が40ビット 読み込みよりも速い。 rdpmc命令はどの特権モードでも利用できるが、CR4レジスタのPCE (performance-monitoring Counter Enable)を0に設定することで、特権レベル0(カー ネルモード)のみに制限することができる。 rdpmc命令はシリアライズされないので、カウンタを読む時に、前の命令が実行 されるまで待つ必要はない。同様に、その後の命令もrdpmc命令の実行前に実行 を開始するかもしれない。 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 | C o u n t e r | 6 6 6 6 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 |x x x x x x x x x x x x x x x x x x x x x x x x|C o u n t e r | rdmsrおよびwrmsr命令を利用しての性能カウンタの操作は特権レベル0(カーネル モード)でのみ実行できる。 カウンタを有効にする前にカウンタの値をセットする必要がある場合があるが、 それはwrmsr命令を利用してカウンタに書き込むことによっておこなわれる。オー バーフローを設定する場合、2の補数の負の値を入力する。そして、カウンタは、 設定した値から-1まで数えそしてオーバフローする。 Pentium 4とIntel Xeon プロセッサは9つのペアの18個の性能カウンタを持つ。 各ペアはイベントのサブセットとESCRに関連付けられている。カウンタのペアは 下記の4つのグループに分類される。 1) BPUグループ MSR_BPU_COUNTER0/MSR_BPU_COUNTER1 MSR_BPU_COUNTER2/MSR_BPU_COUNTER3 2) MS グループ MSR_MS_COUNTER0/MSR_MS_COUNTER1 MSR_MS_COUNTER2/MSR_MS_COUNTER3 3) FLAME グループ MSR_FLAME_COUNTER0/MSR_FLAME_COUNTER1 MSR_FLAME_COUNTER2/MSR_FLAME_COUNTER3 4) IQ グループ MSR_IQ_COUNTER0/MSR_IQ_COUNTER1 MSR_IQ_COUNTER2/MSR_IQ_COUNTER3 MSR_IQ_COUNTER4/MSR_IQ_COUNTER5 MSR_IQ_COUNTER4カウンタはPEBS (Precise event-based sampling)のサポートに 利用される。 3 計測方法 3.1 Non-retirement events 3.2 At-retirement events 3.3 Precise Event Based Sampling (PEBS)