技術情報

PAPI(Performance API)の導入と利用方法


株式会社HPCソリューションズ

2011年08月31日



1. PAPIとは!?


Performance APIはCPUに搭載されているCPUカウンタを使用し、キャッシュヒット率、ミス率、FLOPSなどを計測します。

これを利用することにより、CPUの利用率を知ることが出来ます。

PAPIの最新バージョンはhttps://icl.cs.utk.edu/papi/index.htmlからダウンロードしてください。



2. 動作環境


Kernelバージョンによって異なります。ここでは、Kernel2.6.30以上を対象とします。

PAPIのバージョンは4.1.3を使用しました。



3. 導入手順


導入手順は


./configure

make

make test

make fulltest

make install-all


となります。 なお、make fulltest の時、


cd ctests; make CC=”gcc” CC_R=”gcc -pthread” CFLAGS=”-I.. -g -DSTATIC_PAPI_EVENTS_TABLE -DPEINCLUDE=\”/usr/include/linux/perf_event.h\” -D_REENTRANT -D_GNU_SOURCE -DUSE_COMPILER_TLS -Wall -I/home/ohta/Program/PAPI/papi-4.1.3/src/libpfm-3.y/include -DSUBSTRATE_USES_LIBPFM -Wextra -DPAPI_NO_MEMORY_MANAGEMENT” TOPTFLAGS=”-O0″ SMPCFLGS=”” OMPCFLGS=”-fopenmp” NOOPT=”” LDFLAGS=” ” LDL=”-ldl” LIBRARY=”../libpapi.a” papi_api serial forkexec_tests overflow_tests profile_tests attach multiplex_and_pthreads shared

~中略~


Running Fortran Tests


Running ftests/fdmemtest:fdmemtest.F PASSED

Running ftests/cost:cost.F PASSED

Running ftests/description:description.F PASSED

Running ftests/clockres:clockres.F PASSED

Running ftests/second:second.F PASSED

Running ftests/first:first.F PASSED

Running ftests/zero:zero.F PASSED

Running ftests/fmatrixpapi:fmatrixpapi.F PASSED

Running ftests/fmatrixlowpapi:fmatrixlowpapi.F PASSED

Running ftests/strtest:strtest.F PASSED

Running ftests/case2:case2.F PASSED

Running ftests/case1:case1.F PASSED

Running ftests/tenth:tenth.F PASSED

Running ftests/fmultiplex1:fmultiplex1.F PASSED

Running ftests/johnmay2:johnmay2.F PASSED

Running ftests/avail:avail.F PASSED

Running ftests/fmatrixpapi2:fmatrixpapi2.F PASSED

Running ftests/eventname:eventname.F PASSED

Running ftests/flops:flops.F PASSED

Running ftests/highlevel:highlevel.F PASSED

Running ftests/fmultiplex2:fmultiplex2.F PASSED

Running ftests/accum:accum.F PASSED


と出ると成功です。

なお、PASSEDと出ないところもあります。

CPUIDに依存します。



4. 確認


コマンド、papi_availで確認が出来ます。


papi_avail


このコマンドではソースコードから呼ぶことが出来る関数が確認できます。


Available events and hardware information.

——————————————————————————–

PAPI Version : 4.1.3.0

Vendor string and code : GenuineIntel (1)

Model string and code : Intel(R) Xeon(R) CPU X3450 @ 2.67GHz (30)

CPU Revision : 5.000000

CPUID Info : Family: 6 Model: 30 Stepping: 5

CPU Megahertz : 1197.000000

CPU Clock Megahertz : 1197

Hdw Threads per core : 1

Cores per Socket : 4

NUMA Nodes : 1

CPU’s per Node : 4

Total CPU’s : 4

Number Hardware Counters : 16

Max Multiplex Counters : 512

——————————————————————————–

The following correspond to fields in the PAPI_event_info_t structure.


Name Code Avail Deriv Description (Note)

PAPI_L1_DCM 0x80000000 Yes No Level 1 data cache misses

PAPI_L1_ICM 0x80000001 Yes No Level 1 instruction cache misses

PAPI_L2_DCM 0x80000002 Yes Yes Level 2 data cache misses

PAPI_L2_ICM 0x80000003 Yes No Level 2 instruction cache misses


~中略~


PAPI_SP_OPS 0x80000067 Yes Yes Floating point operations; optimized to count scaled single precision vector operations

PAPI_DP_OPS 0x80000068 Yes Yes Floating point operations; optimized to count scaled double precision vector operations

PAPI_VEC_SP 0x80000069 Yes No Single precision vector/SIMD instructions

PAPI_VEC_DP 0x8000006a Yes No Double precision vector/SIMD instructions

————————————————————————-

Of 107 possible events, 63 are available, of which 17 are derived.


avail.c                  PASSED



ここでは、107個のイベントのうち、63個のイベントが利用できることが確認できます。

CPUIDに依存します。



5. 利用方法


簡単なFLOPSを求めるプログラムをFortran95を使用して紹介致します。

PAPIには2種類の関数(High Level関数とLow Level関数)があります。

このうち、High Level関数を使用して、FLOPSを求めることが出来ます。

PAPIf_flips関数をソースコードから呼び出して、FLOPSを求めてみます。



program papi_test
 include "f90papi.h"
 integer, parameter :: index=100
 real*4 matrixa(index,index)
 real*4 matrixb(index,index)
 real*4 mres(index,index)
 real*4 proc_time
 real*4 mflops
 real*4 real_time
 integer*8 flpins
 integer i,j,k,retval

 call PAPIf_library_init(retval)
  do i=1,index
    do j=1,index
     matrixa(i,j) = i+j
     matrixb(i,j) = j-i
     mres(i,j) = 0.0
    end do
  end do

 call PAPIf_flips( real_time, proc_time, flpins, mflops, retval )

  do i=1,index
    do j=1,index
      do k=1,index
        mres(i,j) = mres(i,j) + matrixa(i,k)*matrixb(k,j)
      end do
    end do
  end do

 call PAPIf_flips( real_time, proc_time, flpins, mflops, retval)

  print *, 'Real_time: ', real_time
  print *, ' Proc_time: ', proc_time
  print *, ' Total flpins: ', flpins
  print *, ' MFLOPS: ', mflops
 end program papi_test

FLOPSを求めたい個所にAPI、PAPIf_flips関数をはさむことにより、FLOPSを求めることが出来ます。

上記のプログラムを動かすと


[ohta@ml110g6 ~]$ ./papi-test

Real_time: 3.8600000E-04

Proc_time: 8.5215206E-04

Total flpins: 500116

MFLOPS: 586.8859

[ohta@ml110g6 ~]$


と言う結果を得ることが出来ます。



go top