PAPI

PAPI (Performance API) を学科の課題で使ったときのメモ。

この辺を読むと大体わかる。

papi_availコマンドで、カウントできるイベントを一覧できる。(csc(学科の計算サーバ)ではなんとFLOPSのカウントができなかった…)

PAPIには High Level API と Low Level API があり、High Level API の方が簡単に使えるが、Low Level API でないとカウントできないイベントがある。
Low Level API を使うとこんな感じになる。(trial and error でやったので間違いがあるかも)

#include <stdio.h>
#include <papi.h>

int main(){
    int EventSet;
    long long v[2][3];

    PAPI_library_init(PAPI_VER_CURRENT);
    EventSet = PAPI_NULL;
    PAPI_create_eventset(&EventSet);
    PAPI_add_event(EventSet, PAPI_TOT_INS);
    PAPI_add_event(EventSet, PAPI_L1_TCM);
    PAPI_add_event(EventSet, PAPI_L2_TCM);
    PAPI_start(EventSet);
    PAPI_read(EventSet, v[0]);

    // some calculation

    PAPI_read(EventSet, v[1]);
    printf("instructions: %lld\n", v[1][0]-v[0][0]);
    printf("L1 cache misses: %lld\n", v[1][1]-v[0][1]);
    printf("L2 cache misses: %lld\n", v[1][2]-v[0][2]);
}

このコードでは、命令数、L1キャッシュミス数、L2キャッシュミス数を同時にカウントしているが、L3キャッシュミス数も同時にカウントしようとしたらできなかった。同時にカウントできるイベントの数あるいは組み合わせに限りがあるらしい。