perf stat でパフォーマンスカウンタの値を直接指定し表示
perfについて少し
最近のLinuxでは,perfという便利なパフォーマンス解析ツールが使えます.
aptやyumなどのパッケージ管理ツールで入れられると思いますが(Debian系だとlinux-tools*って名前のパッケージのはず),詳しい使い方はここでは解説しません.
さて,このperfには色々な使い方がありますが,中でもperf statはプログラム実行中に起こるハードウェア的なイベントを取得できるものです.
使用例はこんな感じ.
1 | $ perf stat ./a.out 100000 |
取得できるイベントの一覧は,perf listで表示できます.
1 | $ perf list |
例えば,L1データキャッシュのload回数とCPUのクロック数を見たい時には,
1 | $ perf stat -e L1-dcache-loads -e cpu-clock ./a.out 100000 |
という風にします.
パフォーマンスカウンタ
L1-dcache-loadsなどのイベントが実際に見ているのは, パフォーマンスカウンタ(ハードウェアカウンタ) というものです.
最近のCPUには,ハードウェアのイベント回数を記録するためのレジスタ(パフォーマンスモニタレジスタ)が備わっています.
このレジスタの値 = パフォーマンスカウンタを見るのが,perf statというツールだと言えます.
お使いのCPUが取得できるパフォーマンスカウンタの種類は,CPUベンダの発行しているCPUファミリーごとのマニュアルを見ると分かります.
例として,
- Intelの(Nehalemを含む)各種アーキテクチャのCPUのパフォーマンスカウンタは,
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3B: System Programming Guide, Part 2
のAppendix Aに載っています - AMDのFamily 10hに属するCPUのPerformanceCounterは,
BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 10h Processors
の “3.14 Performance Counter Events” に載っています.
そのイベントは何を見ている?
perf statのL1-dcache-loadsなどのイベントは,名前が直感的で,どのCPUを使っていても「このイベント指定しとけばL1データキャッシュアクセス見れるな」と分かって便利です.
しかし,研究用途などで使う際には,直接見たいパフォーマンスカウンタを,上述したCPUのマニュアルと照らし合わせながら見たいようなこともあります.
或いは,perf listの一覧では提供されていないけど,CPUのマニュアルには書いてあるハードウェアイベントを取得したいこともあるでしょう.
見たいハードウェアイベントを生で指定する
このような要望があるので,perf statは数値で直接見たいハードウェアイベントを選択できるようなオプションを備えています.
perf listでも表示される,
“rNNN [raw hardware event descriptor]”
というやつです.
CPUのマニュアルに記載されている, “UnitMask(Umask)” の値と “EventSelect(EventCode)” の値を使って,次のように指定します.
1 | $ perf stat -e r<UnitMask(16進数)><EventSelect(16進数)> ./a.out 100000 |
例えば,AMDのFamily 10hに属するCPUの “Data Cache Refills from the Northbridge” を “Modified” 属性以外のラインについて見たいなら,
BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 10h Processors の445ページを参考にして,
1 | $ perf stat -e rf43 ./a.out 100000 |
とします.
先頭の ‘f’ がUnitMaskで,その後の ‘43’ がEventSelectです.
“Data Cache Misses” も一緒に見たいなら,444ページも参考にして,
1 | $ perf stat -e rf43 -e r41 ./a.out 100000 |
ですね.
測定の基本
これでハードウェアカウンタを直接読むことができるようになりました.
しかし,「何を読むか」,「どう解釈するか」が分からなければ意味がありません.
AMDの発行している, Basic Performance Measurements for AMD Athlon 64, AMD Opteron and AMD Phenom Processors は,それを理解するのにとても役立ちます.
AMDの一部のプロセッサを対象とした計測手法が詳しく書かれていますが,基本的な考え方は他のプロセッサにも応用できると思います.是非ご一読を.
perf statの出力を分かりやすく
これはおまけです.
ハードウェアイベントを生で指定したら,perf statの出力が分かりづらくなりますね.
“2886 raw 0xf43”
とか言われても,CPUマニュアルとにらめっこしないと意味が分からないわけです.
そこで,出力を分かりやすくするための簡単なPythonスクリプトを作りましたので,良かったら改良しつつお使いください.
`events’ という辞書をリストにしたデータ構造を適当に変更してください.
適当な名前で保存して,
1 | $ chmod +x hoge.py |
と使います.
1 | #!/usr/bin/env python |