トップ 新規 編集 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

パフォーマンスモニタリングツール

[ソフトウェア,プログラミング]

PAPI

PAPI (Performance API) は,CPUのパフォーマンスカウンタを読むAPIです.これを使うことによってキャッシュミス回数や,実行された命令数などを知ることができます.

注) 現段階では,PAPIはIntel Core i7 (Nehalemコア) が搭載されているマシンでは動作しません ('09/7/7).

PAPI 3.7においてIntel Core i7 (Nehalemコア) が搭載されているマシンでの動作をサポートしたようです(未確認) ('09/10/1).

openSUSE 11.1上でPAPIをインストールする場合

次の環境を想定しています (phenom[1,3,4]).

  • openSUSE 11.1 (x86_64)
  • Linuxカーネル ヴァージョン2.6.27.7-9

の上で

  • PerfCtr 2.6.37
  • PAPI 3.6.1

をインストールする.

Linuxカーネルソースが /usr/src/linux-2.6.27.7-9/ に展開されているものとします.

PerfCtrをインストールする

PAPIをインストールする前に,PerfCtrをLinuxカーネルに組み込む必要があります.

PerfCtr 2.6.37を /usr/src/ 内にunzipしておきます.PerfCtrのソースファイルは,Mikael Pettersson さんのホームページからダウンロードできます.

# cd /usr/src/
# wget http://user.it.uu.se/~mikpe/linux/perfctr/2.6/perfctr-2.6.37.tar.gz
# tar xvzf perfctr-2.6.37.tar.gz

Linuxカーネルソースにドライバファイルをコピーします.

# mkdir /usr/src/linux-2.6.27.7-9/drivers/perfctr/
# cp /usr/src/perfctr-2.6.37/linux/drivers/perfctr/* /usr/src/linux-2.6.27.7-9/drivers/perfctr/

Linux カーネルソースにincludeのファイルをコピーします.

# mkdir /usr/src/linux-2.6.27.7-9/include/asm-i386/
# cp /usr/src/perfctr-2.6.37/linux/include/asm-i386/* /usr/src/linux-2.6.27.7-9/include/asm-i386/
# mkdir /usr/src/linux-2.6.27.7-9/include/asm-x86_64/
# cp /usr/src/perfctr-2.6.37/linux/include/asm-x86_64/* /usr/src/linux-2.6.27.7-9/include/asm-x86_64/
# cp /usr/src/perfctr-2.6.37/linux/include/linux/* /usr/src/linux-2.6.27.7-9/include/linux/
# mkdir /usr/src/linux-2.6.27.7-9/include/asm-powerpc/
# cp /usr/src/perfctr-2.6.37/linux/include/asm-powerpc/* /usr/src/linux-2.6.27.7-9/include/asm-powerpc/
# mkdir /usr/src/linux-2.6.27.7-9/include/asm-ppc/
# cp /usr/src/perfctr-2.6.37/linux/include/asm-ppc/* /usr/src/linux-2.6.27.7-9/include/asm-ppc/
# cp /usr/src/perfctr-2.6.37/linux/include/asm-x86/* /usr/src/linux-2.6.27.7-9/include/asm-x86/

デバイスファイルを作ります.

# mknod /dev/perfctr c 10 182
# chmod 644 /dev/perfctr
# cd /usr/src/linux-2.6.27.7-9/
# make mrproper

Linuxカーネルソースにパッチを当てます.

# cd /usr/src/linux-2.6.27.7-9/
# /usr/src/perfctr-2.6.37/update-kernel --test --patch=2.6.27
# /usr/src/perfctr-2.6.37/update-kernel --patch=2.6.27

configファイルを設定します.

# cp /boot/config-`uname -r` .config
# make menuconfig
Processor type and features -> Performance-monitoring counters support [*]

Linuxカーネルソースをリビルドします.結構時間がかかるので,たとえば make -j 4 として4並列で行います.4並列とした理由は,AMD Phenom X4がクアッドコアだからです.

# make -j 4
# make modules_install
# make install

menu.lst ファイルを変更し,再起動します.

# vi /boot/grub/menu.lst
- default ?
+ default 0
# reboot

/dev/perfctr のパーミッションがおかしい場合があるので以下のコマンドを実行します.

# chmod 644 /dev/perfctr

これは,再起動するごとに変わってしまうので,上記コマンドを /etc/init.d/boot.local ファイルの末尾の exit 0 の前に書いておけば大丈夫です.

# vi /etc/init.d/boot.local
+ mknod /dev/perfctr c 10 182
+ chmod 644 /dev/perfctr

これでPerfCtrは組み込まれたはずです.再起動後に perfex コマンドで確認します.

$ perfex -i
PerfCtr Info:
abi_version             0x05020501
driver_version          2.6.39 DEBUG
cpu_type                19 (AMD Family 10h)
cpu_features            0x7 (rdpmc,rdtsc,pcint)
cpu_khz                 2504895
tsc_to_cpu_mult         1
cpu_nrctrs              4
cpus                    [0,1,2,3], total: 4
cpus_forbidden          [], total: 0

PAPIをインストールする

PerfCtrの組み込みが完了したら,PAPIをインストールします.

PAPI 3.6.2を /usr/src/ 内にunzipしておきます.PAPIのソースファイルは,PAPI のホームページからダウンロードできます.

# cd /usr/src/
# wget http://icl.cs.utk.edu/projects/papi/downloads/papi-3.6.2.tar.gz
# tar zxvf papi-3.6.2.tar.gz

PAPIを組み込みます.

# cd /usr/src/papi-3.6.2/src/
# ./configure
# make

PAPIのテストをします.

# make test
# make fulltest

テストが完了し,できそうであれば,PAPIをインストールします.

# make install-all

これでPAPIがインストールされました.

つかいかた

gccを使ってCでPAPIを使います.

ためしに以下のプログラムを作ります.ファイル名は testpapi.c(11) です.

このプログラムは,L1キャッシュミス回数,L2キャッシュミス回数,L3キャッシュミス回数を表示します.

testpapi.c をコンパイルして testpapi というバイナリを出力したい場合

$ gcc -o testpapi testpapi.c /usr/local/lib/libpapi.a

と打ちます.

phenom3上でコンパイルし,実行すると結果はたとえばこのようになります.

$ cc -o testpapi testpapi.c /usr/local/lib/libpapi.a -O2
$ ./testpapi
Number Of Calculations: 4194304, Stride: 128

PAPI_L1_TCM: 4194407
PAPI_L2_TCM: 4195682
PAPI_L3_TCM: 108410
Data: ?

PAPIはphenom[1,3,4]に導入されています.気になった方はご活用ください.講座NISアカウント (yuba.is.uec.ac.jp) でsshログインできます.

またCPUの種類によってとれるカウンタの種類が異なります.上記の例はAMD Phenom X4の場合です.

$ papi_avail

とするとカウンタの種類の一覧が出力されます.AvailがYesになっているがとれるカウンタです.

Fortranでもつかえるようです.

pfmon

pfmonもPAPI同様にパフォーマンスカウンタを読むことができます.PAPIよりもできることが多そうです.

pfmonであれば,Nehalemマイクロアーキテクチャ上でも動作します.

ubuntu 8.04上でpfmonをインストールする場合

次の環境を想定しています (k018).

  • ubuntu 8.04 (x86_64)
  • Linuxカーネル ヴァージョン2.6.29

  • perfmon
  • libpfm 3.9
  • pfmon 3.9

をインストールする.

Linuxカーネルソースの準備

まずLinuxカーネルのソースをThe Linux Kernel Archivesからダウンロードし,展開します.

$ cd /usr/src/
$ sudo wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.29.tar.gz
$ sudo tar xvzf linux-2.6.29.tar.gz

カーネルをビルドするのに必要なパッケージなどをインストールします.

$ sudo apt-get install -y build-essential fakeroot kernel-package libelf-dev ncurses-dev

perfmonをインストールする

perfmonのソースファイルをダウンロードし,展開します.

$ sudo wget http://downloads.sourceforge.net/sourceforge/perfmon2/perfmon-new-base-090622.tar.gz
$ sudo tar xvzf perfmon-new-base-090622.tar.gz

Linuxカーネルソース展開先のフォルダに移動し,Linuxカーネルソースにperfmonのパッチを組み込みます.

$ cd /usr/src/linux-2.6.29/
$ sudo cat ../perfmon-new-base-090622/*.diff | sudo patch -p1

configファイルを設定します.

$ sudo cp /boot/config-`uname -r` .config
$ sudo make oldconfig

Perfmon2 performance monitoring interface (PERFMON) [N/y/?] (NEW) y
  Perfmon debugging (PERFMON_DEBUG) [N/y/?] (NEW) y
  Enable perfmon statistics reporting via debugfs (PERFMON_DEBUG_FS) [Y/n/?] (NEW) y
  Support for Intel P6/Pentium M processor hardware performance counters (X86_PERFMON_P6) [N/m/y/?] (NEW)
  Support for Intel Pentium 4/Xeon hardware performance counters (X86_PERFMON_P4) [N/m/y/?] (NEW) 
    Support for Intel Netburst Precise Event-Based Sampling (PEBS) (X86_PERFMON_PEBS_P4) [N/m/y/?] (NEW) 
  Support for Intel Core-based performance counters (X86_PERFMON_CORE) [N/m/y/?] (NEW)
    Support for Intel Core Precise Event-Based Sampling (PEBS) (X86_PERFMON_PEBS_CORE) [N/m/y/?] (NEW)
  Support for Intel Atom processor (X86_PERFMON_INTEL_ATOM) [N/m/y/?] (NEW)
  Support for Intel Nehalem processor (X86_PERFMON_INTEL_NHM) [N/m/y/?] (NEW) y
  Support for Intel architectural perfmon v1/v2/v3 (X86_PERFMON_INTEL_ARCH) [N/m/y/?] (NEW)
  Support AMD Athlon64/Opteron64 hardware performance counters (X86_PERFMON_AMD64) [N/m/y/?] (NEW)

(適したものを選択してください.Intel Core i7なのでNehalemのところでyを押します.その他は全部Enterを押してください)
(make menuconfigを使ってもいいです)

Linuxカーネルソースをリビルドし,再起動します.

$ sudo fakeroot make-kpkg clean
$ sudo CONCURRENCY_LEVEL=4 fakeroot make-kpkg --append-to-version=-perfmon --initrd binary
$ sudo dpkg -i /usr/src/linux-image*.deb
$ sudo reboot

(CONCURRENCY_LEVEL=4とすると4並列で実行できます.)

libpfmをインストールする

libpfmのソースファイルをダウンロードし,展開します.

$ cd /usr/src/
$ sudo wget http://sourceforge.net/projects/perfmon2/files/libpfm/libpfm-3.9.tar.gz
$ sudo tar xvzf libpfm-3.9.tar.gz

libpfmをインストールします.

$ cd /usr/src/libpfm-3.9/
$ sudo make
$ sudo make install

pfmonをインストールする

pfmonのソースファイルをダウンロードし,展開します.

$ cd /usr/src/
$ sudo wget http://sourceforge.net/projects/perfmon2/files/pfmon/pfmon-3.9.tar.gz
$ sudo tar xvzf pfmon-3.9.tar.gz

pfmonをインストールします.

$ cd /usr/src/pfmon-3.9/
$ sudo make
$ sudo make install

さいごに再起動します.

$ sudo reboot

libpfm.so.3

$ pfmon -l
pfmon: error while loading shared libraries: libpfm.so.3: cannot open shared object file: No such file or directory

などと,libpfm.so.3が見つからないという旨のメッセージが出ることがあります.その場合は,

$ sudo vi /etc/ld.so.conf.d/perfmon.conf
+ /usr/local/lib
$ sudo /sbin/ldconfig

などとします.

つかいかた

gccを使ってCでpfmonを使います.

ためしに以下のプログラムを作ります.ファイル名は testpfm.c(33) です.

このプログラムは,実行された命令数を表示します(もっときれいな形の等価なプログラムに書き直せると思います).

testpfm.c をコンパイルして testpfm というバイナリを出力したい場合

$ gcc -o testpfm testpfm.c /usr/local/lib/libpfm.a

と打ちます.

k014上でコンパイルし,実行すると結果はたとえばこのようになります.

$ gcc -o testpfm testpfm.c /usr/local/lib/libpfm.a -O2
$ ./testpfm
testpfm
CPU0 PMD16 raw=9577 delta=9577 INSTRUCTIONS_RETIRED

pfmonはk[010-020]に導入されています.k[010-020]は近藤先生のマシンです.気になった方は近藤先生にその旨相談するとよいでしょう.

またCPUの種類によってとれるカウンタの種類が異なります.上記の例はIntel Core i7の場合です.

$ pfmon -l

とするとカウンタの種類の一覧が出力されます.

関連リンク

上記情報は不完全の可能性がありますので,下記リンクも参考にして作業を進めてください.

PAPI関連
pfmon関連
その他
testpapi.c[削除] testpfm.c[削除]

最終更新時間:2010年03月30日 20時15分17秒