-
Notifications
You must be signed in to change notification settings - Fork 1
/
PapiWrapper.h
90 lines (75 loc) · 1.93 KB
/
PapiWrapper.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <stdio.h>
#include <stdlib.h>
#include <papi.h>
#include <math.h>
#ifndef MEASURE_CACHE
#define MEASURE_CACHE 1
#endif
static const size_t EVENT_COUNT = 2;
#if MEASURE_CACHE
static int events[] = { PAPI_L1_TCM, PAPI_L2_TCM};
#else
static int events[] = { PAPI_TOT_INS, PAPI_FP_OPS };
#endif
static long long values[EVENT_COUNT];
__attribute__((always_inline))
static inline void papiSetup()
{
if (PAPI_VER_CURRENT != PAPI_library_init(PAPI_VER_CURRENT))
{
std::cerr << "PAPI_library_init error." << std::endl;
exit(1);
}
if (PAPI_OK != PAPI_query_event(PAPI_TOT_INS))
{
std::cerr << "Cannot count PAPI_TOT_INS." << std::endl;
exit(1);
}
if (PAPI_OK != PAPI_query_event(PAPI_FP_OPS))
{
std::cerr << "Cannot count PAPI_FP_OPS." << std::endl;
exit(1);
}
if (PAPI_OK != PAPI_query_event(PAPI_L1_TCM))
{
std::cerr << "Cannot count PAPI_L1_TCM." << std::endl;
exit(1);
}
if (PAPI_OK != PAPI_query_event(PAPI_L2_TCM))
{
std::cerr << "Cannot count PAPI_L2_TCM." << std::endl;
exit(1);
}
}
__attribute__((always_inline))
static inline void papiStart()
{
PAPI_start_counters(events, EVENT_COUNT);
if(PAPI_OK != PAPI_read_counters(values, EVENT_COUNT))
{
std::cerr << "Problem reading counters." << std::endl;
// exit(1);
}
}
__attribute__((always_inline))
static inline void papiFinish()
{
if(PAPI_OK != PAPI_read_counters(values, EVENT_COUNT))
{
std::cerr << "Problem reading counters." << std::endl;
// exit(1);
}
}
__attribute__((always_inline))
static inline void papiPrintResults()
{
const size_t EVENT_MAX = PAPI_num_counters();
printf("# Max counters = %zd\n", EVENT_MAX);
#if MEASURE_CACHE
printf("Number of L1 total cache misses = %lld\n",values[0]);
printf("Number of L2 total cache misses = %lld\n",values[1]);
#else
printf("Number of instructions = %lld\n",values[0]);
printf("Number of fp operations = %lld\n",values[1]);
#endif
}