サポート

技術情報

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

株式会社HPCソリューションズ
2011年08月31日
目次
  1. PAPIとは!?
  2. 動作環境
  3. 導入手順
  4. 確認
  5. 利用方法

  1. PAPIとは!?

Performance APIはCPUに搭載されているCPUカウンタを使用し、キャッシュヒット率、ミス率、FLOPSなどを計測します。
これを利用することにより、CPUの利用率を知ることが出来ます。
PAPIの最新バージョンはhttps://icl.cs.utk.edu/papi/index.htmlからダウンロードしてください。

  1. 動作環境

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

  1. 導入手順

導入手順は
./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に依存します。

  1. 確認

コマンド、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に依存します。


  1. 利用方法

簡単な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